dschneider-pivotal commented on a change in pull request #6907:
URL: https://github.com/apache/geode/pull/6907#discussion_r717964417



##########
File path: 
geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/RedisCommandType.java
##########
@@ -154,207 +165,274 @@
    ***************************************/
 
   /*************** Connection ****************/
-  AUTH(new AuthExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ECHO(new EchoExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PING(new PingExecutor(), SUPPORTED, new MaximumParameterRequirements(2)),
-  QUIT(new QuitExecutor(), SUPPORTED),
+  AUTH(new AuthExecutor(), SUPPORTED, new Parameter().min(2).max(3, 
ERROR_SYNTAX).firstKey(0)
+      .flags(noscript, loading, stale, fast, no_auth)),
+  ECHO(new EchoExecutor(), SUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(fast)),
+  PING(new PingExecutor(), SUPPORTED, new 
Parameter().min(1).max(2).firstKey(0).flags(stale, fast)),
+  QUIT(new QuitExecutor(), SUPPORTED, new Parameter().firstKey(0)),
 
   /*************** Keys ******************/
 
-  DEL(new DelExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  DUMP(new DumpExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  EXISTS(new ExistsExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  EXPIRE(new ExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  KEYS(new KeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PERSIST(new PersistExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PEXPIRE(new PExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  PTTL(new PTTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  RENAME(new RenameExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  RESTORE(new RestoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  TTL(new TTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  TYPE(new TypeExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  DEL(new DelExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write)),
+  DUMP(new DumpExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random)),
+  EXISTS(new ExistsExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  EXPIRE(new ExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  KEYS(new KeysExecutor(), SUPPORTED,
+      new Parameter().exact(2).firstKey(0).flags(readonly, sort_for_script)),
+  PERSIST(new PersistExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(write, fast)),
+  PEXPIRE(new PExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PTTL(new PTTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  RENAME(new RenameExecutor(), SUPPORTED, new 
Parameter().exact(3).lastKey(2).flags(write)),
+  RESTORE(new RestoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(write, denyoom)),
+  TTL(new TTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  TYPE(new TypeExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
 
   /************* Strings *****************/
 
-  APPEND(new AppendExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  DECR(new DecrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  DECRBY(new DecrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  GET(new GetExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETSET(new GetSetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCRBY(new IncrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCR(new IncrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  MGET(new MGetExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  MSET(new MSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  PSETEX(new PSetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SET(new SetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SETEX(new SetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SETNX(new SetNXExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  STRLEN(new StrlenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  APPEND(new AppendExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  DECR(new DecrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  DECRBY(new DecrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  GET(new GetExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  GETSET(new GetSetExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCRBY(new IncrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCR(new IncrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly)),
+  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(3).flags(write, denyoom, fast)),
+  MGET(new MGetExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  MSET(new MSetExecutor(), UNSUPPORTED,
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),
+  PSETEX(new PSetEXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  SET(new SetExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom)),
+  SETEX(new SetEXExecutor(), SUPPORTED, new Parameter().exact(4).flags(write, 
denyoom)),
+  SETNX(new SetNXExecutor(), SUPPORTED, new Parameter().exact(3).flags(write, 
denyoom, fast)),
+  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  STRLEN(new StrlenExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
 
   /************* Hashes *****************/
 
-  HDEL(new HDelExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HGET(new HGetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HGETALL(new HGetAllExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  HLEN(new HLenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HMGET(new HMGetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HMSET(new HMSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSET(new HSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSETNX(new HSetNXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HINCRBY(new HIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HVALS(new HValsExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HSCAN(new HScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  HEXISTS(new HExistsExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HKEYS(new HKeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  HDEL(new HDelExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  HGET(new HGetExecutor(), SUPPORTED, new Parameter().exact(3).flags(readonly, 
fast)),
+  HGETALL(new HGetAllExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, random)),
+  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write, denyoom, fast)),
+  HLEN(new HLenExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  HMGET(new HMGetExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
fast)),
+  HMSET(new HMSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSET(new HSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSETNX(new HSetNXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HINCRBY(new HIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HVALS(new HValsExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
+  HSCAN(new HScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  HEXISTS(new HExistsExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HKEYS(new HKeysExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
 
   /************* Sets *****************/
 
-  SADD(new SAddExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SMEMBERS(new SMembersExecutor(), SUPPORTED, new 
ExactParameterRequirements(2)),
-  SREM(new SRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
+  SADD(new SAddExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom, fast)),
+  SMEMBERS(new SMembersExecutor(), SUPPORTED,
+      new Parameter().exact(2).flags(readonly, sort_for_script)),
+  SREM(new SRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
 
   /************ Sorted Sets **************/
 
-  ZADD(new ZAddExecutor(), SUPPORTED, new MinimumParameterRequirements(4)),
-  ZCARD(new ZCardExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  ZCOUNT(new ZCountExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZRANGE(new ZRangeExecutor(), SUPPORTED, new MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANK(new ZRankExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZREM(new ZRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  ZSCAN(new ZScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  ZSCORE(new ZScoreExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
+  ZADD(new ZAddExecutor(), SUPPORTED, new Parameter().min(4).flags(write, 
denyoom, fast)),
+  ZCARD(new ZCardExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
+  ZCOUNT(new ZCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZRANGE(new ZRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANK(new ZRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZREM(new ZRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write)),
+  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(readonly)),
+  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZSCAN(new ZScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  ZSCORE(new ZScoreExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(write, denyoom, movablekeys)),
 
   /************* Server *****************/
-  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new 
SlowlogParameterRequirements()),
-  INFO(new InfoExecutor(), SUPPORTED, new MaximumParameterRequirements(2, 
ERROR_SYNTAX)),
+  COMMAND(new CommandExecutor(), SUPPORTED, new 
Parameter().min(1).firstKey(0).flags(random, loading, stale)),
+  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(SlowlogParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, loading, stale)),
+  INFO(new InfoExecutor(), SUPPORTED, new Parameter().min(1).max(2, 
ERROR_SYNTAX).firstKey(0)
+      .flags(random, loading, stale)),
 
   /********** Publish Subscribe **********/
-  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUBLISH(new PublishExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  PUBSUB(new PubSubExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
+  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, stale)),
+  PUBLISH(new PublishExecutor(), SUPPORTED,
+      new Parameter().exact(3).firstKey(0).flags(pubsub, loading, stale, fast, 
may_replicate)),
+  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUBSUB(new PubSubExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, random, loading, 
stale)),
 
   /************* Cluster *****************/
-  CLUSTER(new ClusterExecutor(), SUPPORTED, new 
ClusterParameterRequirements()),
+  CLUSTER(new ClusterExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(ClusterParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, stale)),
 
   /***************************************
    ********* Internal Commands ***********
    ***************************************/
   // do not call these directly, only to be used in other commands
-  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(3)),
+  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new Parameter().exact(3)),
 
   /***************************************
    ******** Unsupported Commands *********
    ***************************************/
 
   /*************** Connection *************/
 
-  SELECT(new SelectExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
+  SELECT(new SelectExecutor(), UNSUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(loading, stale, fast)),
 
   /*************** Keys ******************/
 
-  SCAN(new ScanExecutor(), UNSUPPORTED,
-      new EvenParameterRequirements(ERROR_SYNTAX).and(new 
MinimumParameterRequirements(2))),
-  UNLINK(new DelExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
+  SCAN(new ScanExecutor(), UNSUPPORTED, new 
Parameter().min(2).even(ERROR_SYNTAX).firstKey(0).flags(readonly, random)),
+  UNLINK(new DelExecutor(), UNSUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write, fast)),
 
   /************** Strings ****************/
 
-  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  BITOP(new BitOpExecutor(), UNSUPPORTED, new MinimumParameterRequirements(4)),
-  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  GETBIT(new GetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
+  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
Parameter().min(2).flags(readonly)),
+  BITOP(new BitOpExecutor(), UNSUPPORTED,
+      new Parameter().min(4).firstKey(2).lastKey(-1).flags(write, denyoom)),
+  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
Parameter().min(3).flags(readonly)),
+  GETBIT(new GetBitExecutor(), UNSUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
   MSETNX(new MSetNXExecutor(), UNSUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  SETBIT(new SetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),
+  SETBIT(new SetBitExecutor(), UNSUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
 
   /**************** Sets *****************/
 
-  SCARD(new SCardExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
-  SDIFF(new SDiffExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
-  SDIFFSTORE(new SDiffStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  SINTER(new SInterExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SINTERSTORE(new SInterStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  SISMEMBER(new SIsMemberExecutor(), UNSUPPORTED, new 
ExactParameterRequirements(3)),
-  SMOVE(new SMoveExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
-  SPOP(new SPopExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX)).and(new 
SpopParameterRequirements())),
-  SRANDMEMBER(new SRandMemberExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SSCAN(new SScanExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  SUNION(new SUnionExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SUNIONSTORE(new SUnionStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
+  SCARD(new SCardExecutor(), UNSUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
+  SDIFF(new SDiffExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SDIFFSTORE(new SDiffStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
+  SINTER(new SInterExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SINTERSTORE(new SInterStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
+  SISMEMBER(new SIsMemberExecutor(), UNSUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  SMOVE(new SMoveExecutor(), UNSUPPORTED, new 
Parameter().exact(4).lastKey(2).flags(write, fast)),
+  SPOP(new SPopExecutor(), UNSUPPORTED, new Parameter().min(2).max(3, 
ERROR_SYNTAX)
+      .custom(SpopParameterRequirements.checkParameters()).flags(write, 
random, fast)),
+  SRANDMEMBER(new SRandMemberExecutor(), UNSUPPORTED,
+      new Parameter().min(2).flags(readonly, random)),
+  SSCAN(new SScanExecutor(), UNSUPPORTED, new 
Parameter().min(3).flags(readonly, random),
+      new Parameter().odd(ERROR_SYNTAX).firstKey(0)),
+  SUNION(new SUnionExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SUNIONSTORE(new SUnionStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
 
   /*************** Server ****************/
 
-  DBSIZE(new DBSizeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),
-  FLUSHALL(new FlushAllExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  FLUSHDB(new FlushAllExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  SHUTDOWN(new ShutDownExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  TIME(new TimeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),
+  DBSIZE(new DBSizeExecutor(), UNSUPPORTED, new 
Parameter().exact(1).firstKey(0).flags(readonly, fast)),
+  FLUSHALL(new FlushAllExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(write)),
+  FLUSHDB(new FlushAllExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(write)),
+  SHUTDOWN(new ShutDownExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(admin, 
noscript, loading,
+          stale)),
+  TIME(new TimeExecutor(), UNSUPPORTED,
+      new Parameter().exact(1).firstKey(0).flags(random, loading, stale, 
fast)),
 
   /***************************************
    *********** Unknown Commands **********
    ***************************************/
   UNKNOWN(new UnknownExecutor(), RedisCommandSupportLevel.UNKNOWN);
 
+  public enum Flag {
+    admin,

Review comment:
       I think our style guide for enum members is that they are uppercase 
since they are constants. These are all lowercase. Also you have some that use 
an underscore but others that are multiple words (denyoom, movablekeys, 
noscript, readonly) but do not use an underscore.

##########
File path: 
geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/RedisCommandType.java
##########
@@ -154,207 +165,274 @@
    ***************************************/
 
   /*************** Connection ****************/
-  AUTH(new AuthExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ECHO(new EchoExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PING(new PingExecutor(), SUPPORTED, new MaximumParameterRequirements(2)),
-  QUIT(new QuitExecutor(), SUPPORTED),
+  AUTH(new AuthExecutor(), SUPPORTED, new Parameter().min(2).max(3, 
ERROR_SYNTAX).firstKey(0)
+      .flags(noscript, loading, stale, fast, no_auth)),
+  ECHO(new EchoExecutor(), SUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(fast)),
+  PING(new PingExecutor(), SUPPORTED, new 
Parameter().min(1).max(2).firstKey(0).flags(stale, fast)),
+  QUIT(new QuitExecutor(), SUPPORTED, new Parameter().firstKey(0)),
 
   /*************** Keys ******************/
 
-  DEL(new DelExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  DUMP(new DumpExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  EXISTS(new ExistsExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  EXPIRE(new ExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  KEYS(new KeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PERSIST(new PersistExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PEXPIRE(new PExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  PTTL(new PTTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  RENAME(new RenameExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  RESTORE(new RestoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  TTL(new TTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  TYPE(new TypeExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  DEL(new DelExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write)),
+  DUMP(new DumpExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random)),
+  EXISTS(new ExistsExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  EXPIRE(new ExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  KEYS(new KeysExecutor(), SUPPORTED,
+      new Parameter().exact(2).firstKey(0).flags(readonly, sort_for_script)),
+  PERSIST(new PersistExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(write, fast)),
+  PEXPIRE(new PExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PTTL(new PTTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  RENAME(new RenameExecutor(), SUPPORTED, new 
Parameter().exact(3).lastKey(2).flags(write)),
+  RESTORE(new RestoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(write, denyoom)),
+  TTL(new TTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  TYPE(new TypeExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
 
   /************* Strings *****************/
 
-  APPEND(new AppendExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  DECR(new DecrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  DECRBY(new DecrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  GET(new GetExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETSET(new GetSetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCRBY(new IncrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCR(new IncrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  MGET(new MGetExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  MSET(new MSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  PSETEX(new PSetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SET(new SetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SETEX(new SetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SETNX(new SetNXExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  STRLEN(new StrlenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  APPEND(new AppendExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  DECR(new DecrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  DECRBY(new DecrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  GET(new GetExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  GETSET(new GetSetExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCRBY(new IncrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCR(new IncrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly)),
+  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(3).flags(write, denyoom, fast)),
+  MGET(new MGetExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  MSET(new MSetExecutor(), UNSUPPORTED,
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),
+  PSETEX(new PSetEXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  SET(new SetExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom)),
+  SETEX(new SetEXExecutor(), SUPPORTED, new Parameter().exact(4).flags(write, 
denyoom)),
+  SETNX(new SetNXExecutor(), SUPPORTED, new Parameter().exact(3).flags(write, 
denyoom, fast)),
+  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  STRLEN(new StrlenExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
 
   /************* Hashes *****************/
 
-  HDEL(new HDelExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HGET(new HGetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HGETALL(new HGetAllExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  HLEN(new HLenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HMGET(new HMGetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HMSET(new HMSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSET(new HSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSETNX(new HSetNXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HINCRBY(new HIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HVALS(new HValsExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HSCAN(new HScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  HEXISTS(new HExistsExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HKEYS(new HKeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  HDEL(new HDelExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  HGET(new HGetExecutor(), SUPPORTED, new Parameter().exact(3).flags(readonly, 
fast)),
+  HGETALL(new HGetAllExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, random)),
+  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write, denyoom, fast)),
+  HLEN(new HLenExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  HMGET(new HMGetExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
fast)),
+  HMSET(new HMSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSET(new HSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSETNX(new HSetNXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HINCRBY(new HIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HVALS(new HValsExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
+  HSCAN(new HScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  HEXISTS(new HExistsExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HKEYS(new HKeysExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
 
   /************* Sets *****************/
 
-  SADD(new SAddExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SMEMBERS(new SMembersExecutor(), SUPPORTED, new 
ExactParameterRequirements(2)),
-  SREM(new SRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
+  SADD(new SAddExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom, fast)),
+  SMEMBERS(new SMembersExecutor(), SUPPORTED,
+      new Parameter().exact(2).flags(readonly, sort_for_script)),
+  SREM(new SRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
 
   /************ Sorted Sets **************/
 
-  ZADD(new ZAddExecutor(), SUPPORTED, new MinimumParameterRequirements(4)),
-  ZCARD(new ZCardExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  ZCOUNT(new ZCountExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZRANGE(new ZRangeExecutor(), SUPPORTED, new MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANK(new ZRankExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZREM(new ZRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  ZSCAN(new ZScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  ZSCORE(new ZScoreExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
+  ZADD(new ZAddExecutor(), SUPPORTED, new Parameter().min(4).flags(write, 
denyoom, fast)),
+  ZCARD(new ZCardExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
+  ZCOUNT(new ZCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZRANGE(new ZRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANK(new ZRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZREM(new ZRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write)),
+  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(readonly)),
+  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZSCAN(new ZScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  ZSCORE(new ZScoreExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(write, denyoom, movablekeys)),
 
   /************* Server *****************/
-  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new 
SlowlogParameterRequirements()),
-  INFO(new InfoExecutor(), SUPPORTED, new MaximumParameterRequirements(2, 
ERROR_SYNTAX)),
+  COMMAND(new CommandExecutor(), SUPPORTED, new 
Parameter().min(1).firstKey(0).flags(random, loading, stale)),
+  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(SlowlogParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, loading, stale)),
+  INFO(new InfoExecutor(), SUPPORTED, new Parameter().min(1).max(2, 
ERROR_SYNTAX).firstKey(0)
+      .flags(random, loading, stale)),
 
   /********** Publish Subscribe **********/
-  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUBLISH(new PublishExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  PUBSUB(new PubSubExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
+  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, stale)),
+  PUBLISH(new PublishExecutor(), SUPPORTED,
+      new Parameter().exact(3).firstKey(0).flags(pubsub, loading, stale, fast, 
may_replicate)),
+  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUBSUB(new PubSubExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, random, loading, 
stale)),
 
   /************* Cluster *****************/
-  CLUSTER(new ClusterExecutor(), SUPPORTED, new 
ClusterParameterRequirements()),
+  CLUSTER(new ClusterExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(ClusterParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, stale)),
 
   /***************************************
    ********* Internal Commands ***********
    ***************************************/
   // do not call these directly, only to be used in other commands
-  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(3)),
+  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new Parameter().exact(3)),
 
   /***************************************
    ******** Unsupported Commands *********
    ***************************************/
 
   /*************** Connection *************/
 
-  SELECT(new SelectExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
+  SELECT(new SelectExecutor(), UNSUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(loading, stale, fast)),
 
   /*************** Keys ******************/
 
-  SCAN(new ScanExecutor(), UNSUPPORTED,
-      new EvenParameterRequirements(ERROR_SYNTAX).and(new 
MinimumParameterRequirements(2))),
-  UNLINK(new DelExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
+  SCAN(new ScanExecutor(), UNSUPPORTED, new 
Parameter().min(2).even(ERROR_SYNTAX).firstKey(0).flags(readonly, random)),
+  UNLINK(new DelExecutor(), UNSUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write, fast)),
 
   /************** Strings ****************/
 
-  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  BITOP(new BitOpExecutor(), UNSUPPORTED, new MinimumParameterRequirements(4)),
-  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  GETBIT(new GetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
+  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
Parameter().min(2).flags(readonly)),
+  BITOP(new BitOpExecutor(), UNSUPPORTED,
+      new Parameter().min(4).firstKey(2).lastKey(-1).flags(write, denyoom)),
+  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
Parameter().min(3).flags(readonly)),
+  GETBIT(new GetBitExecutor(), UNSUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
   MSETNX(new MSetNXExecutor(), UNSUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  SETBIT(new SetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),

Review comment:
       What do you think of the idea of getting rid of "new Parameter()." by 
adding static factory methods to Parameter. You could name one of them min(int) 
and the other exact(int). It seems like you always start with min or exact. 
This is not a big deal but might make this class a bit more readable.

##########
File path: 
geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/RedisCommandType.java
##########
@@ -154,207 +165,274 @@
    ***************************************/
 
   /*************** Connection ****************/
-  AUTH(new AuthExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ECHO(new EchoExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PING(new PingExecutor(), SUPPORTED, new MaximumParameterRequirements(2)),
-  QUIT(new QuitExecutor(), SUPPORTED),
+  AUTH(new AuthExecutor(), SUPPORTED, new Parameter().min(2).max(3, 
ERROR_SYNTAX).firstKey(0)
+      .flags(noscript, loading, stale, fast, no_auth)),
+  ECHO(new EchoExecutor(), SUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(fast)),
+  PING(new PingExecutor(), SUPPORTED, new 
Parameter().min(1).max(2).firstKey(0).flags(stale, fast)),
+  QUIT(new QuitExecutor(), SUPPORTED, new Parameter().firstKey(0)),
 
   /*************** Keys ******************/
 
-  DEL(new DelExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  DUMP(new DumpExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  EXISTS(new ExistsExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  EXPIRE(new ExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  KEYS(new KeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PERSIST(new PersistExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  PEXPIRE(new PExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  PTTL(new PTTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  RENAME(new RenameExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  RESTORE(new RestoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  TTL(new TTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  TYPE(new TypeExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  DEL(new DelExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write)),
+  DUMP(new DumpExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random)),
+  EXISTS(new ExistsExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  EXPIRE(new ExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  KEYS(new KeysExecutor(), SUPPORTED,
+      new Parameter().exact(2).firstKey(0).flags(readonly, sort_for_script)),
+  PERSIST(new PersistExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(write, fast)),
+  PEXPIRE(new PExpireExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, fast)),
+  PTTL(new PTTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  RENAME(new RenameExecutor(), SUPPORTED, new 
Parameter().exact(3).lastKey(2).flags(write)),
+  RESTORE(new RestoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(write, denyoom)),
+  TTL(new TTLExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
random, fast)),
+  TYPE(new TypeExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
 
   /************* Strings *****************/
 
-  APPEND(new AppendExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  DECR(new DecrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  DECRBY(new DecrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  GET(new GetExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETSET(new GetSetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCRBY(new IncrByExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  INCR(new IncrExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  MGET(new MGetExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
-  MSET(new MSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  PSETEX(new PSetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SET(new SetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SETEX(new SetEXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  SETNX(new SetNXExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  STRLEN(new StrlenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  APPEND(new AppendExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  DECR(new DecrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  DECRBY(new DecrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  GET(new GetExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  GETSET(new GetSetExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCRBY(new IncrByExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(write, denyoom, fast)),
+  INCR(new IncrExecutor(), SUPPORTED, new Parameter().exact(2).flags(write, 
denyoom, fast)),
+  GETRANGE(new GetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly)),
+  INCRBYFLOAT(new IncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(3).flags(write, denyoom, fast)),
+  MGET(new MGetExecutor(), SUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(readonly, fast)),
+  MSET(new MSetExecutor(), UNSUPPORTED,
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),
+  PSETEX(new PSetEXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  SET(new SetExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom)),
+  SETEX(new SetEXExecutor(), SUPPORTED, new Parameter().exact(4).flags(write, 
denyoom)),
+  SETNX(new SetNXExecutor(), SUPPORTED, new Parameter().exact(3).flags(write, 
denyoom, fast)),
+  SETRANGE(new SetRangeExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
+  STRLEN(new StrlenExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
 
   /************* Hashes *****************/
 
-  HDEL(new HDelExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HGET(new HGetExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HGETALL(new HGetAllExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  HLEN(new HLenExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HMGET(new HMGetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  HMSET(new HMSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSET(new HSetExecutor(), SUPPORTED,
-      new MinimumParameterRequirements(4).and(new 
EvenParameterRequirements())),
-  HSETNX(new HSetNXExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HINCRBY(new HIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  HVALS(new HValsExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  HSCAN(new HScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  HEXISTS(new HExistsExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  HKEYS(new HKeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
+  HDEL(new HDelExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  HGET(new HGetExecutor(), SUPPORTED, new Parameter().exact(3).flags(readonly, 
fast)),
+  HGETALL(new HGetAllExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, random)),
+  HINCRBYFLOAT(new HIncrByFloatExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write, denyoom, fast)),
+  HLEN(new HLenExecutor(), SUPPORTED, new Parameter().exact(2).flags(readonly, 
fast)),
+  HMGET(new HMGetExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
fast)),
+  HMSET(new HMSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSET(new HSetExecutor(), SUPPORTED, new 
Parameter().min(4).even().flags(write, denyoom, fast)),
+  HSETNX(new HSetNXExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HSTRLEN(new HStrLenExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HINCRBY(new HIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  HVALS(new HValsExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
+  HSCAN(new HScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  HEXISTS(new HExistsExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  HKEYS(new HKeysExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, sort_for_script)),
 
   /************* Sets *****************/
 
-  SADD(new SAddExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  SMEMBERS(new SMembersExecutor(), SUPPORTED, new 
ExactParameterRequirements(2)),
-  SREM(new SRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
+  SADD(new SAddExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
denyoom, fast)),
+  SMEMBERS(new SMembersExecutor(), SUPPORTED,
+      new Parameter().exact(2).flags(readonly, sort_for_script)),
+  SREM(new SRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
 
   /************ Sorted Sets **************/
 
-  ZADD(new ZAddExecutor(), SUPPORTED, new MinimumParameterRequirements(4)),
-  ZCARD(new ZCardExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
-  ZCOUNT(new ZCountExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new ExactParameterRequirements(4)),
-  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX))),
-  ZRANGE(new ZRangeExecutor(), SUPPORTED, new MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZRANK(new ZRankExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZREM(new ZRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
-  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED, new 
ExactParameterRequirements(4)),
-  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)
-      .and(new MaximumParameterRequirements(5, ERROR_SYNTAX))),
-  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
-  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
ExactParameterRequirements(3)),
-  ZSCAN(new ZScanExecutor(), SUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  ZSCORE(new ZScoreExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED, new 
MinimumParameterRequirements(4)),
+  ZADD(new ZAddExecutor(), SUPPORTED, new Parameter().min(4).flags(write, 
denyoom, fast)),
+  ZCARD(new ZCardExecutor(), SUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
+  ZCOUNT(new ZCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZINCRBY(new ZIncrByExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write, denyoom, fast)),
+  ZLEXCOUNT(new ZLexCountExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(readonly, fast)),
+  ZPOPMAX(new ZPopMaxExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZPOPMIN(new ZPopMinExecutor(), SUPPORTED,
+      new Parameter().min(2).max(3, ERROR_SYNTAX).flags(write, fast)),
+  ZRANGE(new ZRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZRANGEBYLEX(new ZRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANGEBYSCORE(new ZRangeByScoreExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZRANK(new ZRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZREM(new ZRemExecutor(), SUPPORTED, new Parameter().min(3).flags(write, 
fast)),
+  ZREMRANGEBYLEX(new ZRemRangeByLexExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYRANK(new ZRemRangeByRankExecutor(), SUPPORTED, new 
Parameter().exact(4).flags(write)),
+  ZREMRANGEBYSCORE(new ZRemRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().exact(4).flags(write)),
+  ZREVRANGE(new ZRevRangeExecutor(), SUPPORTED,
+      new Parameter().min(4).max(5, ERROR_SYNTAX).flags(readonly)),
+  ZREVRANGEBYLEX(new ZRevRangeByLexExecutor(), SUPPORTED, new 
Parameter().min(4).flags(readonly)),
+  ZREVRANGEBYSCORE(new ZRevRangeByScoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(readonly)),
+  ZREVRANK(new ZRevRankExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZSCAN(new ZScanExecutor(), SUPPORTED, new Parameter().min(3).flags(readonly, 
random),
+      new Parameter().odd(ERROR_SYNTAX)),
+  ZSCORE(new ZScoreExecutor(), SUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED,
+      new Parameter().min(4).flags(write, denyoom, movablekeys)),
 
   /************* Server *****************/
-  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new 
SlowlogParameterRequirements()),
-  INFO(new InfoExecutor(), SUPPORTED, new MaximumParameterRequirements(2, 
ERROR_SYNTAX)),
+  COMMAND(new CommandExecutor(), SUPPORTED, new 
Parameter().min(1).firstKey(0).flags(random, loading, stale)),
+  SLOWLOG(new SlowlogExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(SlowlogParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, loading, stale)),
+  INFO(new InfoExecutor(), SUPPORTED, new Parameter().min(1).max(2, 
ERROR_SYNTAX).firstKey(0)
+      .flags(random, loading, stale)),
 
   /********** Publish Subscribe **********/
-  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUBLISH(new PublishExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
-  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(2)),
-  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED, new 
MinimumParameterRequirements(1)),
-  PUBSUB(new PubSubExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
+  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new 
Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, stale)),
+  PUBLISH(new PublishExecutor(), SUPPORTED,
+      new Parameter().exact(3).firstKey(0).flags(pubsub, loading, stale, fast, 
may_replicate)),
+  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED,
+      new Parameter().min(1).firstKey(0).flags(pubsub, noscript, loading, 
stale)),
+  PUBSUB(new PubSubExecutor(), SUPPORTED,
+      new Parameter().min(2).firstKey(0).flags(pubsub, random, loading, 
stale)),
 
   /************* Cluster *****************/
-  CLUSTER(new ClusterExecutor(), SUPPORTED, new 
ClusterParameterRequirements()),
+  CLUSTER(new ClusterExecutor(), SUPPORTED, new Parameter().min(2)
+      .custom(ClusterParameterRequirements.checkParameters()).firstKey(0)
+      .flags(admin, random, stale)),
 
   /***************************************
    ********* Internal Commands ***********
    ***************************************/
   // do not call these directly, only to be used in other commands
-  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(2)),
-  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new 
ExactParameterRequirements(3)),
+  INTERNALPTTL(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALTYPE(new UnknownExecutor(), INTERNAL, new Parameter().exact(2)),
+  INTERNALSMEMBERS(new UnknownExecutor(), INTERNAL, new Parameter().exact(3)),
 
   /***************************************
    ******** Unsupported Commands *********
    ***************************************/
 
   /*************** Connection *************/
 
-  SELECT(new SelectExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
+  SELECT(new SelectExecutor(), UNSUPPORTED, new 
Parameter().exact(2).firstKey(0).flags(loading, stale, fast)),
 
   /*************** Keys ******************/
 
-  SCAN(new ScanExecutor(), UNSUPPORTED,
-      new EvenParameterRequirements(ERROR_SYNTAX).and(new 
MinimumParameterRequirements(2))),
-  UNLINK(new DelExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
+  SCAN(new ScanExecutor(), UNSUPPORTED, new 
Parameter().min(2).even(ERROR_SYNTAX).firstKey(0).flags(readonly, random)),
+  UNLINK(new DelExecutor(), UNSUPPORTED, new 
Parameter().min(2).lastKey(-1).flags(write, fast)),
 
   /************** Strings ****************/
 
-  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  BITOP(new BitOpExecutor(), UNSUPPORTED, new MinimumParameterRequirements(4)),
-  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  GETBIT(new GetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
+  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new 
Parameter().min(2).flags(readonly)),
+  BITOP(new BitOpExecutor(), UNSUPPORTED,
+      new Parameter().min(4).firstKey(2).lastKey(-1).flags(write, denyoom)),
+  BITPOS(new BitPosExecutor(), UNSUPPORTED, new 
Parameter().min(3).flags(readonly)),
+  GETBIT(new GetBitExecutor(), UNSUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
   MSETNX(new MSetNXExecutor(), UNSUPPORTED,
-      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
-  SETBIT(new SetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
+      new Parameter().min(3).odd().lastKey(-1).step(2).flags(write, denyoom)),
+  SETBIT(new SetBitExecutor(), UNSUPPORTED, new 
Parameter().exact(4).flags(write, denyoom)),
 
   /**************** Sets *****************/
 
-  SCARD(new SCardExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
-  SDIFF(new SDiffExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
-  SDIFFSTORE(new SDiffStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  SINTER(new SInterExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SINTERSTORE(new SInterStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
-  SISMEMBER(new SIsMemberExecutor(), UNSUPPORTED, new 
ExactParameterRequirements(3)),
-  SMOVE(new SMoveExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
-  SPOP(new SPopExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)
-      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX)).and(new 
SpopParameterRequirements())),
-  SRANDMEMBER(new SRandMemberExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SSCAN(new SScanExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3),
-      new OddParameterRequirements(ERROR_SYNTAX)),
-  SUNION(new SUnionExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(2)),
-  SUNIONSTORE(new SUnionStoreExecutor(), UNSUPPORTED, new 
MinimumParameterRequirements(3)),
+  SCARD(new SCardExecutor(), UNSUPPORTED, new 
Parameter().exact(2).flags(readonly, fast)),
+  SDIFF(new SDiffExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SDIFFSTORE(new SDiffStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
+  SINTER(new SInterExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SINTERSTORE(new SInterStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
+  SISMEMBER(new SIsMemberExecutor(), UNSUPPORTED, new 
Parameter().exact(3).flags(readonly, fast)),
+  SMOVE(new SMoveExecutor(), UNSUPPORTED, new 
Parameter().exact(4).lastKey(2).flags(write, fast)),
+  SPOP(new SPopExecutor(), UNSUPPORTED, new Parameter().min(2).max(3, 
ERROR_SYNTAX)
+      .custom(SpopParameterRequirements.checkParameters()).flags(write, 
random, fast)),
+  SRANDMEMBER(new SRandMemberExecutor(), UNSUPPORTED,
+      new Parameter().min(2).flags(readonly, random)),
+  SSCAN(new SScanExecutor(), UNSUPPORTED, new 
Parameter().min(3).flags(readonly, random),
+      new Parameter().odd(ERROR_SYNTAX).firstKey(0)),
+  SUNION(new SUnionExecutor(), UNSUPPORTED,
+      new Parameter().min(2).lastKey(-1).flags(readonly, sort_for_script)),
+  SUNIONSTORE(new SUnionStoreExecutor(), UNSUPPORTED,
+      new Parameter().min(3).lastKey(-1).flags(write, denyoom)),
 
   /*************** Server ****************/
 
-  DBSIZE(new DBSizeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),
-  FLUSHALL(new FlushAllExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  FLUSHDB(new FlushAllExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  SHUTDOWN(new ShutDownExecutor(), UNSUPPORTED, new 
MaximumParameterRequirements(2, ERROR_SYNTAX)),
-  TIME(new TimeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),
+  DBSIZE(new DBSizeExecutor(), UNSUPPORTED, new 
Parameter().exact(1).firstKey(0).flags(readonly, fast)),
+  FLUSHALL(new FlushAllExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(write)),
+  FLUSHDB(new FlushAllExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(write)),
+  SHUTDOWN(new ShutDownExecutor(), UNSUPPORTED,
+      new Parameter().min(1).max(2, ERROR_SYNTAX).firstKey(0).flags(admin, 
noscript, loading,
+          stale)),
+  TIME(new TimeExecutor(), UNSUPPORTED,
+      new Parameter().exact(1).firstKey(0).flags(random, loading, stale, 
fast)),
 
   /***************************************
    *********** Unknown Commands **********
    ***************************************/
   UNKNOWN(new UnknownExecutor(), RedisCommandSupportLevel.UNKNOWN);
 
+  public enum Flag {
+    admin,
+    denyoom,
+    fast,
+    loading,
+    may_replicate,
+    movablekeys,
+    no_auth,
+    noscript,
+    pubsub,
+    random,
+    readonly,
+    sort_for_script,
+    stale,
+    write;
+  }
+
   private final Executor executor;
-  private final ParameterRequirements parameterRequirements;
-  private final ParameterRequirements deferredParameterRequirements;
+  private final Parameter parameterRequirements;
+  private final Parameter deferredParameterRequirements;
   private final RedisCommandSupportLevel supportLevel;
 
   RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel) {
-    this(executor, supportLevel, new UnspecifiedParameterRequirements());
+    this(executor, supportLevel, new Parameter().custom((c, e) -> {
+    }));
   }
 
   RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel,
-      ParameterRequirements parameterRequirements) {
-    this(executor, supportLevel, parameterRequirements, new 
UnspecifiedParameterRequirements());
+      Parameter parameterRequirements) {
+    this(executor, supportLevel, parameterRequirements, new 
Parameter().custom((c, e) -> {
+    }));
   }
 
   RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel,
-      ParameterRequirements parameterRequirements,
-      ParameterRequirements deferredParameterRequirements) {
+      Parameter parameterRequirements,
+      Parameter deferredParameterRequirements) {
     this.executor = executor;
     this.supportLevel = supportLevel;
     this.parameterRequirements = parameterRequirements;
     this.deferredParameterRequirements = deferredParameterRequirements;
   }
 
+  public int arity() {
+    return parameterRequirements.getArity();
+  }
+
+  public List<Flag> flags() {

Review comment:
       instead of a List<Flag> should this be EnumSet<Flag>?




-- 
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.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to