diff --git a/README.md b/README.md index fa315f4..a60b627 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,10 @@ Jedis is a blazingly small and sane redis java client. Jedis was conceived to be EASY to use and FULLY COMPATIBLE with the latest version of redis. -Jedis is a WORK IN PROGRESS. - ## What's still missing? - Sharding - Persistence control commands - Remote server control commands -- The ZUNIONSTORE, ZINTERSTORE commands But stay close because things are going fast and all this will be implemented soon! @@ -22,7 +19,7 @@ But stay close because things are going fast and all this will be implemented so - Commands operating on hashes - Commands operating on lists - Commands operating on sets -- Commands operating on sorted sets (not ZUNIONSTORE, ZINTERSTORE) +- Commands operating on sorted sets - Transactions - Pipelining - Publish/Subscribe diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 998843d..df36ed0 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -473,4 +473,42 @@ public class Client extends Connection { sendCommand("ZREMRANGEBYSCORE", key, String.valueOf(start), String .valueOf(end)); } -} + + public void zunionstore(String dstkey, String... sets) { + String[] params = new String[sets.length + 2]; + params[0] = dstkey; + params[1] = String.valueOf(sets.length); + System.arraycopy(sets, 0, params, 2, sets.length); + sendCommand("ZUNIONSTORE", params); + } + + public void zunionstore(String dstkey, ZParams params, String... sets) { + List args = new ArrayList(); + args.add(dstkey); + args.add(String.valueOf(sets.length)); + for (String set : sets) { + args.add(set); + } + args.addAll(params.getParams()); + sendCommand("ZUNIONSTORE", args.toArray(new String[args.size()])); + } + + public void zinterstore(String dstkey, String... sets) { + String[] params = new String[sets.length + 2]; + params[0] = dstkey; + params[1] = String.valueOf(sets.length); + System.arraycopy(sets, 0, params, 2, sets.length); + sendCommand("ZINTERSTORE", params); + } + + public void zinterstore(String dstkey, ZParams params, String... sets) { + List args = new ArrayList(); + args.add(dstkey); + args.add(String.valueOf(sets.length)); + for (String set : sets) { + args.add(set); + } + args.addAll(params.getParams()); + sendCommand("ZINTERSTORE", args.toArray(new String[args.size()])); + } +} \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index ecb05d2..38c4473 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -582,4 +582,24 @@ public class Jedis { client.zremrangeByScore(key, start, end); return client.getIntegerReply(); } + + public int zunionstore(String dstkey, String... sets) { + client.zunionstore(dstkey, sets); + return client.getIntegerReply(); + } + + public int zunionstore(String dstkey, ZParams params, String... sets) { + client.zunionstore(dstkey, params, sets); + return client.getIntegerReply(); + } + + public int zinterstore(String dstkey, String... sets) { + client.zinterstore(dstkey, sets); + return client.getIntegerReply(); + } + + public int zinterstore(String dstkey, ZParams params, String... sets) { + client.zinterstore(dstkey, params, sets); + return client.getIntegerReply(); + } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/ZParams.java b/src/main/java/redis/clients/jedis/ZParams.java new file mode 100644 index 0000000..86d9078 --- /dev/null +++ b/src/main/java/redis/clients/jedis/ZParams.java @@ -0,0 +1,33 @@ +package redis.clients.jedis; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class ZParams { + public enum Aggregate { + SUM, MIN, MAX + } + + private List params = new ArrayList(); + + public ZParams weights(int... weights) { + params.add("WEIGHTS"); + for (int weight : weights) { + params.add(String.valueOf(weight)); + } + + return this; + } + + public Collection getParams() { + return Collections.unmodifiableCollection(params); + } + + public ZParams aggregate(Aggregate aggregate) { + params.add("AGGREGATE"); + params.add(aggregate.name()); + return this; + } +} diff --git a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java index 2f1f117..f34d66c 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -6,6 +6,7 @@ import java.util.Set; import org.junit.Test; import redis.clients.jedis.Tuple; +import redis.clients.jedis.ZParams; public class SortedSetCommandsTest extends JedisCommandTestBase { @Test @@ -287,4 +288,78 @@ public class SortedSetCommandsTest extends JedisCommandTestBase { assertEquals(expected, jedis.zrange("foo", 0, 100)); } + + @Test + public void zunionstore() { + jedis.zadd("foo", 1, "a"); + jedis.zadd("foo", 2, "b"); + jedis.zadd("bar", 2, "a"); + jedis.zadd("bar", 2, "b"); + + int result = jedis.zunionstore("dst", "foo", "bar"); + + assertEquals(2, result); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("b", 4)); + expected.add(new Tuple("a", 3)); + + assertEquals(expected, jedis.zrangeWithScores("dst", 0, 100)); + } + + @Test + public void zunionstoreParams() { + jedis.zadd("foo", 1, "a"); + jedis.zadd("foo", 2, "b"); + jedis.zadd("bar", 2, "a"); + jedis.zadd("bar", 2, "b"); + + ZParams params = new ZParams(); + params.weights(2, 2); + params.aggregate(ZParams.Aggregate.SUM); + int result = jedis.zunionstore("dst", params, "foo", "bar"); + + assertEquals(2, result); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("b", 8)); + expected.add(new Tuple("a", 6)); + + assertEquals(expected, jedis.zrangeWithScores("dst", 0, 100)); + } + + @Test + public void zinterstore() { + jedis.zadd("foo", 1, "a"); + jedis.zadd("foo", 2, "b"); + jedis.zadd("bar", 2, "a"); + + int result = jedis.zinterstore("dst", "foo", "bar"); + + assertEquals(1, result); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("a", 3)); + + assertEquals(expected, jedis.zrangeWithScores("dst", 0, 100)); + } + + @Test + public void zintertoreParams() { + jedis.zadd("foo", 1, "a"); + jedis.zadd("foo", 2, "b"); + jedis.zadd("bar", 2, "a"); + + ZParams params = new ZParams(); + params.weights(2, 2); + params.aggregate(ZParams.Aggregate.SUM); + int result = jedis.zinterstore("dst", params, "foo", "bar"); + + assertEquals(1, result); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("a", 6)); + + assertEquals(expected, jedis.zrangeWithScores("dst", 0, 100)); + } } \ No newline at end of file