Skip to content

Commit f8e631c

Browse files
author
dengliming
authored
Add support for ZINTER command (#2469)
* Add support for ZINTER command * review
1 parent 8b45e8e commit f8e631c

16 files changed

+198
-4
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -916,14 +916,14 @@ public void zremrangeByScore(final byte[] key, final byte[] min, final byte[] ma
916916
}
917917

918918
public void zunion(final ZParams params, final byte[]... keys) {
919-
sendCommand(ZUNION, buildZunionByteParams(params, false, keys));
919+
sendCommand(ZUNION, buildByteZParams(params, false, keys));
920920
}
921921

922922
public void zunionWithScores(final ZParams params, final byte[]... keys) {
923-
sendCommand(ZUNION, buildZunionByteParams(params, true, keys));
923+
sendCommand(ZUNION, buildByteZParams(params, true, keys));
924924
}
925925

926-
private byte[][] buildZunionByteParams(final ZParams params, final boolean withScores, final byte[]... keys) {
926+
private byte[][] buildByteZParams(final ZParams params, final boolean withScores, final byte[]... keys) {
927927
final List<byte[]> args = new ArrayList<>();
928928
args.add(Protocol.toByteArray(keys.length));
929929
Collections.addAll(args, keys);
@@ -949,6 +949,14 @@ public void zunionstore(final byte[] dstkey, final ZParams params, final byte[].
949949
sendCommand(ZUNIONSTORE, args.toArray(new byte[args.size()][]));
950950
}
951951

952+
public void zinter(final ZParams params, final byte[]... keys) {
953+
sendCommand(ZINTER, buildByteZParams(params, false, keys));
954+
}
955+
956+
public void zinterWithScores(final ZParams params, final byte[]... keys) {
957+
sendCommand(ZINTER, buildByteZParams(params, true, keys));
958+
}
959+
952960
public void zinterstore(final byte[] dstkey, final byte[]... sets) {
953961
sendCommand(ZINTERSTORE, joinParameters(dstkey, Protocol.toByteArray(sets.length), sets));
954962
}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3140,6 +3140,34 @@ public Long zunionstore(final byte[] dstkey, final ZParams params, final byte[].
31403140
return client.getIntegerReply();
31413141
}
31423142

3143+
/**
3144+
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
3145+
* the resulting sorted set, it is returned to the client.
3146+
* @param params
3147+
* @param keys
3148+
* @return
3149+
*/
3150+
@Override
3151+
public Set<byte[]> zinter(final ZParams params, final byte[]... keys) {
3152+
checkIsInMultiOrPipeline();
3153+
client.zinter(params, keys);
3154+
return BuilderFactory.BYTE_ARRAY_ZSET.build(client.getBinaryMultiBulkReply());
3155+
}
3156+
3157+
/**
3158+
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
3159+
* the resulting sorted set, it is returned to the client.
3160+
* @param params
3161+
* @param keys
3162+
* @return
3163+
*/
3164+
@Override
3165+
public Set<Tuple> zinterWithScores(final ZParams params, final byte[]... keys) {
3166+
checkIsInMultiOrPipeline();
3167+
client.zinterWithScores(params, keys);
3168+
return BuilderFactory.TUPLE_ZSET.build(client.getBinaryMultiBulkReply());
3169+
}
3170+
31433171
/**
31443172
* Creates a union or intersection of N sorted sets given by keys k1 through kN, and stores it at
31453173
* dstkey. It is mandatory to provide the number of input keys N, before passing the input keys

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,6 +1960,26 @@ public Long execute(Jedis connection) {
19601960
}.runBinary(wholeKeys.length, wholeKeys);
19611961
}
19621962

1963+
@Override
1964+
public Set<byte[]> zinter(final ZParams params, final byte[]... keys) {
1965+
return new JedisClusterCommand<Set<byte[]>>(connectionHandler, maxAttempts) {
1966+
@Override
1967+
public Set<byte[]> execute(Jedis connection) {
1968+
return connection.zinter(params, keys);
1969+
}
1970+
}.runBinary(keys.length, keys);
1971+
}
1972+
1973+
@Override
1974+
public Set<Tuple> zinterWithScores(final ZParams params, final byte[]... keys) {
1975+
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
1976+
@Override
1977+
public Set<Tuple> execute(Jedis connection) {
1978+
return connection.zinterWithScores(params, keys);
1979+
}
1980+
}.runBinary(keys.length, keys);
1981+
}
1982+
19631983
@Override
19641984
public Long zinterstore(final byte[] dstkey, final byte[]... sets) {
19651985
byte[][] wholeKeys = KeyMergeUtil.merge(dstkey, sets);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,16 @@ public void zunionstore(final String dstkey, final ZParams params, final String.
802802
zunionstore(SafeEncoder.encode(dstkey), params, SafeEncoder.encodeMany(sets));
803803
}
804804

805+
@Override
806+
public void zinter(final ZParams params, final String... keys) {
807+
zinter(params, SafeEncoder.encodeMany(keys));
808+
}
809+
810+
@Override
811+
public void zinterWithScores(final ZParams params, final String... keys) {
812+
zinterWithScores(params, SafeEncoder.encodeMany(keys));
813+
}
814+
805815
@Override
806816
public void zinterstore(final String dstkey, final String... sets) {
807817
zinterstore(SafeEncoder.encode(dstkey), SafeEncoder.encodeMany(sets));

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2732,6 +2732,34 @@ public Long zunionstore(final String dstkey, final ZParams params, final String.
27322732
return client.getIntegerReply();
27332733
}
27342734

2735+
/**
2736+
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
2737+
* the resulting sorted set, it is returned to the client.
2738+
* @param params
2739+
* @param keys
2740+
* @return
2741+
*/
2742+
@Override
2743+
public Set<String> zinter(final ZParams params, final String... keys) {
2744+
checkIsInMultiOrPipeline();
2745+
client.zinter(params, keys);
2746+
return BuilderFactory.STRING_ZSET.build(client.getBinaryMultiBulkReply());
2747+
}
2748+
2749+
/**
2750+
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
2751+
* the resulting sorted set, it is returned to the client.
2752+
* @param params
2753+
* @param keys
2754+
* @return
2755+
*/
2756+
@Override
2757+
public Set<Tuple> zinterWithScores(final ZParams params, final String... keys) {
2758+
checkIsInMultiOrPipeline();
2759+
client.zinterWithScores(params, keys);
2760+
return getTupledSet();
2761+
}
2762+
27352763
/**
27362764
* Creates a union or intersection of N sorted sets given by keys k1 through kN, and stores it at
27372765
* dstkey. It is mandatory to provide the number of input keys N, before passing the input keys

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,6 +2028,26 @@ public Long execute(Jedis connection) {
20282028
}.run(wholeKeys.length, wholeKeys);
20292029
}
20302030

2031+
@Override
2032+
public Set<String> zinter(final ZParams params, final String... keys) {
2033+
return new JedisClusterCommand<Set<String>>(connectionHandler, maxAttempts) {
2034+
@Override
2035+
public Set<String> execute(Jedis connection) {
2036+
return connection.zinter(params, keys);
2037+
}
2038+
}.run(keys.length, keys);
2039+
}
2040+
2041+
@Override
2042+
public Set<Tuple> zinterWithScores(final ZParams params, final String... keys) {
2043+
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
2044+
@Override
2045+
public Set<Tuple> execute(Jedis connection) {
2046+
return connection.zinterWithScores(params, keys);
2047+
}
2048+
}.run(keys.length, keys);
2049+
}
2050+
20312051
@Override
20322052
public Long zinterstore(final String dstkey, final String... sets) {
20332053
String[] wholeKeys = KeyMergeUtil.merge(dstkey, sets);

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,30 @@ public Response<Long> zdiffStore(final String dstkey, final String... keys) {
374374
return getResponse(BuilderFactory.LONG);
375375
}
376376

377+
@Override
378+
public Response<Set<byte[]>> zinter(final ZParams params, final byte[]... keys) {
379+
client.zinter(params, keys);
380+
return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
381+
}
382+
383+
@Override
384+
public Response<Set<Tuple>> zinterWithScores(final ZParams params, final byte[]... keys) {
385+
client.zinterWithScores(params, keys);
386+
return getResponse(BuilderFactory.TUPLE_ZSET);
387+
}
388+
389+
@Override
390+
public Response<Set<String>> zinter(final ZParams params, final String... keys) {
391+
client.zinter(params, keys);
392+
return getResponse(BuilderFactory.STRING_ZSET);
393+
}
394+
395+
@Override
396+
public Response<Set<Tuple>> zinterWithScores(final ZParams params, final String... keys) {
397+
client.zinterWithScores(params, keys);
398+
return getResponse(BuilderFactory.TUPLE_ZSET);
399+
}
400+
377401
@Override
378402
public Response<Long> zinterstore(String dstkey, String... sets) {
379403
client.zinterstore(dstkey, sets);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ public static enum Command implements ProtocolCommand {
255255
ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZRANDMEMBER, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC,
256256
WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE,
257257
PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK,
258-
ZREMRANGEBYSCORE, ZUNION, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX,
258+
ZREMRANGEBYSCORE, ZUNION, ZUNIONSTORE, ZINTER, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX,
259259
ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG,
260260
STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT,
261261
BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, SENTINEL,

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,10 @@ default void setex(String key, int seconds, String value) {
334334

335335
void zunionstore(String dstkey, ZParams params, String... sets);
336336

337+
void zinter(ZParams params, String... keys);
338+
339+
void zinterWithScores(ZParams params, String... keys);
340+
337341
void zinterstore(String dstkey, String... sets);
338342

339343
void zinterstore(String dstkey, ZParams params, String... sets);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ public interface MultiKeyBinaryCommands {
7878

7979
Long zdiffStore(byte[] dstkey, byte[]... keys);
8080

81+
Set<byte[]> zinter(ZParams params, byte[]... keys);
82+
83+
Set<Tuple> zinterWithScores(ZParams params, byte[]... keys);
84+
8185
Long zinterstore(byte[] dstkey, byte[]... sets);
8286

8387
Long zinterstore(byte[] dstkey, ZParams params, byte[]... sets);

0 commit comments

Comments
 (0)