[GitHub] [geode] jhutchison commented on a change in pull request #5216: Refactor set executor

2020-06-24 Thread GitBox


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

2020-06-24 Thread GitBox


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

2020-06-24 Thread GitBox


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

2020-06-15 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-11 Thread GitBox


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

2020-06-05 Thread GitBox


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

2020-06-05 Thread GitBox


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

2020-06-05 Thread GitBox


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

2020-06-05 Thread GitBox


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