From d48f5b5080b4a771ba4ba05fb2fee549a19c1201 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:39:41 +0600 Subject: [PATCH] XRANGE & XREVRANGE without COUNT option --- .../redis/clients/jedis/BinaryClient.java | 8 +++++++ .../java/redis/clients/jedis/BinaryJedis.java | 14 +++++++++++ .../clients/jedis/BinaryJedisCluster.java | 20 ++++++++++++++++ .../clients/jedis/BinaryShardedJedis.java | 12 ++++++++++ src/main/java/redis/clients/jedis/Client.java | 19 +++++++++++++++ src/main/java/redis/clients/jedis/Jedis.java | 15 ++++++++++++ .../redis/clients/jedis/JedisCluster.java | 22 +++++++++++++++++ .../redis/clients/jedis/PipelineBase.java | 24 +++++++++++++++++++ .../redis/clients/jedis/ShardedJedis.java | 12 ++++++++++ .../commands/BinaryJedisClusterCommands.java | 4 ++++ .../jedis/commands/BinaryJedisCommands.java | 4 ++++ .../jedis/commands/BinaryRedisPipeline.java | 4 ++++ .../clients/jedis/commands/Commands.java | 10 ++++++++ .../jedis/commands/JedisClusterCommands.java | 23 ++++++++++++++++-- .../clients/jedis/commands/JedisCommands.java | 24 +++++++++++++++++-- .../clients/jedis/commands/RedisPipeline.java | 4 ++++ .../tests/commands/StreamsCommandsTest.java | 9 +++++-- 17 files changed, 222 insertions(+), 6 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 8c6a2414b9..4a1d031201 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -1582,6 +1582,10 @@ public void xlen(final byte[] key) { sendCommand(XLEN, key); } + public void xrange(final byte[] key, final byte[] start, final byte[] end) { + sendCommand(XRANGE, key, start, end); + } + /** * @deprecated Use {@link #xrange(byte[], byte[], byte[], int)}. */ @@ -1594,6 +1598,10 @@ public void xrange(final byte[] key, final byte[] start, final byte[] end, final sendCommand(XRANGE, key, start, end, Keyword.COUNT.getRaw(), toByteArray(count)); } + public void xrevrange(final byte[] key, final byte[] end, final byte[] start) { + sendCommand(XREVRANGE, key, end, start); + } + public void xrevrange(final byte[] key, final byte[] end, final byte[] start, final int count) { sendCommand(XREVRANGE, key, end, start, Keyword.COUNT.getRaw(), toByteArray(count)); } diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 7295b273aa..59ea980486 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -4579,6 +4579,13 @@ public Long xlen(byte[] key) { return client.getIntegerReply(); } + @Override + public List xrange(byte[] key, byte[] start, byte[] end) { + checkIsInMultiOrPipeline(); + client.xrange(key, start, end); + return client.getBinaryMultiBulkReply(); + } + @Override public List xrange(byte[] key, byte[] start, byte[] end, int count) { checkIsInMultiOrPipeline(); @@ -4586,6 +4593,13 @@ public List xrange(byte[] key, byte[] start, byte[] end, int count) { return client.getBinaryMultiBulkReply(); } + @Override + public List xrevrange(byte[] key, byte[] end, byte[] start) { + checkIsInMultiOrPipeline(); + client.xrevrange(key, end, start); + return client.getBinaryMultiBulkReply(); + } + @Override public List xrevrange(byte[] key, byte[] end, byte[] start, int count) { checkIsInMultiOrPipeline(); diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index c3dd421a8e..1a2f399662 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -2406,6 +2406,16 @@ public Long execute(Jedis connection) { }.runBinary(key); } + @Override + public List xrange(final byte[] key, final byte[] start, final byte[] end) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public List execute(Jedis connection) { + return connection.xrange(key, start, end); + } + }.runBinary(key); + } + @Override public List xrange(final byte[] key, final byte[] start, final byte[] end, final long count) { @@ -2427,6 +2437,16 @@ public List execute(Jedis connection) { }.runBinary(key); } + @Override + public List xrevrange(final byte[] key, final byte[] end, final byte[] start) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public List execute(Jedis connection) { + return connection.xrevrange(key, end, start); + } + }.runBinary(key); + } + @Override public List xrevrange(final byte[] key, final byte[] end, final byte[] start, final int count) { diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index eb66336e32..46753b1e85 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -1139,12 +1139,24 @@ public Long xlen(byte[] key) { return j.xlen(key); } + @Override + public List xrange(byte[] key, byte[] start, byte[] end) { + Jedis j = getShard(key); + return j.xrange(key, start, end); + } + @Override public List xrange(byte[] key, byte[] start, byte[] end, int count) { Jedis j = getShard(key); return j.xrange(key, start, end, count); } + @Override + public List xrevrange(byte[] key, byte[] end, byte[] start) { + Jedis j = getShard(key); + return j.xrevrange(key, end, start); + } + @Override public List xrevrange(byte[] key, byte[] end, byte[] start, int count) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index a92b249215..4ec2215a8e 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -1366,6 +1366,19 @@ public void xlen(final String key) { xlen(SafeEncoder.encode(key)); } + @Override + public void xrange(final String key, final StreamEntryID start, final StreamEntryID end) { + xrange(SafeEncoder.encode(key), SafeEncoder.encode(start == null ? "-" : start.toString()), + SafeEncoder.encode(end == null ? "+" : end.toString())); + } + + @Override + public void xrange(final String key, final StreamEntryID start, final StreamEntryID end, + final int count) { + xrange(SafeEncoder.encode(key), SafeEncoder.encode(start == null ? "-" : start.toString()), + SafeEncoder.encode(end == null ? "+" : end.toString()), count); + } + @Override public void xrange(final String key, final StreamEntryID start, final StreamEntryID end, final long count) { @@ -1373,6 +1386,12 @@ public void xrange(final String key, final StreamEntryID start, final StreamEntr SafeEncoder.encode(end == null ? "+" : end.toString()), count); } + @Override + public void xrevrange(String key, StreamEntryID end, StreamEntryID start) { + xrevrange(SafeEncoder.encode(key), SafeEncoder.encode(end == null ? "+" : end.toString()), + SafeEncoder.encode(start == null ? "-" : start.toString())); + } + @Override public void xrevrange(String key, StreamEntryID end, StreamEntryID start, int count) { xrevrange(SafeEncoder.encode(key), SafeEncoder.encode(end == null ? "+" : end.toString()), diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index c124a588dd..1be6c8a45c 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -4079,6 +4079,13 @@ public Long xlen(final String key) { return client.getIntegerReply(); } + @Override + public List xrange(final String key, final StreamEntryID start, final StreamEntryID end) { + checkIsInMultiOrPipeline(); + client.xrange(key, start, end); + return BuilderFactory.STREAM_ENTRY_LIST.build(client.getObjectMultiBulkReply()); + } + /** * {@inheritDoc} */ @@ -4090,6 +4097,14 @@ public List xrange(final String key, final StreamEntryID start, return BuilderFactory.STREAM_ENTRY_LIST.build(client.getObjectMultiBulkReply()); } + @Override + public List xrevrange(final String key, final StreamEntryID end, + final StreamEntryID start) { + checkIsInMultiOrPipeline(); + client.xrevrange(key, end, start); + return BuilderFactory.STREAM_ENTRY_LIST.build(client.getObjectMultiBulkReply()); + } + /** * {@inheritDoc} */ diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 85ef8176d9..fffa9dd289 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -2497,6 +2497,17 @@ public Long execute(Jedis connection) { }.run(key); } + @Override + public List xrange(final String key, final StreamEntryID start, + final StreamEntryID end) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public List execute(Jedis connection) { + return connection.xrange(key, start, end); + } + }.run(key); + } + @Override public List xrange(final String key, final StreamEntryID start, final StreamEntryID end, final int count) { @@ -2508,6 +2519,17 @@ public List execute(Jedis connection) { }.run(key); } + @Override + public List xrevrange(final String key, final StreamEntryID end, + final StreamEntryID start) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public List execute(Jedis connection) { + return connection.xrevrange(key, end, start); + } + }.run(key); + } + @Override public List xrevrange(final String key, final StreamEntryID end, final StreamEntryID start, final int count) { diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index 382b5ac32b..9d3af6754a 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -2136,6 +2136,18 @@ public Response xlen(byte[] key) { return getResponse(BuilderFactory.LONG); } + @Override + public Response> xrange(String key, StreamEntryID start, StreamEntryID end) { + getClient(key).xrange(key, start, end); + return getResponse(BuilderFactory.STREAM_ENTRY_LIST); + } + + @Override + public Response> xrange(byte[] key, byte[] start, byte[] end) { + getClient(key).xrange(key, start, end); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); + } + @Override public Response> xrange(String key, StreamEntryID start, StreamEntryID end, int count) { @@ -2149,6 +2161,18 @@ public Response> xrange(byte[] key, byte[] start, byte[] end, int c return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } + @Override + public Response> xrevrange(String key, StreamEntryID end, StreamEntryID start) { + getClient(key).xrevrange(key, end, start); + return getResponse(BuilderFactory.STREAM_ENTRY_LIST); + } + + @Override + public Response> xrevrange(byte[] key, byte[] end, byte[] start) { + getClient(key).xrevrange(key, end, start); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); + } + @Override public Response> xrevrange(String key, StreamEntryID end, StreamEntryID start, int count) { diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index db242f6539..2c3fb2a073 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -1135,6 +1135,12 @@ public Long xlen(String key) { return j.xlen(key); } + @Override + public List xrange(String key, StreamEntryID start, StreamEntryID end) { + Jedis j = getShard(key); + return j.xrange(key, start, end); + } + @Override public List xrange(String key, StreamEntryID start, StreamEntryID end, int count) { Jedis j = getShard(key); @@ -1183,6 +1189,12 @@ public long xtrim(String key, long maxLen, boolean approximateLength) { return j.xtrim(key, maxLen, approximateLength); } + @Override + public List xrevrange(String key, StreamEntryID end, StreamEntryID start) { + Jedis j = getShard(key); + return j.xrevrange(key, end, start); + } + @Override public List xrevrange(String key, StreamEntryID end, StreamEntryID start, int count) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java index ae9c50aed4..3f222ddd72 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java @@ -387,6 +387,8 @@ List georadiusByMemberReadonly(byte[] key, byte[] member, dou Long xlen(byte[] key); + List xrange(byte[] key, byte[] start, byte[] end); + /** * @deprecated Use {@link #xrange(byte[], byte[], byte[], int)}. */ @@ -395,6 +397,8 @@ List georadiusByMemberReadonly(byte[] key, byte[] member, dou List xrange(byte[] key, byte[] start, byte[] end, int count); + List xrevrange(byte[] key, byte[] end, byte[] start); + List xrevrange(byte[] key, byte[] end, byte[] start, int count); Long xack(byte[] key, byte[] group, byte[]... ids); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java index c183413465..06fc0af9d5 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java @@ -415,6 +415,8 @@ List georadiusByMemberReadonly(byte[] key, byte[] member, dou Long xlen(byte[] key); + List xrange(byte[] key, byte[] start, byte[] end); + /** * @deprecated Use {@link #xrange(byte[], byte[], byte[], int)}. */ @@ -425,6 +427,8 @@ default List xrange(byte[] key, byte[] start, byte[] end, long count) { List xrange(byte[] key, byte[] start, byte[] end, int count); + List xrevrange(byte[] key, byte[] end, byte[] start); + List xrevrange(byte[] key, byte[] end, byte[] start, int count); Long xack(byte[] key, byte[] group, byte[]... ids); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java index 1bcdd7a10c..ae302720e4 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java @@ -385,8 +385,12 @@ Response> georadiusByMemberReadonly(byte[] key, byte[] m Response xlen(byte[] key); + Response> xrange(byte[] key, byte[] start, byte[] end); + Response> xrange(byte[] key, byte[] start, byte[] end, int count); + Response> xrevrange(byte[] key, byte[] end, byte[] start); + Response> xrevrange(byte[] key, byte[] end, byte[] start, int count); Response xack(byte[] key, byte[] group, byte[]... ids); diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index d93e18671c..b4268bb187 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -447,8 +447,18 @@ default void restoreReplace(String key, int ttl, byte[] serializedValue) { void xlen(String key); + void xrange(String key, StreamEntryID start, StreamEntryID end); + + void xrange(String key, StreamEntryID start, StreamEntryID end, int count); + + /** + * @deprecated Use {@link #xrange(java.lang.String, redis.clients.jedis.StreamEntryID, redis.clients.jedis.StreamEntryID, int)}. + */ + @Deprecated void xrange(String key, StreamEntryID start, StreamEntryID end, long count); + void xrevrange(String key, StreamEntryID end, StreamEntryID start); + void xrevrange(String key, StreamEntryID end, StreamEntryID start, int count); /** diff --git a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java index 18fe89c5b1..9da25a8db9 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java @@ -442,7 +442,17 @@ List georadiusByMemberReadonly(String key, String member, dou Long xlen(String key); /** - * XRANGE key start end [COUNT count] + * XRANGE key start end + * + * @param key + * @param start + * @param end + * @return + */ + List xrange(String key, StreamEntryID start, StreamEntryID end); + + /** + * XRANGE key start end COUNT count * * @param key * @param start @@ -453,7 +463,16 @@ List georadiusByMemberReadonly(String key, String member, dou List xrange(String key, StreamEntryID start, StreamEntryID end, int count); /** - * XREVRANGE key end start [COUNT ] + * XREVRANGE key end start + * @param key + * @param end + * @param start + * @return + */ + List xrevrange(String key, StreamEntryID end, StreamEntryID start); + + /** + * XREVRANGE key end start COUNT count * @param key * @param end * @param start diff --git a/src/main/java/redis/clients/jedis/commands/JedisCommands.java b/src/main/java/redis/clients/jedis/commands/JedisCommands.java index 86401500cd..07648a8f52 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisCommands.java @@ -455,7 +455,17 @@ List georadiusByMemberReadonly(String key, String member, dou Long xlen(String key); /** - * XRANGE key start end [COUNT count] + * XRANGE key start end + * + * @param key + * @param start minimum {@link StreamEntryID} for the retrieved range, passing null will indicate minimum ID possible in the stream + * @param end maximum {@link StreamEntryID} for the retrieved range, passing null will indicate maximum ID possible in the stream + * @return The entries with IDs matching the specified range. + */ + List xrange(String key, StreamEntryID start, StreamEntryID end); + + /** + * XRANGE key start end COUNT count * * @param key * @param start minimum {@link StreamEntryID} for the retrieved range, passing null will indicate minimum ID possible in the stream @@ -466,7 +476,17 @@ List georadiusByMemberReadonly(String key, String member, dou List xrange(String key, StreamEntryID start, StreamEntryID end, int count); /** - * XREVRANGE key end start [COUNT ] + * XREVRANGE key end start + * + * @param key + * @param start minimum {@link StreamEntryID} for the retrieved range, passing null will indicate minimum ID possible in the stream + * @param end maximum {@link StreamEntryID} for the retrieved range, passing null will indicate maximum ID possible in the stream + * @return the entries with IDs matching the specified range, from the higher ID to the lower ID matching. + */ + List xrevrange(String key, StreamEntryID end, StreamEntryID start); + + /** + * XREVRANGE key end start COUNT count * * @param key * @param start minimum {@link StreamEntryID} for the retrieved range, passing null will indicate minimum ID possible in the stream diff --git a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java index ffa85db0e0..8d4f59974a 100644 --- a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java @@ -382,8 +382,12 @@ Response> georadiusByMemberReadonly(String key, String m Response xlen(String key); + Response> xrange(String key, StreamEntryID start, StreamEntryID end); + Response> xrange(String key, StreamEntryID start, StreamEntryID end, int count); + Response> xrevrange(String key, StreamEntryID end, StreamEntryID start); + Response> xrevrange(String key, StreamEntryID end, StreamEntryID start, int count); Response xack(String key, String group, StreamEntryID... ids); diff --git a/src/test/java/redis/clients/jedis/tests/commands/StreamsCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/StreamsCommandsTest.java index 08dc324030..962a3e44ce 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/StreamsCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/StreamsCommandsTest.java @@ -135,9 +135,12 @@ public void xrange() { assertEquals(1, range6.size()); StreamEntryID id3 = jedis.xadd("xrange-stream", null, map); - List range7 = jedis.xrange("xrange-stream", id2, id2, 4); + List range7 = jedis.xrange("xrange-stream", id3, id3, 4); assertEquals(1, range7.size()); + List range8 = jedis.xrange("xrange-stream", null, null); + assertEquals(3, range8.size()); + // count parameter - backward compatibility List cRange = jedis.xrange("xrange-stream".getBytes(), id1.toString().getBytes(), id2.toString().getBytes(), 10L + Integer.MAX_VALUE); @@ -274,9 +277,11 @@ public void xrevrange() { assertEquals(1, range6.size()); StreamEntryID id3 = jedis.xadd("xrevrange-stream", null, map); - List range7 = jedis.xrevrange("xrevrange-stream", id2, id2, 4); + List range7 = jedis.xrevrange("xrevrange-stream", id3, id3, 4); assertEquals(1, range7.size()); + List range8 = jedis.xrevrange("xrevrange-stream", null, null); + assertEquals(3, range8.size()); } @Test