Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions src/main/java/redis/clients/jedis/BinaryClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -916,14 +916,14 @@ public void zremrangeByScore(final byte[] key, final byte[] min, final byte[] ma
}

public void zunion(final ZParams params, final byte[]... keys) {
sendCommand(ZUNION, buildZunionByteParams(params, false, keys));
sendCommand(ZUNION, buildByteZParams(params, false, keys));
}

public void zunionWithScores(final ZParams params, final byte[]... keys) {
sendCommand(ZUNION, buildZunionByteParams(params, true, keys));
sendCommand(ZUNION, buildByteZParams(params, true, keys));
}

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

public void zinter(final ZParams params, final byte[]... keys) {
sendCommand(ZINTER, buildByteZParams(params, false, keys));
}

public void zinterWithScores(final ZParams params, final byte[]... keys) {
sendCommand(ZINTER, buildByteZParams(params, true, keys));
}

public void zinterstore(final byte[] dstkey, final byte[]... sets) {
sendCommand(ZINTERSTORE, joinParameters(dstkey, Protocol.toByteArray(sets.length), sets));
}
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/redis/clients/jedis/BinaryJedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -3140,6 +3140,34 @@ public Long zunionstore(final byte[] dstkey, final ZParams params, final byte[].
return client.getIntegerReply();
}

/**
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
* the resulting sorted set, it is returned to the client.
* @param params
* @param keys
* @return
*/
@Override
public Set<byte[]> zinter(final ZParams params, final byte[]... keys) {
checkIsInMultiOrPipeline();
client.zinter(params, keys);
return BuilderFactory.BYTE_ARRAY_ZSET.build(client.getBinaryMultiBulkReply());
}

/**
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
* the resulting sorted set, it is returned to the client.
* @param params
* @param keys
* @return
*/
@Override
public Set<Tuple> zinterWithScores(final ZParams params, final byte[]... keys) {
checkIsInMultiOrPipeline();
client.zinterWithScores(params, keys);
return BuilderFactory.TUPLE_ZSET.build(client.getBinaryMultiBulkReply());
}

/**
* Creates a union or intersection of N sorted sets given by keys k1 through kN, and stores it at
* dstkey. It is mandatory to provide the number of input keys N, before passing the input keys
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/redis/clients/jedis/BinaryJedisCluster.java
Original file line number Diff line number Diff line change
Expand Up @@ -1960,6 +1960,26 @@ public Long execute(Jedis connection) {
}.runBinary(wholeKeys.length, wholeKeys);
}

@Override
public Set<byte[]> zinter(final ZParams params, final byte[]... keys) {
return new JedisClusterCommand<Set<byte[]>>(connectionHandler, maxAttempts) {
@Override
public Set<byte[]> execute(Jedis connection) {
return connection.zinter(params, keys);
}
}.runBinary(keys.length, keys);
}

@Override
public Set<Tuple> zinterWithScores(final ZParams params, final byte[]... keys) {
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
@Override
public Set<Tuple> execute(Jedis connection) {
return connection.zinterWithScores(params, keys);
}
}.runBinary(keys.length, keys);
}

@Override
public Long zinterstore(final byte[] dstkey, final byte[]... sets) {
byte[][] wholeKeys = KeyMergeUtil.merge(dstkey, sets);
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/redis/clients/jedis/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,16 @@ public void zunionstore(final String dstkey, final ZParams params, final String.
zunionstore(SafeEncoder.encode(dstkey), params, SafeEncoder.encodeMany(sets));
}

@Override
public void zinter(final ZParams params, final String... keys) {
zinter(params, SafeEncoder.encodeMany(keys));
}

@Override
public void zinterWithScores(final ZParams params, final String... keys) {
zinterWithScores(params, SafeEncoder.encodeMany(keys));
}

@Override
public void zinterstore(final String dstkey, final String... sets) {
zinterstore(SafeEncoder.encode(dstkey), SafeEncoder.encodeMany(sets));
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/redis/clients/jedis/Jedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -2732,6 +2732,34 @@ public Long zunionstore(final String dstkey, final ZParams params, final String.
return client.getIntegerReply();
}

/**
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
* the resulting sorted set, it is returned to the client.
* @param params
* @param keys
* @return
*/
@Override
public Set<String> zinter(final ZParams params, final String... keys) {
checkIsInMultiOrPipeline();
client.zinter(params, keys);
return BuilderFactory.STRING_ZSET.build(client.getBinaryMultiBulkReply());
}

/**
* Intersect multiple sorted sets, This command is similar to ZINTERSTORE, but instead of storing
* the resulting sorted set, it is returned to the client.
* @param params
* @param keys
* @return
*/
@Override
public Set<Tuple> zinterWithScores(final ZParams params, final String... keys) {
checkIsInMultiOrPipeline();
client.zinterWithScores(params, keys);
return getTupledSet();
}

