This is an automated email from the ASF dual-hosted git repository.
dschneider pushed a commit to branch more-string-work
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/more-string-work by this push:
new 4525675 strlen now has CommandFunction support
4525675 is described below
commit 4525675256f9c4173bd354d62efbbd7483ca3c6f
Author: Darrel Schneider <[email protected]>
AuthorDate: Fri May 29 10:23:45 2020 -0700
strlen now has CommandFunction support
---
.../geode/redis/internal/executor/CommandFunction.java | 4 ++++
.../geode/redis/internal/executor/string/RedisString.java | 4 ++++
.../internal/executor/string/RedisStringCommands.java | 2 ++
.../string/RedisStringCommandsFunctionExecutor.java | 6 ++++++
.../internal/executor/string/RedisStringInRegion.java | 10 ++++++++++
.../redis/internal/executor/string/StrlenExecutor.java | 14 +++-----------
6 files changed, 29 insertions(+), 11 deletions(-)
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
index 1dc5aef..7558091 100644
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
@@ -107,6 +107,10 @@ public class CommandFunction extends
SingleResultRedisFunction {
callable = () -> new RedisStringInRegion(localRegion).get(key);
break;
}
+ case STRLEN: {
+ callable = () -> new RedisStringInRegion(localRegion).strlen(key);
+ break;
+ }
case SET: {
Object[] argArgs = (Object[]) args[1];
ByteArrayWrapper value = (ByteArrayWrapper) argArgs[0];
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisString.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisString.java
index 0311d13..c12bb65 100644
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisString.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisString.java
@@ -453,6 +453,10 @@ public class RedisString extends AbstractRedisData {
};
+ public int strlen() {
+ return value.length();
+ }
+
@Override
public void toData(DataOutput out) throws IOException {
super.toData(out);
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommands.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommands.java
index 5438cc5..93c9337 100644
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommands.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommands.java
@@ -38,4 +38,6 @@ public interface RedisStringCommands {
long bitcount(ByteArrayWrapper key, int start, int end);
long bitcount(ByteArrayWrapper key);
+
+ int strlen(ByteArrayWrapper key);
}
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionExecutor.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionExecutor.java
index 4eed8d0..b201000 100644
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionExecutor.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringCommandsFunctionExecutor.java
@@ -24,6 +24,7 @@ import static
org.apache.geode.redis.internal.RedisCommandType.GETSET;
import static org.apache.geode.redis.internal.RedisCommandType.INCR;
import static org.apache.geode.redis.internal.RedisCommandType.INCRBY;
import static org.apache.geode.redis.internal.RedisCommandType.SET;
+import static org.apache.geode.redis.internal.RedisCommandType.STRLEN;
import org.apache.geode.cache.Region;
import org.apache.geode.redis.internal.ByteArrayWrapper;
@@ -91,4 +92,9 @@ public class RedisStringCommandsFunctionExecutor implements
RedisStringCommands
public long bitcount(ByteArrayWrapper key) {
return CommandFunction.execute(BITCOUNT, key, null, region);
}
+
+ @Override
+ public int strlen(ByteArrayWrapper key) {
+ return CommandFunction.execute(STRLEN, key, null, region);
+ }
}
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringInRegion.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringInRegion.java
index ddc355d..f66e6f7 100644
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringInRegion.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/RedisStringInRegion.java
@@ -177,6 +177,16 @@ public class RedisStringInRegion extends RedisKeyInRegion
implements RedisString
return redisString.bitcount();
}
+ @Override
+ public int strlen(ByteArrayWrapper key) {
+ RedisString redisString = getRedisString(key);
+
+ if (redisString == null) {
+ return 0;
+ }
+ return redisString.strlen();
+ }
+
private boolean setnx(ByteArrayWrapper key, ByteArrayWrapper value,
SetOptions options) {
if (getRedisData(key) != null) {
return false;
diff --git
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/StrlenExecutor.java
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/StrlenExecutor.java
index 83ec113..9eb4f37 100755
---
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/StrlenExecutor.java
+++
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/StrlenExecutor.java
@@ -24,8 +24,6 @@ import
org.apache.geode.redis.internal.RedisConstants.ArityDef;
public class StrlenExecutor extends StringExecutor {
- private final int KEY_DOES_NOT_EXIST = 0;
-
@Override
public void executeCommand(Command command, ExecutionHandlerContext context)
{
List<byte[]> commandElems = command.getProcessedCommand();
@@ -38,14 +36,8 @@ public class StrlenExecutor extends StringExecutor {
RedisStringCommands stringCommands = getRedisStringCommands(context);
ByteArrayWrapper key = command.getKey();
- ByteArrayWrapper value = stringCommands.get(key);
-
- if (value == null) {
- command
- .setResponse(Coder.getIntegerResponse(context.getByteBufAllocator(),
KEY_DOES_NOT_EXIST));
- } else {
- command.setResponse(
- Coder.getIntegerResponse(context.getByteBufAllocator(),
value.length()));
- }
+ int length = stringCommands.strlen(key);
+ command.setResponse(
+ Coder.getIntegerResponse(context.getByteBufAllocator(), length));
}
}