[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r445205109 ## File path: geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/string/StringsIntegrationTest.java ## @@ -0,0 +1,1637 @@ +/* Review comment: whoops. thanks- moved Jen's earlier changes into the SetsIntegrationTest and deleted StringsIntegrationTest This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r445204696 ## File path: geode-redis/src/test/java/org/apache/geode/redis/internal/executor/string/StringSetExecutorJUnitTest.java ## @@ -213,4 +229,34 @@ public void testSET_XXandNX_inSameCommand_ReturnsError() { assertThat(response.toString()).contains(RedisConstants.ERROR_SYNTAX); } + @Test + public void testSET_unknownOption_ReturnsError() { Review comment: done This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r445204473 ## File path: geode-redis/src/test/java/org/apache/geode/redis/internal/executor/string/StringSetExecutorJUnitTest.java ## @@ -213,4 +229,34 @@ public void testSET_XXandNX_inSameCommand_ReturnsError() { assertThat(response.toString()).contains(RedisConstants.ERROR_SYNTAX); } + @Test + public void testSET_unknownOption_ReturnsError() { Review comment: done. (1 test deleted instead of moved as the same basic test already existed in SetIntegrationTest ) This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r440443210 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/key/RenameExecutor.java ## @@ -16,34 +16,35 @@ package org.apache.geode.redis.internal.executor.key; -import static org.apache.geode.redis.internal.RedisConstants.ERROR_NO_SUCH_KEY; - import java.util.List; +import org.apache.geode.redis.internal.RedisConstants; import org.apache.geode.redis.internal.data.ByteArrayWrapper; import org.apache.geode.redis.internal.executor.AbstractExecutor; -import org.apache.geode.redis.internal.executor.RedisResponse; +import org.apache.geode.redis.internal.netty.Coder; import org.apache.geode.redis.internal.netty.Command; import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; public class RenameExecutor extends AbstractExecutor { - @Override - public RedisResponse executeCommand(Command command, - ExecutionHandlerContext context) { + public void executeCommand(Command command, ExecutionHandlerContext context) { Review comment: looking into it- thx This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439078174 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); + +if (optionalParametersStrings.contains("PX")) { + String nextParameter = + getNextParameter("PX", optionalParametersStrings); + + if (!isANumber(nextParameter)) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + expiration = parseExpirationTime("PX", nextParameter); + if (expiration <= 0) { +throw new IllegalArgumentException(ERROR_INVALID_EXPIRE_TIME); + } + +} else if (optionalParametersStrings.contains("EX")) { + String nextParameter = + getNextParameter("EX", optionalParametersStrings); + if (!isANumber(nextParameter)) { +throw new
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439070387 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); + +if (optionalParametersStrings.contains("PX")) { + String nextParameter = + getNextParameter("PX", optionalParametersStrings); + + if (!isANumber(nextParameter)) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + expiration = parseExpirationTime("PX", nextParameter); + if (expiration <= 0) { +throw new IllegalArgumentException(ERROR_INVALID_EXPIRE_TIME); + } + +} else if (optionalParametersStrings.contains("EX")) { + String nextParameter = + getNextParameter("EX", optionalParametersStrings); + if (!isANumber(nextParameter)) { +throw new
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439065784 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); + +if (optionalParametersStrings.contains("PX")) { + String nextParameter = + getNextParameter("PX", optionalParametersStrings); + + if (!isANumber(nextParameter)) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + expiration = parseExpirationTime("PX", nextParameter); + if (expiration <= 0) { +throw new IllegalArgumentException(ERROR_INVALID_EXPIRE_TIME); + } + +} else if (optionalParametersStrings.contains("EX")) { + String nextParameter = + getNextParameter("EX", optionalParametersStrings); + if (!isANumber(nextParameter)) { +throw new
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439055432 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); + +if (optionalParametersStrings.contains("PX")) { + String nextParameter = + getNextParameter("PX", optionalParametersStrings); + + if (!isANumber(nextParameter)) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + expiration = parseExpirationTime("PX", nextParameter); + if (expiration <= 0) { +throw new IllegalArgumentException(ERROR_INVALID_EXPIRE_TIME); + } + +} else if (optionalParametersStrings.contains("EX")) { + String nextParameter = + getNextParameter("EX", optionalParametersStrings); + if (!isANumber(nextParameter)) { +throw new
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439053138 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); Review comment: thanks- I'll look into why no test caught this... This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r439053138 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -35,105 +37,182 @@ public RedisResponse executeCommandWithResponse(Command command, ExecutionHandlerContext context) { -List commandElems = command.getProcessedCommand(); ByteArrayWrapper keyToSet = command.getKey(); -ByteArrayWrapper valueToSet = getValueToSet(commandElems); - +List commandElementsBytes = command.getProcessedCommand(); +List optionalParameterBytes = getOptionalParameters(commandElementsBytes); +ByteArrayWrapper valueToSet = getValueToSet(commandElementsBytes); RedisStringCommands redisStringCommands = getRedisStringCommands(context); SetOptions setOptions; + try { - setOptions = parseCommandElems(commandElems); + setOptions = parseOptionalParameters(optionalParameterBytes); } catch (IllegalArgumentException ex) { return RedisResponse.error(ex.getMessage()); } -return doSet(command, context, keyToSet, valueToSet, redisStringCommands, setOptions); +return doSet(keyToSet, valueToSet, redisStringCommands, setOptions); + } + + private List getOptionalParameters(List commandElementsBytes) { +return commandElementsBytes.subList(3, commandElementsBytes.size()); } - private RedisResponse doSet(Command command, ExecutionHandlerContext context, - ByteArrayWrapper key, - ByteArrayWrapper value, RedisStringCommands redisStringCommands, SetOptions setOptions) { + private RedisResponse doSet(ByteArrayWrapper key, + ByteArrayWrapper value, + RedisStringCommands redisStringCommands, + SetOptions setOptions) { -boolean result = redisStringCommands.set(key, value, setOptions); +boolean setCompletedSuccessfully = redisStringCommands.set(key, value, setOptions); -if (result) { +if (setCompletedSuccessfully) { return RedisResponse.string(SUCCESS); +} else { + return RedisResponse.nil(); } - -return RedisResponse.nil(); } private ByteArrayWrapper getValueToSet(List commandElems) { byte[] value = commandElems.get(2); return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); +keepTTL = optionalParametersStrings.contains("KEEPTL"); Review comment: thanks This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r436187614 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -68,72 +75,141 @@ private ByteArrayWrapper getValueToSet(List commandElems) { return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); + +if (optionalParametersStrings.contains("KEEPTL")) { + keepTTL = true; +} + +if (optionalParametersStrings.contains("PX")) { + int index = optionalParametersStrings.indexOf("PX"); + + if (optionalParametersStrings.size() <= index + 1) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + String expirationTime = optionalParametersStrings.get(index + 1); + expiration = parseExpirationTime("PX", expirationTime); + +} else if (optionalParametersStrings.contains("EX")) { + int index = optionalParametersStrings.indexOf("EX"); + + if (optionalParametersStrings.size() <= index + 1) { +throw new IllegalArgumentException(ERROR_SYNTAX); } + + String expirationTime = optionalParametersStrings.get(index + 1); + expiration = parseExpirationTime("EX", expirationTime); +} + +if (optionalParametersStrings.contains("NX")) { + existsOption = SetOptions.Exists.NX; +} else if (optionalParametersStrings.contains("XX")) { + existsOption = SetOptions.Exists.XX; } return new SetOptions(existsOption, expiration, keepTTL); } - private long parseExpirationTime(int index, List commandElems) - throws IllegalArgumentException { -String expirationString; -try { - expirationString = Coder.bytesToString(commandElems.get(index)); -} catch (IndexOutOfBoundsException e) { + private void throwExceptionIfUnknownParameter(List optionalParameters) { +List validOptionalParamaters = Arrays.asList("EX", "PX", "NX", "XX", "KEEPTL"); + +List parametersInQuestion = +optionalParameters +.stream() +.filter(parameter -> (!validOptionalParamaters.contains(parameter))) +.collect(Collectors.toList()); + +parametersInQuestion.forEach(parameter -> throwErrorIfNotANumberInExpectedPosition( +parameter, +optionalParameters)); + } + + + private void throwErrorIfNotANumberInExpectedPosition( + String parameter, + List optionalParameters) { + +if (previousOptionIsValidAndExpectsANumber(parameter, optionalParameters)) { + convertToLongOrThrowException(parameter); +} else { throw new IllegalArgumentException(ERROR_SYNTAX); } + } + + + private boolean previousOptionIsValidAndExpectsANumber(String paramter, + List optionalParameters) { +List validParamaters = Arrays.asList("EX", "PX"); + +if (optionalParameters.size() < 2) { + return false; +} + +int indexOfParameter = optionalParameters.indexOf(paramter); +String previousParameter = optionalParameters.get(indexOfParameter - 1); + +return
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r436187466 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -68,72 +75,141 @@ private ByteArrayWrapper getValueToSet(List commandElems) { return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); + +if (optionalParametersStrings.contains("KEEPTL")) { + keepTTL = true; +} + +if (optionalParametersStrings.contains("PX")) { + int index = optionalParametersStrings.indexOf("PX"); Review comment: done - thanks This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r436079328 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -68,72 +75,141 @@ private ByteArrayWrapper getValueToSet(List commandElems) { return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); + +if (optionalParametersStrings.contains("KEEPTL")) { + keepTTL = true; +} + +if (optionalParametersStrings.contains("PX")) { + int index = optionalParametersStrings.indexOf("PX"); + + if (optionalParametersStrings.size() <= index + 1) { +throw new IllegalArgumentException(ERROR_SYNTAX); + } + + String expirationTime = optionalParametersStrings.get(index + 1); + expiration = parseExpirationTime("PX", expirationTime); + +} else if (optionalParametersStrings.contains("EX")) { + int index = optionalParametersStrings.indexOf("EX"); + + if (optionalParametersStrings.size() <= index + 1) { +throw new IllegalArgumentException(ERROR_SYNTAX); } + + String expirationTime = optionalParametersStrings.get(index + 1); + expiration = parseExpirationTime("EX", expirationTime); +} + +if (optionalParametersStrings.contains("NX")) { + existsOption = SetOptions.Exists.NX; +} else if (optionalParametersStrings.contains("XX")) { + existsOption = SetOptions.Exists.XX; } return new SetOptions(existsOption, expiration, keepTTL); } - private long parseExpirationTime(int index, List commandElems) - throws IllegalArgumentException { -String expirationString; -try { - expirationString = Coder.bytesToString(commandElems.get(index)); -} catch (IndexOutOfBoundsException e) { + private void throwExceptionIfUnknownParameter(List optionalParameters) { +List validOptionalParamaters = Arrays.asList("EX", "PX", "NX", "XX", "KEEPTL"); + +List parametersInQuestion = +optionalParameters +.stream() +.filter(parameter -> (!validOptionalParamaters.contains(parameter))) +.collect(Collectors.toList()); + +parametersInQuestion.forEach(parameter -> throwErrorIfNotANumberInExpectedPosition( +parameter, +optionalParameters)); + } + + + private void throwErrorIfNotANumberInExpectedPosition( + String parameter, + List optionalParameters) { + +if (previousOptionIsValidAndExpectsANumber(parameter, optionalParameters)) { + convertToLongOrThrowException(parameter); +} else { throw new IllegalArgumentException(ERROR_SYNTAX); } + } + + + private boolean previousOptionIsValidAndExpectsANumber(String paramter, + List optionalParameters) { +List validParamaters = Arrays.asList("EX", "PX"); + +if (optionalParameters.size() < 2) { + return false; +} + +int indexOfParameter = optionalParameters.indexOf(paramter); +String previousParameter = optionalParameters.get(indexOfParameter - 1); + +return
[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor
jhutchison commented on a change in pull request #5216: URL: https://github.com/apache/geode/pull/5216#discussion_r436079564 ## File path: geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetExecutor.java ## @@ -68,72 +75,141 @@ private ByteArrayWrapper getValueToSet(List commandElems) { return new ByteArrayWrapper(value); } + private SetOptions parseOptionalParameters(List optionalParameterBytes) + throws IllegalArgumentException { - private SetOptions parseCommandElems(List commandElems) throws IllegalArgumentException { boolean keepTTL = false; SetOptions.Exists existsOption = SetOptions.Exists.NONE; long expiration = 0L; -for (int i = 3; i < commandElems.size(); i++) { - String current_arg = Coder.bytesToString(commandElems.get(i)).toUpperCase(); - switch (current_arg) { -case "KEEPTTL": - keepTTL = true; - break; -case "EX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - expiration = SECONDS.toMillis(expiration); - break; -case "PX": - if (expiration != 0) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - i++; - expiration = parseExpirationTime(i, commandElems); - break; -case "NX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.NX; - break; -case "XX": - if (existsOption != SetOptions.Exists.NONE) { -throw new IllegalArgumentException(ERROR_SYNTAX); - } - existsOption = SetOptions.Exists.XX; - break; -default: - throw new IllegalArgumentException(ERROR_SYNTAX); +List optionalParametersStrings = +optionalParameterBytes.stream() +.map(item -> Coder.bytesToString(item).toUpperCase()) +.collect(Collectors.toList()); + +throwExceptionIfUnknownParameter(optionalParametersStrings); +throwExceptionIfIncompatableParamaterOptions(optionalParametersStrings); + +if (optionalParametersStrings.contains("KEEPTL")) { + keepTTL = true; +} Review comment: thanks. done This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org