diff --git a/README.md b/README.md index 436cda8..ef3b51d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Jedis was conceived to be EASY to use and FULLY COMPATIBLE with the latest versi Jedis is a WORK IN PROGRESS. ## What's still missing? -- Commands operating on sets - Commands operating on sorted sets - Sorting - Transactions @@ -24,6 +23,7 @@ But stay close because things are going fast and all this will be implemented so - Commands operating on string values - Commands operating on hashes - Commands operating on lists (not SORT, BLPOP, BRPOP) +- Commands operating on sets ## How do I use it? diff --git a/pom.xml b/pom.xml index 1fa8da8..920405a 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 redis.clients jedis - 0.0.5 + 0.0.6 junit diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index c53f97f..849abab 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -276,4 +276,65 @@ public class Jedis extends Client { List members = sendCommand("SMEMBERS", key).getMultiBulkReply(); return new LinkedHashSet(members); } + + public int srem(String key, String member) throws JedisException { + return sendCommand("SREM", key, member).getIntegerReply(); + } + + public String spop(String key) throws JedisException { + return sendCommand("SPOP", key).getBulkReply(); + } + + public int smove(String srckey, String dstkey, String member) + throws JedisException { + return sendCommand("SMOVE", srckey, dstkey, member).getIntegerReply(); + } + + public int scard(String key) throws JedisException { + return sendCommand("SCARD", key).getIntegerReply(); + } + + public int sismember(String key, String member) throws JedisException { + return sendCommand("SISMEMBER", key, member).getIntegerReply(); + } + + public Set sinter(String... keys) throws JedisException { + List members = sendCommand("SINTER", keys).getMultiBulkReply(); + return new LinkedHashSet(members); + } + + public int sinterstore(String dstkey, String... keys) throws JedisException { + String[] params = new String[keys.length + 1]; + params[0] = dstkey; + System.arraycopy(keys, 0, params, 1, keys.length); + return sendCommand("SINTERSTORE", params).getIntegerReply(); + } + + public Set sunion(String... keys) throws JedisException { + List members = sendCommand("SUNION", keys).getMultiBulkReply(); + return new LinkedHashSet(members); + } + + public int sunionstore(String dstkey, String... keys) throws JedisException { + String[] params = new String[keys.length + 1]; + params[0] = dstkey; + System.arraycopy(keys, 0, params, 1, keys.length); + return sendCommand("SUNIONSTORE", params).getIntegerReply(); + } + + public Set sdiff(String... keys) throws JedisException { + List members = sendCommand("SDIFF", keys).getMultiBulkReply(); + return new LinkedHashSet(members); + } + + public int sdiffstore(String dstkey, String... keys) throws JedisException { + String[] params = new String[keys.length + 1]; + params[0] = dstkey; + System.arraycopy(keys, 0, params, 1, keys.length); + return sendCommand("SDIFFSTORE", params).getIntegerReply(); + } + + public String srandmember(String key) throws JedisException { + return sendCommand("SRANDMEMBER", key).getBulkReply(); + } } diff --git a/src/test/java/redis/clients/jedis/tests/commands/SetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SetCommandsTest.java index db33bdc..30b22fc 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SetCommandsTest.java @@ -50,4 +50,208 @@ public class SetCommandsTest extends Assert { assertEquals(expected, members); } -} + @Test + public void srem() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + int status = jedis.srem("foo", "a"); + + Set expected = new LinkedHashSet(); + expected.add("b"); + + assertEquals(1, status); + assertEquals(expected, jedis.smembers("foo")); + + status = jedis.srem("foo", "bar"); + + assertEquals(0, status); + } + + @Test + public void spop() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + String member = jedis.spop("foo"); + + assertTrue("a".equals(member) || "b".equals(member)); + assertEquals(1, jedis.smembers("foo").size()); + + member = jedis.spop("bar"); + assertNull(member); + } + + @Test + public void smove() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + jedis.sadd("bar", "c"); + + int status = jedis.smove("foo", "bar", "a"); + + Set expectedSrc = new LinkedHashSet(); + expectedSrc.add("b"); + + Set expectedDst = new LinkedHashSet(); + expectedDst.add("c"); + expectedDst.add("a"); + + assertEquals(status, 1); + assertEquals(expectedSrc, jedis.smembers("foo")); + assertEquals(expectedDst, jedis.smembers("bar")); + + status = jedis.smove("foo", "bar", "a"); + assertEquals(status, 0); + } + + @Test + public void scard() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + int card = jedis.scard("foo"); + + assertEquals(2, card); + + card = jedis.scard("bar"); + assertEquals(0, card); + } + + @Test + public void sismember() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + int status = jedis.sismember("foo", "a"); + assertEquals(1, status); + + status = jedis.sismember("foo", "c"); + assertEquals(0, status); + } + + @Test + public void sinter() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + jedis.sadd("bar", "b"); + jedis.sadd("bar", "c"); + + Set expected = new LinkedHashSet(); + expected.add("b"); + + Set intersection = jedis.sinter("foo", "bar"); + assertEquals(expected, intersection); + } + + @Test + public void sinterstore() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + jedis.sadd("bar", "b"); + jedis.sadd("bar", "c"); + + Set expected = new LinkedHashSet(); + expected.add("b"); + + int status = jedis.sinterstore("car", "foo", "bar"); + assertEquals(1, status); + + assertEquals(expected, jedis.smembers("car")); + } + + @Test + public void sunion() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + jedis.sadd("bar", "b"); + jedis.sadd("bar", "c"); + + Set expected = new LinkedHashSet(); + expected.add("a"); + expected.add("b"); + expected.add("c"); + + Set union = jedis.sunion("foo", "bar"); + assertEquals(expected, union); + } + + @Test + public void sunionstore() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + jedis.sadd("bar", "b"); + jedis.sadd("bar", "c"); + + Set expected = new LinkedHashSet(); + expected.add("a"); + expected.add("b"); + expected.add("c"); + + int status = jedis.sunionstore("car", "foo", "bar"); + assertEquals(3, status); + + assertEquals(expected, jedis.smembers("car")); + } + + @Test + public void sdiff() throws JedisException { + jedis.sadd("foo", "x"); + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + jedis.sadd("foo", "c"); + + jedis.sadd("bar", "c"); + + jedis.sadd("car", "a"); + jedis.sadd("car", "d"); + + Set expected = new LinkedHashSet(); + expected.add("x"); + expected.add("b"); + + Set diff = jedis.sdiff("foo", "bar", "car"); + assertEquals(expected, diff); + } + + @Test + public void sdiffstore() throws JedisException { + jedis.sadd("foo", "x"); + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + jedis.sadd("foo", "c"); + + jedis.sadd("bar", "c"); + + jedis.sadd("car", "a"); + jedis.sadd("car", "d"); + + Set expected = new LinkedHashSet(); + expected.add("d"); + expected.add("a"); + + int status = jedis.sdiffstore("tar", "foo", "bar", "car"); + assertEquals(2, status); + assertEquals(expected, jedis.smembers("car")); + } + + @Test + public void srandmember() throws JedisException { + jedis.sadd("foo", "a"); + jedis.sadd("foo", "b"); + + String member = jedis.srandmember("foo"); + + assertTrue("a".equals(member) || "b".equals(member)); + assertEquals(2, jedis.smembers("foo").size()); + + member = jedis.srandmember("bar"); + assertNull(member); + } + +} \ No newline at end of file