SearchQuery.java

/*
 * SearchQuery
 */
package gov.usgs.earthquake.indexer;

/**
 * A search to execute against a ProductIndex, or ProductStorage.
 */
public abstract class SearchQuery implements Comparable<SearchQuery> {

  /** The type of response that is expected. */
  private final SearchMethod type;

  /** The search parameters. */
  private final ProductIndexQuery query;

  /** Contains an error returned in a SearchResult if one occurred **/
  private String error;

  /**
   * Construct a new SearchQuery object.
   *
   * @param type  the type of search.
   * @param query the query parameters.
   */
  protected SearchQuery(final SearchMethod type, final ProductIndexQuery query) {
    this.type = type;
    this.query = query;
    this.error = null;
  }

  /** @return type */
  public SearchMethod getType() {
    return this.type;
  }

  /** @return ProductIndexQuery */
  public ProductIndexQuery getProductIndexQuery() {
    return this.query;
  }

  /**
   * Get the result associated with a specific query type.
   *
   * @return the result, or null if the search has not yet executed.
   */
  public abstract Object getResult();

  /**
   * Create a SearchQuery object based on a SearchType.
   *
   * @param type  the search type to create
   * @param query the associated query
   * @return a SearchQuery, or null if type is unknown.
   */
  public static SearchQuery getSearchQuery(final SearchMethod type, final ProductIndexQuery query) {
    if (type == null) {
      return null;
    } else if (type.equals(SearchMethod.EVENTS_SUMMARY)) {
      return new EventsSummaryQuery(query);
    } else if (type.equals(SearchMethod.EVENT_DETAIL)) {
      return new EventDetailQuery(query);
    } else if (type.equals(SearchMethod.PRODUCTS_SUMMARY)) {
      return new ProductsSummaryQuery(query);
    } else if (type.equals(SearchMethod.PRODUCT_DETAIL)) {
      return new ProductDetailQuery(query);
    } else {
      return null;
    }
  }

  @Override
  public boolean equals(Object that) {
    return (this.compareTo((SearchQuery) that)) == 0;
  }

  @Override
  public int compareTo(SearchQuery that) {
    int r;

    if ((r = this.type.compareTo(that.type)) != 0) {
      return r;
    }

    if ((r = this.query.compareTo(that.query)) != 0) {
      return r;
    }

    // both have results
    Object thatResult = that.getResult();
    Object thisResult = this.getResult();
    if (thisResult == null && thatResult == null) {
      return 0;
    } else if (thisResult != null && thatResult == null) {
      return -1;
    } else if (thisResult == null && thatResult != null) {
      return 1;
    }

    return 0;
  }

  /**
   * @param error the error to set
   */
  public void setError(String error) {
    this.error = error;
  }

  /**
   * @return the error or null if no error occurred.
   */
  public String getError() {
    return error;
  }

}