Skip to content

Commit b2c5acf

Browse files
Support Z[REV]RANK command with score option (#3364)
* Support z[rev]rank with score command fixes #3350 #3349 * Update src/main/java/redis/clients/jedis/BuilderFactory.java Co-authored-by: M Sazzadul Hoque <[email protected]> --------- Co-authored-by: M Sazzadul Hoque <[email protected]>
1 parent 8b60f29 commit b2c5acf

14 files changed

+255
-1
lines changed

src/main/java/redis/clients/jedis/BuilderFactory.java

+16
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,22 @@ public String toString() {
389389
}
390390
};
391391

392+
public static final Builder<KeyValue<Long, Double>> ZRANK_WITHSCORE_PAIR = new Builder<KeyValue<Long, Double>>() {
393+
@Override
394+
public KeyValue<Long, Double> build(Object data) {
395+
if (data == null) {
396+
return null;
397+
}
398+
List<Object> l = (List<Object>) data;
399+
return new KeyValue<>(LONG.build(l.get(0)), DOUBLE.build(l.get(1)));
400+
}
401+
402+
@Override
403+
public String toString() {
404+
return "KeyValue<Long, Double>";
405+
}
406+
};
407+
392408
public static final Builder<KeyValue<String, List<String>>> KEYED_STRING_LIST
393409
= new Builder<KeyValue<String, List<String>>>() {
394410
@Override

src/main/java/redis/clients/jedis/CommandObjects.java

+16
Original file line numberDiff line numberDiff line change
@@ -1380,6 +1380,14 @@ public final CommandObject<Long> zrevrank(String key, String member) {
13801380
return new CommandObject<>(commandArguments(ZREVRANK).key(key).add(member), BuilderFactory.LONG);
13811381
}
13821382

1383+
public final CommandObject<KeyValue<Long, Double>> zrankWithScore(String key, String member) {
1384+
return new CommandObject<>(commandArguments(ZRANK).key(key).add(member).add(WITHSCORE), BuilderFactory.ZRANK_WITHSCORE_PAIR);
1385+
}
1386+
1387+
public final CommandObject<KeyValue<Long, Double>> zrevrankWithScore(String key, String member) {
1388+
return new CommandObject<>(commandArguments(ZREVRANK).key(key).add(member).add(WITHSCORE), BuilderFactory.ZRANK_WITHSCORE_PAIR);
1389+
}
1390+
13831391
public final CommandObject<Long> zrank(byte[] key, byte[] member) {
13841392
return new CommandObject<>(commandArguments(ZRANK).key(key).add(member), BuilderFactory.LONG);
13851393
}
@@ -1388,6 +1396,14 @@ public final CommandObject<Long> zrevrank(byte[] key, byte[] member) {
13881396
return new CommandObject<>(commandArguments(ZREVRANK).key(key).add(member), BuilderFactory.LONG);
13891397
}
13901398

1399+
public final CommandObject<KeyValue<Long, Double>> zrankWithScore(byte[] key, byte[] member) {
1400+
return new CommandObject<>(commandArguments(ZRANK).key(key).add(member).add(WITHSCORE), BuilderFactory.ZRANK_WITHSCORE_PAIR);
1401+
}
1402+
1403+
public final CommandObject<KeyValue<Long, Double>> zrevrankWithScore(byte[] key, byte[] member) {
1404+
return new CommandObject<>(commandArguments(ZREVRANK).key(key).add(member).add(WITHSCORE), BuilderFactory.ZRANK_WITHSCORE_PAIR);
1405+
}
1406+
13911407
public final CommandObject<String> zrandmember(String key) {
13921408
return new CommandObject<>(commandArguments(ZRANDMEMBER).key(key), BuilderFactory.STRING);
13931409
}

src/main/java/redis/clients/jedis/Jedis.java

+52
Original file line numberDiff line numberDiff line change
@@ -2130,6 +2130,32 @@ public Long zrevrank(final byte[] key, final byte[] member) {
21302130
return connection.executeCommand(commandObjects.zrevrank(key, member));
21312131
}
21322132

2133+
/**
2134+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
2135+
* ordered from low to high.
2136+
* @param key the key
2137+
* @param member the member
2138+
* @return the KeyValue contains rank and score.
2139+
*/
2140+
@Override
2141+
public KeyValue<Long, Double> zrankWithScore(byte[] key, byte[] member) {
2142+
checkIsInMultiOrPipeline();
2143+
return connection.executeCommand(commandObjects.zrankWithScore(key, member));
2144+
}
2145+
2146+
/**
2147+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
2148+
* ordered from high to low.
2149+
* @param key the key
2150+
* @param member the member
2151+
* @return the KeyValue contains rank and score.
2152+
*/
2153+
@Override
2154+
public KeyValue<Long, Double> zrevrankWithScore(byte[] key, byte[] member) {
2155+
checkIsInMultiOrPipeline();
2156+
return connection.executeCommand(commandObjects.zrevrankWithScore(key, member));
2157+
}
2158+
21332159
@Override
21342160
public List<byte[]> zrevrange(final byte[] key, final long start, final long stop) {
21352161
checkIsInMultiOrPipeline();
@@ -6559,6 +6585,32 @@ public Long zrevrank(final String key, final String member) {
65596585
return connection.executeCommand(commandObjects.zrevrank(key, member));
65606586
}
65616587

6588+
/**
6589+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
6590+
* ordered from low to high.
6591+
* @param key the key
6592+
* @param member the member
6593+
* @return the KeyValue contains rank and score.
6594+
*/
6595+
@Override
6596+
public KeyValue<Long, Double> zrankWithScore(String key, String member) {
6597+
checkIsInMultiOrPipeline();
6598+
return connection.executeCommand(commandObjects.zrankWithScore(key, member));
6599+
}
6600+
6601+
/**
6602+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
6603+
* ordered from high to low.
6604+
* @param key the key
6605+
* @param member the member
6606+
* @return the KeyValue contains rank and score.
6607+
*/
6608+
@Override
6609+
public KeyValue<Long, Double> zrevrankWithScore(String key, String member) {
6610+
checkIsInMultiOrPipeline();
6611+
return connection.executeCommand(commandObjects.zrevrankWithScore(key, member));
6612+
}
6613+
65626614
@Override
65636615
public List<String> zrevrange(final String key, final long start, final long stop) {
65646616
checkIsInMultiOrPipeline();

src/main/java/redis/clients/jedis/MultiNodePipelineBase.java

+20
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,16 @@ public Response<Long> zrevrank(String key, String member) {
976976
return appendCommand(commandObjects.zrevrank(key, member));
977977
}
978978

979+
@Override
980+
public Response<KeyValue<Long, Double>> zrankWithScore(String key, String member) {
981+
return appendCommand(commandObjects.zrankWithScore(key, member));
982+
}
983+
984+
@Override
985+
public Response<KeyValue<Long, Double>> zrevrankWithScore(String key, String member) {
986+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
987+
}
988+
979989
@Override
980990
public Response<List<String>> zrange(String key, long start, long stop) {
981991
return appendCommand(commandObjects.zrange(key, start, stop));
@@ -2724,6 +2734,16 @@ public Response<Long> zrevrank(byte[] key, byte[] member) {
27242734
return appendCommand(commandObjects.zrevrank(key, member));
27252735
}
27262736

2737+
@Override
2738+
public Response<KeyValue<Long, Double>> zrankWithScore(byte[] key, byte[] member) {
2739+
return appendCommand(commandObjects.zrankWithScore(key, member));
2740+
}
2741+
2742+
@Override
2743+
public Response<KeyValue<Long, Double>> zrevrankWithScore(byte[] key, byte[] member) {
2744+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
2745+
}
2746+
27272747
@Override
27282748
public Response<List<byte[]>> zrange(byte[] key, long start, long stop) {
27292749
return appendCommand(commandObjects.zrange(key, start, stop));

src/main/java/redis/clients/jedis/Pipeline.java

+20
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,16 @@ public Response<Long> zrevrank(String key, String member) {
928928
return appendCommand(commandObjects.zrevrank(key, member));
929929
}
930930

931+
@Override
932+
public Response<KeyValue<Long, Double>> zrankWithScore(String key, String member) {
933+
return appendCommand(commandObjects.zrankWithScore(key, member));
934+
}
935+
936+
@Override
937+
public Response<KeyValue<Long, Double>> zrevrankWithScore(String key, String member) {
938+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
939+
}
940+
931941
@Override
932942
public Response<List<String>> zrange(String key, long start, long stop) {
933943
return appendCommand(commandObjects.zrange(key, start, stop));
@@ -2675,6 +2685,16 @@ public Response<Long> zrevrank(byte[] key, byte[] member) {
26752685
return appendCommand(commandObjects.zrevrank(key, member));
26762686
}
26772687

2688+
@Override
2689+
public Response<KeyValue<Long, Double>> zrankWithScore(byte[] key, byte[] member) {
2690+
return appendCommand(commandObjects.zrankWithScore(key, member));
2691+
}
2692+
2693+
@Override
2694+
public Response<KeyValue<Long, Double>> zrevrankWithScore(byte[] key, byte[] member) {
2695+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
2696+
}
2697+
26782698
@Override
26792699
public Response<List<byte[]>> zrange(byte[] key, long start, long stop) {
26802700
return appendCommand(commandObjects.zrange(key, start, stop));

src/main/java/redis/clients/jedis/Protocol.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public byte[] getRaw() {
253253

254254
public static enum Keyword implements Rawable {
255255

256-
AGGREGATE, ALPHA, BY, GET, LIMIT, NO, NOSORT, ONE, SET, STORE, WEIGHTS, WITHSCORES, RESETSTAT,
256+
AGGREGATE, ALPHA, BY, GET, LIMIT, NO, NOSORT, ONE, SET, STORE, WEIGHTS, WITHSCORE, WITHSCORES, RESETSTAT,
257257
REWRITE, RESET, FLUSH, EXISTS, LOAD, LEN, HELP, SCHEDULE, MATCH, COUNT, TYPE, KEYS, REFCOUNT,
258258
ENCODING, IDLETIME, FREQ, REPLACE, GETNAME, SETNAME, SETINFO, LIST, ID, KILL, PAUSE, UNPAUSE, UNBLOCK,
259259
STREAMS, CREATE, MKSTREAM, SETID, DESTROY, DELCONSUMER, MAXLEN, GROUP, IDLE, TIME, BLOCK, NOACK,

src/main/java/redis/clients/jedis/TransactionBase.java

+20
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,16 @@ public Response<Long> zrevrank(String key, String member) {
10251025
return appendCommand(commandObjects.zrevrank(key, member));
10261026
}
10271027

1028+
@Override
1029+
public Response<KeyValue<Long, Double>> zrankWithScore(String key, String member) {
1030+
return appendCommand(commandObjects.zrankWithScore(key, member));
1031+
}
1032+
1033+
@Override
1034+
public Response<KeyValue<Long, Double>> zrevrankWithScore(String key, String member) {
1035+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
1036+
}
1037+
10281038
@Override
10291039
public Response<List<String>> zrange(String key, long start, long stop) {
10301040
return appendCommand(commandObjects.zrange(key, start, stop));
@@ -2774,6 +2784,16 @@ public Response<Long> zrevrank(byte[] key, byte[] member) {
27742784
return appendCommand(commandObjects.zrevrank(key, member));
27752785
}
27762786

2787+
@Override
2788+
public Response<KeyValue<Long, Double>> zrankWithScore(byte[] key, byte[] member) {
2789+
return appendCommand(commandObjects.zrankWithScore(key, member));
2790+
}
2791+
2792+
@Override
2793+
public Response<KeyValue<Long, Double>> zrevrankWithScore(byte[] key, byte[] member) {
2794+
return appendCommand(commandObjects.zrevrankWithScore(key, member));
2795+
}
2796+
27772797
@Override
27782798
public Response<List<byte[]>> zrange(byte[] key, long start, long stop) {
27792799
return appendCommand(commandObjects.zrange(key, start, stop));

src/main/java/redis/clients/jedis/UnifiedJedis.java

+20
Original file line numberDiff line numberDiff line change
@@ -1789,6 +1789,16 @@ public Long zrevrank(String key, String member) {
17891789
return executeCommand(commandObjects.zrevrank(key, member));
17901790
}
17911791

1792+
@Override
1793+
public KeyValue<Long, Double> zrankWithScore(String key, String member) {
1794+
return executeCommand(commandObjects.zrankWithScore(key, member));
1795+
}
1796+
1797+
@Override
1798+
public KeyValue<Long, Double> zrevrankWithScore(String key, String member) {
1799+
return executeCommand(commandObjects.zrevrankWithScore(key, member));
1800+
}
1801+
17921802
@Override
17931803
public long zrem(byte[] key, byte[]... members) {
17941804
return executeCommand(commandObjects.zrem(key, members));
@@ -1814,6 +1824,16 @@ public Long zrevrank(byte[] key, byte[] member) {
18141824
return executeCommand(commandObjects.zrevrank(key, member));
18151825
}
18161826

1827+
@Override
1828+
public KeyValue<Long, Double> zrankWithScore(byte[] key, byte[] member) {
1829+
return executeCommand(commandObjects.zrankWithScore(key, member));
1830+
}
1831+
1832+
@Override
1833+
public KeyValue<Long, Double> zrevrankWithScore(byte[] key, byte[] member) {
1834+
return executeCommand(commandObjects.zrevrankWithScore(key, member));
1835+
}
1836+
18171837
@Override
18181838
public String zrandmember(String key) {
18191839
return executeCommand(commandObjects.zrandmember(key));

src/main/java/redis/clients/jedis/commands/SortedSetBinaryCommands.java

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ public interface SortedSetBinaryCommands {
3232

3333
Long zrevrank(byte[] key, byte[] member);
3434

35+
KeyValue<Long, Double> zrankWithScore(byte[] key, byte[] member);
36+
37+
KeyValue<Long, Double> zrevrankWithScore(byte[] key, byte[] member);
38+
3539
List<byte[]> zrange(byte[] key, long start, long stop);
3640

3741
List<byte[]> zrevrange(byte[] key, long start, long stop);

src/main/java/redis/clients/jedis/commands/SortedSetCommands.java

+18
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,24 @@ public interface SortedSetCommands {
153153
*/
154154
Long zrevrank(String key, String member);
155155

156+
/**
157+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
158+
* ordered from low to high.
159+
* @param key the key
160+
* @param member the member
161+
* @return the KeyValue contains rank and score.
162+
*/
163+
KeyValue<Long, Double> zrankWithScore(String key, String member);
164+
165+
/**
166+
* Returns the rank and the score of member in the sorted set stored at key, with the scores
167+
* ordered from high to low.
168+
* @param key the key
169+
* @param member the member
170+
* @return the KeyValue contains rank and score.
171+
*/
172+
KeyValue<Long, Double> zrevrankWithScore(String key, String member);
173+
156174
/**
157175
* Returns the specified range of elements in the sorted set stored at key.
158176
* <p>

src/main/java/redis/clients/jedis/commands/SortedSetPipelineBinaryCommands.java

+4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ public interface SortedSetPipelineBinaryCommands {
3333

3434
Response<Long> zrevrank(byte[] key, byte[] member);
3535

36+
Response<KeyValue<Long, Double>> zrankWithScore(byte[] key, byte[] member);
37+
38+
Response<KeyValue<Long, Double>> zrevrankWithScore(byte[] key, byte[] member);
39+
3640
Response<List<byte[]>> zrange(byte[] key, long start, long stop);
3741

3842
Response<List<byte[]>> zrevrange(byte[] key, long start, long stop);

src/main/java/redis/clients/jedis/commands/SortedSetPipelineCommands.java

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ public interface SortedSetPipelineCommands {
3434

3535
Response<Long> zrevrank(String key, String member);
3636

37+
Response<KeyValue<Long, Double>> zrankWithScore(String key, String member);
38+
39+
Response<KeyValue<Long, Double>> zrevrankWithScore(String key, String member);
40+
3741
Response<List<String>> zrange(String key, long start, long stop);
3842

3943
Response<List<String>> zrevrange(String key, long start, long stop);

src/test/java/redis/clients/jedis/commands/jedis/SortedSetCommandsTest.java

+30
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,36 @@ public void zrank() {
402402
assertNull(jedis.zrank(bcar, bb));
403403
}
404404

405+
@Test
406+
public void zrankWithScore() {
407+
jedis.zadd("foo", 1d, "a");
408+
jedis.zadd("foo", 2d, "b");
409+
410+
KeyValue<Long, Double> keyValue = jedis.zrankWithScore("foo", "a");
411+
assertEquals(Long.valueOf(0), keyValue.getKey());
412+
assertEquals(Double.valueOf(1d), keyValue.getValue());
413+
414+
keyValue = jedis.zrankWithScore("foo", "b");
415+
assertEquals(Long.valueOf(1), keyValue.getKey());
416+
assertEquals(Double.valueOf(2d), keyValue.getValue());
417+
418+
assertNull(jedis.zrankWithScore("car", "b"));
419+
420+
// Binary
421+
jedis.zadd(bfoo, 1d, ba);
422+
jedis.zadd(bfoo, 2d, bb);
423+
424+
keyValue = jedis.zrankWithScore(bfoo, ba);
425+
assertEquals(Long.valueOf(0), keyValue.getKey());
426+
assertEquals(Double.valueOf(1d), keyValue.getValue());
427+
428+
keyValue = jedis.zrankWithScore(bfoo, bb);
429+
assertEquals(Long.valueOf(1), keyValue.getKey());
430+
assertEquals(Double.valueOf(2d), keyValue.getValue());
431+
432+
assertNull(jedis.zrankWithScore(bcar, bb));
433+
}
434+
405435
@Test
406436
public void zrevrank() {
407437
jedis.zadd("foo", 1d, "a");

src/test/java/redis/clients/jedis/commands/unified/SortedSetCommandsTestBase.java

+30
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,36 @@ public void zrank() {
459459
assertNull(jedis.zrank(bcar, bb));
460460
}
461461

462+
@Test
463+
public void zrankWithScore() {
464+
jedis.zadd("foo", 1d, "a");
465+
jedis.zadd("foo", 2d, "b");
466+
467+
KeyValue<Long, Double> keyValue = jedis.zrankWithScore("foo", "a");
468+
assertEquals(Long.valueOf(0), keyValue.getKey());
469+
assertEquals(Double.valueOf(1d), keyValue.getValue());
470+
471+
keyValue = jedis.zrankWithScore("foo", "b");
472+
assertEquals(Long.valueOf(1), keyValue.getKey());
473+
assertEquals(Double.valueOf(2d), keyValue.getValue());
474+
475+
assertNull(jedis.zrankWithScore("car", "b"));
476+
477+
// Binary
478+
jedis.zadd(bfoo, 1d, ba);
479+
jedis.zadd(bfoo, 2d, bb);
480+
481+
keyValue = jedis.zrankWithScore(bfoo, ba);
482+
assertEquals(Long.valueOf(0), keyValue.getKey());
483+
assertEquals(Double.valueOf(1d), keyValue.getValue());
484+
485+
keyValue = jedis.zrankWithScore(bfoo, bb);
486+
assertEquals(Long.valueOf(1), keyValue.getKey());
487+
assertEquals(Double.valueOf(2d), keyValue.getValue());
488+
489+
assertNull(jedis.zrankWithScore(bcar, bb));
490+
}
491+
462492
@Test
463493
public void zrevrank() {
464494
jedis.zadd("foo", 1d, "a");

0 commit comments

Comments
 (0)