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));
   }
 }

Reply via email to