package com.avaje.ebean.search;

/**
 * Text common terms query.
 * <p>
 * This maps to an ElasticSearch "common terms query".
 * </p>

 * <pre>{@code
 *
 *  TextCommonTerms options = new TextCommonTerms()
 *    .cutoffFrequency(0.001)
 *    .minShouldMatch("50%")
 *    .lowFreqOperatorAnd(true)
 *    .highFreqOperatorAnd(true);
 *
 *  List<Customer> customers = server.find(Customer.class)
 *    .text()
 *    .textCommonTerms("the brown", options)
 *    .findList();
 *
 * }</pre>
 *
 * <pre>{@code
 *
 *   // ElasticSearch expression
 *
 *   "common": {
 *     "body": {
 *       "query": "the brown",
 *       "cutoff_frequency": 0.001,
 *       "low_freq_operator": "and",
 *       "high_freq_operator": "and",
 *       "minimum_should_match": "50%"
 *     }
 *   }
 *
 * }</pre>
 */
public class TextCommonTerms {

  protected double cutoffFrequency;

  protected boolean lowFreqOperatorAnd;
  protected boolean highFreqOperatorAnd;

  protected String minShouldMatch;
  protected String minShouldMatchLowFreq;
  protected String minShouldMatchHighFreq;

  /**
   * Set the cutoff frequency.
   */
  public TextCommonTerms cutoffFrequency(double cutoffFrequency) {
    this.cutoffFrequency = cutoffFrequency;
    return this;
  }

  /**
   * Set to true if low frequency terms should use AND operator.
   */
  public TextCommonTerms lowFreqOperatorAnd(boolean opAnd) {
    this.lowFreqOperatorAnd = opAnd;
    return this;
  }

  /**
   * Set to true if high frequency terms should use AND operator.
   */
  public TextCommonTerms highFreqOperatorAnd(boolean opAnd) {
    this.highFreqOperatorAnd = opAnd;
    return this;
  }

  /**
   * Set the minimum should match.
   */
  public TextCommonTerms minShouldMatch(String minShouldMatch) {
    this.minShouldMatch = minShouldMatch;
    return this;
  }

  /**
   * Set the minimum should match for low frequency terms.
   */
  public TextCommonTerms minShouldMatchLowFreq(String minShouldMatchLowFreq) {
    this.minShouldMatchLowFreq = minShouldMatchLowFreq;
    return this;
  }

  /**
   * Set the minimum should match for high frequency terms.
   */
  public TextCommonTerms minShouldMatchHighFreq(String minShouldMatchHighFreq) {
    this.minShouldMatchHighFreq = minShouldMatchHighFreq;
    return this;
  }

  /**
   * Return true if low freq should use the AND operator.
   */
  public boolean isLowFreqOperatorAnd() {
    return lowFreqOperatorAnd;
  }

  /**
   * Return true if high freq should use the AND operator.
   */
  public boolean isHighFreqOperatorAnd() {
    return highFreqOperatorAnd;
  }

  /**
   * Return the cutoff frequency.
   */
  public double getCutoffFrequency() {
    return cutoffFrequency;
  }

  /**
   * Return the minimum to match.
   */
  public String getMinShouldMatch() {
    return minShouldMatch;
  }

  /**
   * Return the minimum to match for high frequency.
   */
  public String getMinShouldMatchHighFreq() {
    return minShouldMatchHighFreq;
  }

  /**
   * Return the minimum to match for low frequency.
   */
  public String getMinShouldMatchLowFreq() {
    return minShouldMatchLowFreq;
  }

}
