/*
 * Copyright 2011 Greplin, Inc. All Rights Reserved.
 */

package com.greplin.lucene.filter;

import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanFilter;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FilterClause;

import javax.annotation.Nullable;

/**
 * Static utility methods for Filters.
 */
public final class Filters {

  /** Not instantiable. */
  private Filters() { }


  /**
   * Returns a filter that allows documents that match every constituent
   * filter.  For convenience, null values are accepted and ignored.  If
   * all values are null, null will be returned.
   * @param filters the filters to combine
   * @return the combined filter
   */
  @Nullable public static Filter and(@Nullable final Filter... filters) {
    final BooleanFilter booleanFilter = new BooleanFilter();

    Filter lastFilter = null;
    int count = 0;
    for (Filter filter : filters) {
      if (filter != null) {
        booleanFilter.add(new FilterClause(filter, BooleanClause.Occur.MUST));
        count += 1;
        lastFilter = filter;
      }
    }

    if (count == 0) {
      return null;
    } else if (count == 1) {
      return lastFilter;
    } else {
      return booleanFilter;
    }
  }


  /**
   * Returns a filter matching the inverse of the given filter.
   * @param filter the filter to return the opposite ofnegate
   * @return the negated filter
   */
  public static Filter not(final Filter filter) {
    final BooleanFilter booleanFilter = new BooleanFilter();
    booleanFilter.add(new FilterClause(filter, BooleanClause.Occur.MUST_NOT));
    return booleanFilter;
  }

}

@@ -432,24 +432,846 @@
 ers() %7B %7D%0A%0A%0A
+  /**%0A   * Returns a filter that allows documents that match any constituent%0A   * filter.  For convenience, null values are accepted and ignored.  If%0A   * all values are null, null will be returned.%0A   * @param filters the filters to combine%0A   * @return the combined filter%0A   */%0A  @Nullable public static Filter or(@Nullable final Filter... filters) %7B%0A    final BooleanFilter booleanFilter = new BooleanFilter();%0A%0A    Filter lastFilter = null;%0A    int count = 0;%0A    for (Filter filter : filters) %7B%0A      if (filter != null) %7B%0A        booleanFilter.add(new FilterClause(filter, BooleanClause.Occur.SHOULD));%0A        count += 1;%0A        lastFilter = filter;%0A      %7D%0A    %7D%0A%0A    if (count == 0) %7B%0A      return null;%0A    %7D else if (count == 1) %7B%0A      return lastFilter;%0A    %7D else %7B%0A      return booleanFilter;%0A    %7D%0A  %7D%0A%0A%0A
   /**%0A   * R

Add Filters.or