Eval and Evalsha api improved

This commit is contained in:
ivowiblo
2012-04-14 22:54:43 -03:00
parent df1dfce327
commit df75c72825
13 changed files with 87 additions and 69 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -719,30 +719,25 @@ public class BinaryClient extends Connection {
super.disconnect(); super.disconnect();
} }
private void sendEvalCommand(Command command, byte[] script, List<byte[]> keys, List<byte[]> args){ private void sendEvalCommand(Command command, byte[] script, byte[] keyCount, byte[][] params){
int keysSize = keys.size();
int argsSize = args.size();
final byte[][] allArgs = new byte[keysSize + argsSize + 2][]; final byte[][] allArgs = new byte[params.length + 2][];
allArgs[0] = script; allArgs[0] = script;
allArgs[1] =toByteArray(keysSize); allArgs[1] = keyCount;
for(int i=0;i<keysSize; i++) for(int i=0;i<params.length; i++)
allArgs[i+2] = keys.get(i); allArgs[i+2] = params[i];
for(int i=0;i<argsSize; i++)
allArgs[i+2+keysSize] = args.get(i);
sendCommand(command, allArgs ); sendCommand(command, allArgs );
} }
public void eval(byte[] script, List<byte[]> keys, List<byte[]> args){ public void eval(byte[] script, byte[] keyCount, byte[][] params){
sendEvalCommand(EVAL, script, keys, args ); sendEvalCommand(EVAL, script, keyCount, params );
} }
public void evalsha(byte[] sha1, List<byte[]> keys, List<byte[]> args){ public void evalsha(byte[] sha1, byte[] keyCount, byte[][] params){
sendEvalCommand(EVALSHA, sha1, keys, args); sendEvalCommand(EVALSHA, sha1, keyCount, params);
} }
public void scriptFlush(){ public void scriptFlush(){

View File

@@ -16,6 +16,7 @@ import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.exceptions.JedisException; import redis.clients.jedis.exceptions.JedisException;
import redis.clients.util.JedisByteHashMap; import redis.clients.util.JedisByteHashMap;
import redis.clients.util.SafeEncoder; import redis.clients.util.SafeEncoder;
import static redis.clients.jedis.Protocol.toByteArray;
public class BinaryJedis implements BinaryJedisCommands { public class BinaryJedis implements BinaryJedisCommands {
protected Client client = null; protected Client client = null;
@@ -3018,18 +3019,25 @@ public class BinaryJedis implements BinaryJedisCommands {
*/ */
public Object eval(byte[] script, List<byte[]> keys, List<byte[]> args) { public Object eval(byte[] script, List<byte[]> keys, List<byte[]> args) {
client.setTimeoutInfinite(); client.setTimeoutInfinite();
client.eval(script, keys, args); client.eval(script, toByteArray(keys.size()), getParams(keys, args));
return client.getOne(); return client.getOne();
} }
private byte[][] getParams(List<byte[]> keys, List<byte[]> args){
/** int keyCount = keys.size();
* Evaluates scripts using the Lua interpreter built into Redis starting from version 2.6.0. byte[][] params = new byte[keyCount + args.size()][];
* <p>
* for(int i=0;i<keyCount;i++)
* @return Script result params[i] = keys.get(i);
*/
public Object eval(byte[] script, List<byte[]> keys) { for(int i=0;i<keys.size();i++)
return eval(script,keys, new ArrayList<byte[]>()); params[keyCount + i] = args.get(i);
return params;
}
public Object eval(byte[] script, byte[] keyCount, byte[][] params) {
client.setTimeoutInfinite();
client.eval(script, keyCount, params);
return client.getOne();
} }
public byte[] scriptFlush(){ public byte[] scriptFlush(){

View File

@@ -600,28 +600,20 @@ public class Client extends BinaryClient implements Commands {
configGet(SafeEncoder.encode(pattern)); configGet(SafeEncoder.encode(pattern));
} }
public void eval(String script, List<String> keys, String... args) { private byte[][] getByteParams(String... params){
List<byte[]> k = new ArrayList<byte[]>(); byte[][] p = new byte[params.length][];
for(String key:keys){ for(int i=0;i<params.length;i++)
k.add(SafeEncoder.encode(key)); p[i] = SafeEncoder.encode(params[i]);
}
List<byte[]> a = new ArrayList<byte[]>(); return p;
for(String arg:args){ }
a.add(SafeEncoder.encode(arg));
} public void eval(String script, int keyCount, String... params) {
eval(SafeEncoder.encode(script),k,a); eval(SafeEncoder.encode(script),toByteArray(keyCount), getByteParams(params));
} }
public void evalsha(String sha1, List<String> keys, String... args) { public void evalsha(String sha1, int keyCount, String... params) {
List<byte[]> k = new ArrayList<byte[]>(); evalsha(SafeEncoder.encode(sha1),toByteArray(keyCount), getByteParams(params));
for(String key:keys){
k.add(SafeEncoder.encode(key));
}
List<byte[]> a = new ArrayList<byte[]>();
for(String arg:args){
a.add(SafeEncoder.encode(arg));
}
evalsha(SafeEncoder.encode(sha1),k,a);
} }
public void scriptExists(String... sha1){ public void scriptExists(String... sha1){

View File

@@ -2693,19 +2693,38 @@ public class Jedis extends BinaryJedis implements JedisCommands {
return client.getStatusCodeReply(); return client.getStatusCodeReply();
} }
public Object eval(String script, String... keys) { public Object eval(String script, int keyCount, String... params) {
List<String> s = new ArrayList<String>(keys.length); client.setTimeoutInfinite();
for(String key : keys) client.eval(script, keyCount, params);
s.add(key);
return eval(script, s);
}
public Object eval(String script, List<String> keys, String... args) {
client.setTimeoutInfinite();
client.eval(script, keys, args);
return getEvalResult(); return getEvalResult();
}
private String[] getParams(List<String> keys, List<String> args){
int keyCount = keys.size();
int argCount = args.size();
String[] params = new String[keyCount + args.size()];
for(int i=0;i<keyCount;i++)
params[i] = keys.get(i);
for(int i=0;i<argCount;i++)
params[keyCount + i] = args.get(i);
return params;
}
public Object eval(String script, List<String> keys, List<String> args) {
return eval(script, keys.size(), getParams(keys, args));
}
public Object eval(String script) {
return eval(script,0);
}
public Object evalsha(String script) {
return evalsha(script,0);
} }
private Object getEvalResult(){ private Object getEvalResult(){
@@ -2726,17 +2745,13 @@ public class Jedis extends BinaryJedis implements JedisCommands {
return result; return result;
} }
public Object evalsha(String sha1, String... keys) { public Object evalsha(String sha1, List<String> keys, List<String> args) {
List<String> s = new ArrayList<String>(keys.length); return evalsha(sha1, keys.size(), getParams(keys, args));
for(String key : keys)
s.add(key);
return evalsha(sha1, s);
} }
public Object evalsha(String sha1, List<String> keys, String... args) { public Object evalsha(String sha1, int keyCount, String... params) {
checkIsInMulti(); checkIsInMulti();
client.evalsha(sha1, keys, args); client.evalsha(sha1, keyCount, params);
return getEvalResult(); return getEvalResult();
} }

BIN
src/test/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/test/java/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/test/java/redis/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/test/java/redis/clients/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -19,7 +19,11 @@ public class ScriptingCommandsTest extends JedisCommandTestBase {
keys.add("key1"); keys.add("key1");
keys.add("key2"); keys.add("key2");
List<String> response = (List<String>)jedis.eval(script, keys, "first", "second" ); List<String> args = new ArrayList<String>();
args.add("first");
args.add("second");
List<String> response = (List<String>)jedis.eval(script, keys, args );
assertEquals(4, response.size()); assertEquals(4, response.size());
assertEquals("key1", response.get(0)); assertEquals("key1", response.get(0));
@@ -34,7 +38,10 @@ public class ScriptingCommandsTest extends JedisCommandTestBase {
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
String response = (String)jedis.eval(script, keys); List<String> args = new ArrayList<String>();
args.add("first");
String response = (String)jedis.eval(script, keys, args);
assertEquals("key1", response); assertEquals("key1", response);
} }
@@ -45,7 +52,7 @@ public class ScriptingCommandsTest extends JedisCommandTestBase {
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
Long response = (Long)jedis.eval(script, keys); Long response = (Long)jedis.eval(script, keys, new ArrayList<String>());
assertEquals(new Long(2), response); assertEquals(new Long(2), response);
} }
@@ -53,8 +60,9 @@ public class ScriptingCommandsTest extends JedisCommandTestBase {
@Test @Test
public void evalNoArgs() { public void evalNoArgs() {
String script = "return KEYS[1]"; String script = "return KEYS[1]";
List<String> keys = new ArrayList<String>();
String response = (String)jedis.eval(script, "key1"); keys.add("key1");
String response = (String)jedis.eval(script, keys, new ArrayList<String>());
assertEquals("key1", response); assertEquals("key1", response);
} }