/**
* Creates a union or intersection of N sorted sets given by keys k1 through kN, and stores it at
* dstkey. It is mandatory to provide the number of input keys N, before passing the input keys
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/redis/clients/jedis/JedisCluster.java
Original file line number Diff line number Diff line change
Expand Up @@ -2028,6 +2028,26 @@ public Long execute(Jedis connection) {
}.run(wholeKeys.length, wholeKeys);
}

@Override
public Set<String> zinter(final ZParams params, final String... keys) {
return new JedisClusterCommand<Set<String>>(connectionHandler, maxAttempts) {
@Override
public Set<String> execute(Jedis connection) {
return connection.zinter(params, keys);
}
}.run(keys.length, keys);
}

@Override
public Set<Tuple> zinterWithScores(final ZParams params, final String... keys) {
return new JedisClusterCommand<Set<Tuple>>(connectionHandler, maxAttempts) {
@Override
public Set<Tuple> execute(Jedis connection) {
return connection.zinterWithScores(params, keys);
}
}.run(keys.length, keys);
}

@Override
public Long zinterstore(final String dstkey, final String... sets) {
String[] wholeKeys = KeyMergeUtil.merge(dstkey, sets);
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,30 @@ public Response<Long> zdiffStore(final String dstkey, final String... keys) {
return getResponse(BuilderFactory.LONG);
}

@Override
public Response<Set<byte[]>> zinter(final ZParams params, final byte[]... keys) {
client.zinter(params, keys);
return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
}

@Override
public Response<Set<Tuple>> zinterWithScores(final ZParams params, final byte[]... keys) {
client.zinterWithScores(params, keys);
return getResponse(BuilderFactory.TUPLE_ZSET);
}

@Override
public Response<Set<String>> zinter(final ZParams params, final String... keys) {
client.zinter(params, keys);
return getResponse(BuilderFactory.STRING_ZSET);
}

@Override
public Response<Set<Tuple>> zinterWithScores(final ZParams params, final String... keys) {
client.zinterWithScores(params, keys);
return getResponse(BuilderFactory.TUPLE_ZSET);
}

@Override
public Response<Long> zinterstore(String dstkey, String... sets) {
client.zinterstore(dstkey, sets);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/redis/clients/jedis/Protocol.java
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ public static enum Command implements ProtocolCommand {
ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZRANDMEMBER, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC,
WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE,
PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK,
ZREMRANGEBYSCORE, ZUNION, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX,
ZREMRANGEBYSCORE, ZUNION, ZUNIONSTORE, ZINTER, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX,
ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG,
STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT,
BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, SENTINEL,
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/redis/clients/jedis/commands/Commands.java
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,10 @@ default void setex(String key, int seconds, String value) {

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

void zinter(ZParams params, String... keys);

void zinterWithScores(ZParams params, String... keys);

void zinterstore(String dstkey, String... sets);

void zinterstore(String dstkey, ZParams params, String... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ public interface MultiKeyBinaryCommands {

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

Set<byte[]> zinter(ZParams params, byte[]... keys);

Set<Tuple> zinterWithScores(ZParams params, byte[]... keys);

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

Long zinterstore(byte[] dstkey, ZParams params, byte[]... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ public interface MultiKeyBinaryJedisClusterCommands {

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

Set<byte[]> zinter(ZParams params, byte[]... keys);

Set<Tuple> zinterWithScores(ZParams params, byte[]... keys);

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

Long zinterstore(byte[] dstkey, ZParams params, byte[]... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ public interface MultiKeyBinaryRedisPipeline {

Response<Long> zdiffStore(byte[] dstkey, byte[]... keys);

Response<Set<byte[]>> zinter(ZParams params, byte[]... keys);

Response<Set<Tuple>> zinterWithScores(ZParams params, byte[]... keys);

Response<Long> zinterstore(byte[] dstkey, byte[]... sets);

Response<Long> zinterstore(byte[] dstkey, ZParams params, byte[]... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ public interface MultiKeyCommands {

Long zinterstore(String dstkey, ZParams params, String... sets);

Set<String> zinter(ZParams params, String... keys);

Set<Tuple> zinterWithScores(ZParams params, String... keys);

Set<String> zunion(ZParams params, String... keys);

Set<Tuple> zunionWithScores(ZParams params, String... keys);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ public interface MultiKeyCommandsPipeline {

Response<Long> zdiffStore(String dstkey, String... keys);

Response<Set<String>> zinter(ZParams params, String... keys);

Response<Set<Tuple>> zinterWithScores(ZParams params, String... keys);

Response<Long> zinterstore(String dstkey, String... sets);

Response<Long> zinterstore(String dstkey, ZParams params, String... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ public interface MultiKeyJedisClusterCommands {

Long zdiffStore(String dstkey, String... keys);

Set<String> zinter(ZParams params, String... keys);

Set<Tuple> zinterWithScores(ZParams params, String... keys);

Long zinterstore(String dstkey, String... sets);

Long zinterstore(String dstkey, ZParams params, String... sets);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1298,6 +1298,34 @@ public void zunionstoreParams() {
assertEquals(bexpected, jedis.zrangeWithScores(SafeEncoder.encode("dst"), 0, 100));
}

@Test
public void zinter() {
jedis.zadd("foo", 1, "a");
jedis.zadd("foo", 2, "b");
jedis.zadd("bar", 2, "a");

ZParams params = new ZParams();
params.weights(2, 2.5);
params.aggregate(ZParams.Aggregate.SUM);
assertEquals(Collections.singleton("a"), jedis.zinter(params, "foo", "bar"));

assertEquals(Collections.singleton(new Tuple("a", new Double(7))),
jedis.zinterWithScores(params, "foo", "bar"));

// Binary
jedis.zadd(bfoo, 1, ba);
jedis.zadd(bfoo, 2, bb);
jedis.zadd(bbar, 2, ba);

ZParams bparams = new ZParams();
bparams.weights(2, 2.5);
bparams.aggregate(ZParams.Aggregate.SUM);
assertByteArraySetEquals(Collections.singleton(ba), jedis.zinter(params, bfoo, bbar));

assertEquals(Collections.singleton(new Tuple(ba, new Double(7))),
jedis.zinterWithScores(bparams, bfoo, bbar));
}

@Test
public void zinterstore() {
jedis.zadd("foo", 1, "a");
Expand Down