SUnionCardParams.java

package redis.clients.jedis.params;

import java.util.Objects;

import redis.clients.jedis.CommandArguments;
import redis.clients.jedis.Protocol.Keyword;

/**
 * Parameters for the {@code SUNIONCARD} command. Options are emitted in the canonical order:
 * {@code APPROX} before {@code LIMIT}.
 * <p>
 * Usage examples:
 *
 * <pre>
 *   new SUnionCardParams().approx().limit(1000)
 *   SUnionCardParams.sUnionCardParams().limit(3)
 * </pre>
 *
 * @since 8.0
 */
public class SUnionCardParams implements IParams {

  private boolean approx;
  private Long limit;

  public static SUnionCardParams sUnionCardParams() {
    return new SUnionCardParams();
  }

  /**
   * Return an approximate cardinality using HyperLogLog (standard error ~0.81%).
   * @return SUnionCardParams
   */
  public SUnionCardParams approx() {
    this.approx = true;
    return this;
  }

  /**
   * Cap the returned cardinality at {@code limit}. {@code LIMIT 0} means no limit.
   * @param limit non-negative cap
   * @return SUnionCardParams
   */
  public SUnionCardParams limit(long limit) {
    if (limit < 0) {
      throw new IllegalArgumentException("LIMIT must be non-negative");
    }
    this.limit = limit;
    return this;
  }

  @Override
  public void addParams(CommandArguments args) {
    if (approx) {
      args.add(Keyword.APPROX);
    }
    if (limit != null) {
      args.add(Keyword.LIMIT);
      args.add(limit);
    }
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof SUnionCardParams)) return false;
    SUnionCardParams that = (SUnionCardParams) o;
    return approx == that.approx && Objects.equals(limit, that.limit);
  }

  @Override
  public int hashCode() {
    return Objects.hash(approx, limit);
  }
}