diff --git a/src/main/java/com/redislabs/redistimeseries/Keyword.java b/src/main/java/com/redislabs/redistimeseries/Keyword.java index ca4651c..754c0be 100644 --- a/src/main/java/com/redislabs/redistimeseries/Keyword.java +++ b/src/main/java/com/redislabs/redistimeseries/Keyword.java @@ -11,6 +11,7 @@ public enum Keyword implements ProtocolCommand { RETENTION, TIMESTAMP, WITHLABELS, + SELECTED_LABELS, COUNT, UNCOMPRESSED, CHUNK_SIZE, diff --git a/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java b/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java index ef9e6eb..02eddfd 100644 --- a/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java +++ b/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java @@ -16,6 +16,7 @@ public class MultiRangeParams { private long timeBucket; private boolean withLabels; + private String[] selectedLabels; private String[] groupByReduce; @@ -56,6 +57,12 @@ public MultiRangeParams withLabels(boolean withLabels) { return this; } + /** NOTE: SELECTED_LABELS and WITHLABELS are mutually exclusive. */ + public MultiRangeParams selectedLabels(String... labels) { + this.selectedLabels = labels; + return this; + } + public MultiRangeParams groupByReduce(String group, String reduce) { this.groupByReduce = new String[] {group, reduce}; return this; @@ -101,7 +108,12 @@ public byte[][] getByteParams(Long from, Long to, String... filters) { params.add(Protocol.toByteArray(timeBucket)); } - if (withLabels) { + if (selectedLabels != null) { + params.add(Keyword.SELECTED_LABELS.getRaw()); + for (String label : selectedLabels) { + params.add(SafeEncoder.encode(label)); + } + } else if (withLabels) { params.add(Keyword.WITHLABELS.getRaw()); } diff --git a/src/main/java/com/redislabs/redistimeseries/Range.java b/src/main/java/com/redislabs/redistimeseries/Range.java index 2a3c7be..fc9f664 100644 --- a/src/main/java/com/redislabs/redistimeseries/Range.java +++ b/src/main/java/com/redislabs/redistimeseries/Range.java @@ -43,8 +43,10 @@ protected static Value[] parseRange(List range) { private static Map getLabelsStringStringMap(List resLabels) { Map rangeLabels = new HashMap<>(resLabels.size()); for (Object resLabel : resLabels) { - List label = (List) resLabel; - rangeLabels.put(SafeEncoder.encode(label.get(0)), SafeEncoder.encode(label.get(1))); + List pair = (List) resLabel; + if (pair.get(0) != null && pair.get(1) != null) { + rangeLabels.put(SafeEncoder.encode(pair.get(0)), SafeEncoder.encode(pair.get(1))); + } } return rangeLabels; } diff --git a/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java b/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java index 8a71886..52b22a4 100644 --- a/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java +++ b/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java @@ -557,6 +557,48 @@ public void mrangeFilterBy() { assertArrayEquals(new Value[] {rawValues[0]}, range[0].getValues()); } + @Test + public void mrangeSelectedLabels() { + + client.create("ts1", convertMap("l1", "v1", "l2", "v2")); + client.create("ts2", convertMap("l1", "v1", "l3", "v3")); + + Value[] rawValues = + new Value[] { + new Value(1000L, 1.0), + new Value(2000L, 0.9), + new Value(3200L, 1.1), + new Value(4500L, -1.1) + }; + + client.add("ts1", rawValues[0].getTime(), rawValues[0].getValue()); + client.add("ts2", rawValues[1].getTime(), rawValues[1].getValue()); + client.add("ts2", rawValues[2].getTime(), rawValues[2].getValue()); + client.add("ts1", rawValues[3].getTime(), rawValues[3].getValue()); + + Range[] range = + client.mrange(0L, 5000L, MultiRangeParams.multiRangeParams().withLabels(), "l1=v1"); + assertEquals(2, range.length); + assertEquals("ts1", range[0].getKey()); + assertEquals(2, range[0].getLabels().size()); + assertEquals("ts2", range[1].getKey()); + assertEquals(2, range[1].getLabels().size()); + + range = + client.mrange( + 0L, 5000L, MultiRangeParams.multiRangeParams().selectedLabels("l1", "l2"), "l1=v1"); + assertEquals(2, range.length); + assertEquals("ts1", range[0].getKey()); + assertEquals(2, range[0].getLabels().size()); + assertEquals("ts2", range[1].getKey()); + assertEquals(1, range[1].getLabels().size()); + + range = + client.mrange(0L, 5000L, MultiRangeParams.multiRangeParams().selectedLabels("l3"), "l2=v2"); + assertEquals(1, range.length); + assertEquals(0, range[0].getLabels().size()); + } + @Test public void groupByReduce() { client.create("ts1", convertMap("metric", "cpu", "metric_name", "system"));