diff --git a/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java b/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java index 0ec0f60..62f8a61 100644 --- a/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java +++ b/src/main/java/com/redislabs/redistimeseries/MultiRangeParams.java @@ -54,10 +54,20 @@ public MultiRangeParams withLabels(boolean withLabels) { return this; } - public byte[][] getByteParams(long from, long to, String... filters) { + public byte[][] getByteParams(Long from, Long to, String... filters) { List params = new ArrayList<>(); - params.add(Protocol.toByteArray(from)); - params.add(Protocol.toByteArray(to)); + + if (from == null) { + params.add("-".getBytes()); + } else { + params.add(Protocol.toByteArray(from)); + } + + if (to == null) { + params.add("+".getBytes()); + } else { + params.add(Protocol.toByteArray(to)); + } if (filterByTimestamps != null) { params.add(Keyword.FILTER_BY_TS.getRaw()); diff --git a/src/main/java/com/redislabs/redistimeseries/RangeParams.java b/src/main/java/com/redislabs/redistimeseries/RangeParams.java index 0c353e1..ac9af79 100644 --- a/src/main/java/com/redislabs/redistimeseries/RangeParams.java +++ b/src/main/java/com/redislabs/redistimeseries/RangeParams.java @@ -40,11 +40,21 @@ public RangeParams aggregation(Aggregation aggregation, long timeBucket) { return this; } - public byte[][] getByteParams(String key, long from, long to) { + public byte[][] getByteParams(String key, Long from, Long to) { List params = new ArrayList<>(); params.add(SafeEncoder.encode(key)); - params.add(Protocol.toByteArray(from)); - params.add(Protocol.toByteArray(to)); + + if (from == null) { + params.add("-".getBytes()); + } else { + params.add(Protocol.toByteArray(from)); + } + + if (to == null) { + params.add("+".getBytes()); + } else { + params.add(Protocol.toByteArray(to)); + } if (filterByTimestamps != null) { params.add(Keyword.FILTER_BY_TS.getRaw()); diff --git a/src/main/java/com/redislabs/redistimeseries/RedisTimeSeries.java b/src/main/java/com/redislabs/redistimeseries/RedisTimeSeries.java index 4581176..7a06c70 100644 --- a/src/main/java/com/redislabs/redistimeseries/RedisTimeSeries.java +++ b/src/main/java/com/redislabs/redistimeseries/RedisTimeSeries.java @@ -692,12 +692,12 @@ public Value[] range( * TS.RANGE key fromTimestamp toTimestamp [COUNT count] [AGGREGATION aggregationType timeBucket] * * @param key - * @param from - * @param to + * @param from timestamp. {@code null} represents {@code "-"} + * @param to timestamp. {@code null} represents {@code "+"} * @param rangeParams * @return */ - public Value[] range(String key, long from, long to, RangeParams rangeParams) { + public Value[] range(String key, Long from, Long to, RangeParams rangeParams) { try (Jedis conn = getConnection()) { Object obj = sendCommand(conn, Command.RANGE, rangeParams.getByteParams(key, from, to)).getOne(); @@ -793,12 +793,12 @@ public Value[] revrange( * timeBucket] * * @param key - * @param from - * @param to + * @param from timestamp. {@code null} represents {@code "-"} + * @param to timestamp. {@code null} represents {@code "+"} * @param rangeParams * @return */ - public Value[] revrange(String key, long from, long to, RangeParams rangeParams) { + public Value[] revrange(String key, Long from, Long to, RangeParams rangeParams) { try (Jedis conn = getConnection()) { Object obj = sendCommand(conn, Command.REVRANGE, rangeParams.getByteParams(key, from, to)).getOne(); @@ -948,13 +948,13 @@ private Range[] multiRange( * TS.MRANGE fromTimestamp toTimestamp [COUNT count] [AGGREGATION aggregationType timeBucket] * [WITHLABELS] FILTER filter... * - * @param from - * @param to + * @param from timestamp. {@code null} represents {@code "-"} + * @param to timestamp. {@code null} represents {@code "+"} * @param multiRangeParams * @param filters * @return */ - public Range[] mrange(long from, long to, MultiRangeParams multiRangeParams, String... filters) { + public Range[] mrange(Long from, Long to, MultiRangeParams multiRangeParams, String... filters) { try (Jedis conn = getConnection()) { Object obj = sendCommand(conn, Command.MRANGE, multiRangeParams.getByteParams(from, to, filters)) @@ -1060,14 +1060,14 @@ public Range[] mrevrange( * TS.MREVRANGE fromTimestamp toTimestamp [COUNT count] [AGGREGATION aggregationType timeBucket] * [WITHLABELS] FILTER filter... * - * @param from - * @param to + * @param from timestamp. {@code null} represents {@code "-"} + * @param to timestamp. {@code null} represents {@code "+"} * @param multiRangeParams * @param filters * @return */ public Range[] mrevrange( - long from, long to, MultiRangeParams multiRangeParams, String... filters) { + Long from, Long to, MultiRangeParams multiRangeParams, String... filters) { try (Jedis conn = getConnection()) { Object obj = sendCommand(conn, Command.MREVRANGE, multiRangeParams.getByteParams(from, to, filters)) diff --git a/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java b/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java index 6f736de..d6920cc 100644 --- a/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java +++ b/src/test/java/com/redislabs/redistimeseries/RedisTimeSeriesTest.java @@ -142,6 +142,8 @@ public void testAdd() { labels.put("l1", "v1"); labels.put("l2", "v2"); Assert.assertTrue(client.create("seriesAdd", 10000L /*retentionTime*/, labels)); + assertArrayEquals( + new Value[0], client.range("seriesAdd", null, null, RangeParams.rangeParams())); Assert.assertEquals(1000L, client.add("seriesAdd", 1000L, 1.1, 10000, null)); Assert.assertEquals(2000L, client.add("seriesAdd", 2000L, 0.9, (Map) null)); @@ -161,6 +163,7 @@ public void testAdd() { values = client.range("seriesAdd", 800L, 5000L); Assert.assertEquals(4, values.length); Assert.assertArrayEquals(rawValues, values); + assertArrayEquals(rawValues, client.range("seriesAdd", null, null, RangeParams.rangeParams())); Value[] expectedCountValues = new Value[] {new Value(2000L, 1), new Value(3200L, 1), new Value(4500L, 1)}; @@ -194,6 +197,9 @@ public void testAdd() { Assert.assertEquals(1, values.length); Assert.assertArrayEquals(expectedOverallMaxValues, values); + // MRANGE + assertArrayEquals( + new Range[0], client.mrange(null, null, MultiRangeParams.multiRangeParams(), "l=v")); try { client.mrange(500L, 4600L, Aggregation.COUNT, 1); Assert.fail(); @@ -690,6 +696,8 @@ public void testRevRange() { labels.put("l1", "v1"); labels.put("l2", "v2"); Assert.assertTrue(client.create("seriesAdd", 10000L /*retentionTime*/, labels)); + assertArrayEquals( + new Value[0], client.revrange("seriesAdd", null, null, RangeParams.rangeParams())); Assert.assertEquals(1000L, client.add("seriesRevRange", 1000L, 1.1, 10000, null)); Assert.assertEquals( @@ -710,6 +718,8 @@ public void testRevRange() { values = client.revrange("seriesRevRange", 800L, 5000L); Assert.assertEquals(4, values.length); Assert.assertArrayEquals(rawValues, values); + assertArrayEquals( + rawValues, client.revrange("seriesRevRange", null, null, RangeParams.rangeParams())); Value[] expectedCountValues = new Value[] {new Value(4500L, 1), new Value(3200L, 1), new Value(2000L, 1)}; @@ -727,6 +737,8 @@ public void testRevRange() { @Test public void testMRevRange() { if (moduleVersion < 10300) return; + assertArrayEquals( + new Range[0], client.mrevrange(null, null, MultiRangeParams.multiRangeParams(), "l=v")); Map labels1 = new HashMap<>(); labels1.put("l3", "v3");