content: package redis.clients.jedis.params.sortedset;
  
  import redis.clients.jedis.params.Params;
  import redis.clients.util.SafeEncoder;
  
  import java.util.ArrayList;
  
  /**
   * Parameters for ZINCRBY commands <br/>
   * <br/>
   * In fact, Redis doesn't have parameters for ZINCRBY. Instead Redis has INCR parameter for ZADD.<br/>
   * When users call ZADD with INCR option, its restriction (only one member) and return type is same
   * to ZINCRBY. <br/>
   * Document page for ZADD also describes INCR option to act like ZINCRBY. <br/>
   * http://redis.io/commands/zadd <br/>
   * <br/>
   * So we decided to wrap "ZADD with INCR option" to ZINCRBY. <br/>
   * https://github.com/xetorthio/jedis/issues/1067 <br/>
   * <br/>
   * Works with Redis 3.0.2 and onwards.
   */
  public class ZIncrByParams extends Params {
  
    private static final String XX = "xx";
    private static final String NX = "nx";
    private static final String INCR = "incr";
  
    private ZIncrByParams() {
    }
  
    public static ZIncrByParams zIncrByParams() {
      return new ZIncrByParams();
    }
  
    /**
     * Only set the key if it does not already exist.
     * @return ZIncrByParams
     */
    public ZIncrByParams nx() {
      addParam(NX);
      return this;
    }
  
    /**
     * Only set the key if it already exist.
     * @return ZIncrByParams
     */
    public ZIncrByParams xx() {
      addParam(XX);
      return this;
    }
  
    public byte[][] getByteParams(byte[] key, byte[]... args) {
      ArrayList<byte[]> byteParams = new ArrayList<byte[]>();
      byteParams.add(key);
  
      if (contains(NX)) {
        byteParams.add(SafeEncoder.encode(NX));
      }
      if (contains(XX)) {
        byteParams.add(SafeEncoder.encode(XX));
      }
  
      byteParams.add(SafeEncoder.encode(INCR));
  
      for (byte[] arg : args) {
        byteParams.add(arg);
      }
  
      return byteParams.toArray(new byte[byteParams.size()][]);
    }
  
  }
  