[PATCH] Add HMGET/HMSET commands

29 views
Skip to first unread message

Alon Bar-Lev

unread,
Nov 20, 2011, 11:24:26 AM11/20/11
to jre...@googlegroups.com, Alon Bar-Lev

Signed-off-by: Alon Bar-Lev <alon....@gmail.com>
---
core/api/src/main/java/org/jredis/JRedis.java | 22 ++++++++
.../src/main/java/org/jredis/protocol/Command.java | 8 ++-
.../org/jredis/ri/alphazero/JRedisSupport.java | 52 ++++++++++++++++++++
.../jredis/ri/alphazero/protocol/ProtocolBase.java | 16 ++++++
.../ri/alphazero/JRedisProviderTestsBase.java | 38 ++++++++++++++
5 files changed, 134 insertions(+), 2 deletions(-)

diff --git a/core/api/src/main/java/org/jredis/JRedis.java b/core/api/src/main/java/org/jredis/JRedis.java
index 89623cd..798035f 100644
--- a/core/api/src/main/java/org/jredis/JRedis.java
+++ b/core/api/src/main/java/org/jredis/JRedis.java
@@ -914,6 +914,28 @@ public interface JRedis {
@Redis(versions="1.3.n")
public <K extends Object> Map<byte[], byte[]> hgetall(K key) throws RedisException;

+ /**
+ *
+ * @Redis HMSET
+ * @param key
+ * @param sets
+ * @return
+ * @throws RedisException
+ */
+ @Redis(versions="1.3.8")
+ public <K extends Object> void hmset(K key, K...sets) throws RedisException;
+
+ /**
+ *
+ * @Redis HMGET
+ * @param key
+ * @param keys
+ * @return values as a List<byte[]>
+ * @throws RedisException
+ */
+ @Redis(versions="1.3.10")
+ public <K extends Object> List<byte[]> hmget(K key, K...keys) throws RedisException;
+
// ------------------------------------------------------------------------
// Transactional commands
// ------------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/jredis/protocol/Command.java b/core/api/src/main/java/org/jredis/protocol/Command.java
index 6c08fb1..131fed7 100644
--- a/core/api/src/main/java/org/jredis/protocol/Command.java
+++ b/core/api/src/main/java/org/jredis/protocol/Command.java
@@ -129,6 +129,8 @@ public enum Command {
HKEYS (RequestType.KEY, ResponseType.MULTI_BULK),
HVALS (RequestType.KEY, ResponseType.MULTI_BULK),
HGETALL (RequestType.KEY, ResponseType.MULTI_BULK),
+ HMSET (RequestType.KEY_BULK_SET, ResponseType.STATUS),
+ HMGET (RequestType.KEY_BULK_SET, ResponseType.MULTI_BULK),

// transactional commands
MULTI (RequestType.NO_ARG, ResponseType.STATUS),
@@ -307,7 +309,9 @@ public enum Command {
/** */
MULTI_KEY,
/** */
- BULK_SET
+ BULK_SET,
+ /** */
+ KEY_BULK_SET
}

/**
@@ -354,4 +358,4 @@ public enum Command {
this.respClass = respClass;
}
}
-}
\ No newline at end of file
+}
diff --git a/core/ri/src/main/java/org/jredis/ri/alphazero/JRedisSupport.java b/core/ri/src/main/java/org/jredis/ri/alphazero/JRedisSupport.java
index 7cfafdd..65d942d 100644
--- a/core/ri/src/main/java/org/jredis/ri/alphazero/JRedisSupport.java
+++ b/core/ri/src/main/java/org/jredis/ri/alphazero/JRedisSupport.java
@@ -760,6 +760,58 @@ public abstract class JRedisSupport implements JRedis {
return resp;
}

+ @Redis(versions="1.3.8")
+ @Override
+ public <K extends Object> void hmset(K hashKey, K...sets) throws RedisException {
+ byte[][] hashKeyBytes = new byte[sets.length+1][];
+ int i = 0;
+
+ if ((hashKeyBytes[i++] = getKeyBytes(hashKey)) == null) {
+ throw new IllegalArgumentException ("invalid key => ["+hashKey+"]");
+ }
+
+ for(K k : sets) {
+ if ((hashKeyBytes[i++] = getKeyBytes(k)) == null) {
+ throw new IllegalArgumentException ("invalid key => ["+k+"]");
+ }
+ }
+
+ this.serviceRequest(Command.HMSET, hashKeyBytes);
+ }
+
+ @Redis(versions="1.3.10")
+ @Override
+ public <K extends Object> List<byte[]> hmget(K hashKey, K...keys) throws RedisException {
+ byte[][] hashKeyBytes = new byte[keys.length+1][];
+ int i = 0;
+
+ if ((hashKeyBytes[i++] = getKeyBytes(hashKey)) == null) {
+ throw new IllegalArgumentException ("invalid key => ["+hashKey+"]");
+ }
+
+ for(K k : keys) {
+ if ((hashKeyBytes[i++] = getKeyBytes(k)) == null) {
+ throw new IllegalArgumentException ("invalid key => ["+k+"]");
+ }
+ }
+
+ List<byte[]> resp = null;
+ try {
+ MultiBulkResponse response = (MultiBulkResponse) this.serviceRequest(Command.HMGET, hashKeyBytes);
+ List<byte[]> bulkdata = response.getMultiBulkData();
+ if(null != bulkdata) {
+ resp = new ArrayList<byte[]>(bulkdata.size());
+ for(i=0; i<bulkdata.size(); i++){
+ resp.add(bulkdata.get(i));
+ }
+ }
+ }
+ catch (ClassCastException e){
+ throw new ProviderException("Expecting a MultiBulkResponse here => " + e.getLocalizedMessage(), e);
+ }
+ return resp;
+ }
+

/* ------------------------------- commands returning int value --------- */

diff --git a/core/ri/src/main/java/org/jredis/ri/alphazero/protocol/ProtocolBase.java b/core/ri/src/main/java/org/jredis/ri/alphazero/protocol/ProtocolBase.java
index f6b774c..5d71eae 100644
--- a/core/ri/src/main/java/org/jredis/ri/alphazero/protocol/ProtocolBase.java
+++ b/core/ri/src/main/java/org/jredis/ri/alphazero/protocol/ProtocolBase.java
@@ -132,6 +132,22 @@ public abstract class ProtocolBase implements Protocol {
}
break;

+ case KEY_BULK_SET:
+ for (byte[] arg : args) {
+ buffer.write(SIZE_BYTE);
+ if (arg != null) {
+ buffer.write(Convert.toBytes(arg.length));
+ buffer.write(CRLF);
+ buffer.write(arg);
+ buffer.write(CRLF);
+ } else {
+ buffer.write(ASCII_ZERO);
+ buffer.write(CRLF);
+ buffer.write(CRLF);
+ }
+ }
+ break;
+
default:
for(int i=0;i<args.length; i++){
buffer.write(SIZE_BYTE);
diff --git a/core/ri/src/test/java/org/jredis/ri/alphazero/JRedisProviderTestsBase.java b/core/ri/src/test/java/org/jredis/ri/alphazero/JRedisProviderTestsBase.java
index 0386274..4ce116f 100644
--- a/core/ri/src/test/java/org/jredis/ri/alphazero/JRedisProviderTestsBase.java
+++ b/core/ri/src/test/java/org/jredis/ri/alphazero/JRedisProviderTestsBase.java
@@ -715,6 +715,44 @@ public abstract class JRedisProviderTestsBase extends JRedisTestSuiteBase<JRedis
}

/**
+ * Test method for {@link org.jredis.ri.alphazero.JRedisSupport#hmset(java.lang.String, ...)}.
+ */
+ @Test
+ public void testHmset() {
+ cmd = Command.HMSET.code + " | " + Command.HGET;
+ Log.log("TEST: %s command", cmd);
+ try {
+ provider.flushdb();
+
+ assertTrue( provider.hset(keys.get(0), keys.get(1), ""), "hset using String value");
+ assertTrue( provider.hset(keys.get(0), keys.get(2), ""), "hset using String value");
+ provider.hmset(keys.get(0), keys.get(1), stringList.get(0), keys.get(2), stringList.get(1));
+ assertEquals( DefaultCodec.toStr(provider.hget(keys.get(0), keys.get(1))), stringList.get(0), "hmset failed field 0");
+ assertEquals( DefaultCodec.toStr(provider.hget(keys.get(0), keys.get(2))), stringList.get(1), "hmset failed field 1");
+ }
+ catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
+ }
+
+ /**
+ * Test method for {@link org.jredis.ri.alphazero.JRedisSupport#hmget(java.lang.String, ...)}.
+ */
+ @Test
+ public void testHmget() {
+ cmd = Command.HMGET.code;
+ Log.log("TEST: %s command", cmd);
+ try {
+ provider.flushdb();
+
+ assertTrue( provider.hset(keys.get(0), keys.get(1), stringList.get(0)), "hset using String value");
+ assertTrue( provider.hset(keys.get(0), keys.get(2), stringList.get(1)), "hset using String value");
+ List<byte[]> resp = provider.hmget(keys.get(0), keys.get(1), keys.get(2));
+ assertEquals( DefaultCodec.toStr(resp.get(0)), stringList.get(0), "hmget invalid index 0");
+ assertEquals( DefaultCodec.toStr(resp.get(1)), stringList.get(1), "hmget invalid index 1");
+ }
+ catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
+ }
+
+ /**
* Test method for {@link org.jredis.ri.alphazero.JRedisSupport#set(java.lang.String, byte[])}.
*/
@Test
--
1.7.3.4

Alon Bar-Lev

unread,
Nov 20, 2011, 11:25:33 AM11/20/11
to jre...@googlegroups.com, Alon Bar-Lev
Hello,

Not sure this is complete, but working for us.
Please consider to apply/support.

Thanks!
Alon.

Reply all
Reply to author
Forward
0 new messages