From e60084c88c19a74ecb36d56969882d873f98ecb9 Mon Sep 17 00:00:00 2001 From: Nikita Date: Tue, 24 Mar 2015 21:35:13 +0300 Subject: [PATCH] RScript object added. #73 --- .../redis/RedisAsyncConnection.java | 7 +++ .../redis/output/NestedMultiOutput.java | 2 +- .../redis/protocol/CommandArgs.java | 8 +++ src/main/java/org/redisson/Redisson.java | 9 ++++ .../java/org/redisson/RedissonScript.java | 53 +++++++++++++++++++ src/main/java/org/redisson/core/RScript.java | 30 +++++++++++ .../java/org/redisson/RedissonScriptTest.java | 30 +++++++++++ 7 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/redisson/RedissonScript.java create mode 100644 src/main/java/org/redisson/core/RScript.java create mode 100644 src/test/java/org/redisson/RedissonScriptTest.java diff --git a/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java b/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java index 74ad96655..d26d052e6 100644 --- a/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java +++ b/src/main/java/com/lambdaworks/redis/RedisAsyncConnection.java @@ -304,6 +304,13 @@ public class RedisAsyncConnection extends ChannelInboundHandlerAdapter { CommandOutput output = newScriptOutput(codec, type); return dispatch(EVAL, output, args); } + + public Future eval(V script, ScriptOutputType type, List keys, V... values) { + CommandArgs args = new CommandArgs(codec); + args.add(script.toString()).add(keys.size()).addKeys(keys).addValues(values); + CommandOutput output = newScriptOutput(codec, type); + return dispatch(EVAL, output, args); + } public Future evalsha(String digest, ScriptOutputType type, K[] keys, V... values) { CommandArgs args = new CommandArgs(codec); diff --git a/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java b/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java index 31369a3ce..6b3c70805 100644 --- a/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java +++ b/src/main/java/com/lambdaworks/redis/output/NestedMultiOutput.java @@ -31,7 +31,7 @@ public class NestedMultiOutput extends CommandOutput> { @Override public void set(ByteBuffer bytes) { - output.add(bytes == null ? null : codec.decodeValue(bytes)); + output.add(bytes == null ? null : codec.decodeKey(bytes)); } @Override diff --git a/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java b/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java index a9ea062c7..b7fd47985 100644 --- a/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java +++ b/src/main/java/com/lambdaworks/redis/protocol/CommandArgs.java @@ -6,6 +6,7 @@ import com.lambdaworks.redis.codec.RedisCodec; import java.nio.BufferOverflowException; import java.nio.ByteBuffer; +import java.util.List; import java.util.Map; import static java.lang.Math.max; @@ -51,6 +52,13 @@ public class CommandArgs { return write(codec.encodeKey(key)); } + public CommandArgs addKeys(List keys) { + for (K key : keys) { + addKey(key); + } + return this; + } + public CommandArgs addKeys(K... keys) { for (K key : keys) { addKey(key); diff --git a/src/main/java/org/redisson/Redisson.java b/src/main/java/org/redisson/Redisson.java index 811fcd471..be2ea5376 100755 --- a/src/main/java/org/redisson/Redisson.java +++ b/src/main/java/org/redisson/Redisson.java @@ -170,6 +170,15 @@ public class Redisson implements RedissonClient { return new RedissonSet(connectionManager, name); } + /** + * Returns script with eval-operations support + * + * @return + */ + public RScript getScript() { + return new RedissonScript(connectionManager); + } + /** * Returns distributed sorted set instance by name. * diff --git a/src/main/java/org/redisson/RedissonScript.java b/src/main/java/org/redisson/RedissonScript.java new file mode 100644 index 000000000..9bce128a5 --- /dev/null +++ b/src/main/java/org/redisson/RedissonScript.java @@ -0,0 +1,53 @@ +/** + * Copyright 2014 Nikita Koksharov, Nickolay Borbit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson; + +import io.netty.util.concurrent.Future; + +import java.util.List; + +import org.redisson.async.ResultOperation; +import org.redisson.connection.ConnectionManager; +import org.redisson.core.RScript; + +import com.lambdaworks.redis.RedisAsyncConnection; +import com.lambdaworks.redis.ScriptOutputType; + +public class RedissonScript implements RScript { + + private final ConnectionManager connectionManager; + + public RedissonScript(ConnectionManager connectionManager) { + this.connectionManager = connectionManager; + } + + @Override + public R eval(final String luaScript, final ReturnType returnType, final List keys, final Object... values) { + return (R) connectionManager.get(evalAsync(luaScript, returnType, keys, values)); + } + + @Override + public Future evalAsync(final String luaScript, final ReturnType returnType, final List keys, final Object... values) { + return connectionManager.writeAsync(new ResultOperation() { + @Override + protected Future execute(RedisAsyncConnection async) { + return async.eval(luaScript, ScriptOutputType.valueOf(returnType.toString()), keys, values); + } + }); + } + + +} diff --git a/src/main/java/org/redisson/core/RScript.java b/src/main/java/org/redisson/core/RScript.java new file mode 100644 index 000000000..e56a9a4bb --- /dev/null +++ b/src/main/java/org/redisson/core/RScript.java @@ -0,0 +1,30 @@ +/** + * Copyright 2014 Nikita Koksharov, Nickolay Borbit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson.core; + +import io.netty.util.concurrent.Future; + +import java.util.List; + +public interface RScript { + + enum ReturnType {BOOLEAN, INTEGER, MULTI, STATUS, VALUE}; + + Future evalAsync(String luaScript, ReturnType returnType, List keys, Object... values); + + R eval(String luaScript, ReturnType returnType, List keys, Object... values); + +} diff --git a/src/test/java/org/redisson/RedissonScriptTest.java b/src/test/java/org/redisson/RedissonScriptTest.java new file mode 100644 index 000000000..7f13ab1de --- /dev/null +++ b/src/test/java/org/redisson/RedissonScriptTest.java @@ -0,0 +1,30 @@ +package org.redisson; + +import io.netty.util.concurrent.Future; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.Test; +import org.redisson.core.RScript; + +public class RedissonScriptTest extends BaseTest { + + @Test + public void testEval() { + RScript script = redisson.getScript(); + List res = script.eval("return {1,2,3.3333,'foo',nil,'bar'}", RScript.ReturnType.MULTI, Collections.emptyList()); + MatcherAssert.assertThat(res, Matchers.contains(1L, 2L, 3L, "foo")); + } + + @Test + public void testEvalAsync() { + RScript script = redisson.getScript(); + Future> res = script.evalAsync("return {1,2,3.3333,'foo',nil,'bar'}", RScript.ReturnType.MULTI, Collections.emptyList()); + MatcherAssert.assertThat(res.awaitUninterruptibly().getNow(), Matchers.contains(1L, 2L, 3L, "foo")); + } + +}