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