mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

matthew_swift
05.42.2009 22094368c2865dcfb6daf8366425212b721a4657
opends/src/server/org/opends/server/backends/jeb/IndexQuery.java
@@ -25,185 +25,198 @@
 *      Copyright 2009 Sun Microsystems, Inc.
 */
package org.opends.server.backends.jeb;
import java.util.Collection;
import static org.opends.server.backends.jeb.IndexFilter.*;
/**
 * This class represents a JE Backend Query.
 */
@org.opends.server.types.PublicAPI(
     stability=org.opends.server.types.StabilityLevel.VOLATILE,
     mayInstantiate=false,
     mayExtend=true,
     mayInvoke=false)
    stability = org.opends.server.types.StabilityLevel.VOLATILE,
    mayInstantiate = false,
    mayExtend = true,
    mayInvoke = false)
public abstract class IndexQuery
{
  /**
  * Evaluates the index query and returns the EntryIDSet.
  * @return The EntryIDSet as a result of evaulation of this query.
  */
   * Evaluates the index query and returns the EntryIDSet.
   *
   * @return The EntryIDSet as a result of evaulation of this query.
   */
  public abstract EntryIDSet evaluate();
   /**
    * Creates an IntersectionIndexQuery object from a collection of IndexQuery
    * objects.
    * @param subIndexQueries A collection of IndexQuery objects.
    * @return An IntersectionIndexQuery object.
    */
   public static IndexQuery createIntersectionIndexQuery(
           Collection<IndexQuery> subIndexQueries)
   {
     return new IntersectionIndexQuery(subIndexQueries);
   }
   /**
    * Creates a union IndexQuery object from a collection of IndexQuery
    * objects.
    * @param subIndexQueries Collection of IndexQuery objects.
    * @return A UnionIndexQuery object.
    */
   public static IndexQuery createUnionIndexQuery(
           Collection<IndexQuery> subIndexQueries)
   {
     return new UnionIndexQuery(subIndexQueries);
   }
   /**
    * Creates an empty IndexQuery object.
    * @return A NullIndexQuery object.
    */
   public static IndexQuery createNullIndexQuery()
   {
     return new NullIndexQuery();
   }
}
/**
* This class creates a Null  IndexQuery. It is used when there
*  is no record in the index. It may also be used when the
 * index contains all the records but an empty EntryIDSet should be
 * returned as part of the optimization.
*/
final class NullIndexQuery extends IndexQuery
{
  /**
   * {@inheritDoc}
   * Creates an IntersectionIndexQuery object from a collection of
   * IndexQuery objects.
   *
   * @param subIndexQueries
   *          A collection of IndexQuery objects.
   * @return An IntersectionIndexQuery object.
   */
  @Override
  public EntryIDSet evaluate()
  public static IndexQuery createIntersectionIndexQuery(
      Collection<IndexQuery> subIndexQueries)
  {
    return new EntryIDSet();
  }
}
/**
 * This class creates an intersection IndexQuery from a collection of
 * IndexQuery objects.
 */
final class IntersectionIndexQuery extends IndexQuery
{
  /**
   * Collection of IndexQuery objects.
   */
  private final  Collection<IndexQuery> subIndexQueries;
  /**
   * Creates an instance of IntersectionIndexQuery.
   * @param subIndexQueries Collection of IndexQuery objects.
   */
  IntersectionIndexQuery(Collection<IndexQuery> subIndexQueries)
  {
    this.subIndexQueries = subIndexQueries;
    return new IntersectionIndexQuery(subIndexQueries);
  }
  /**
   * {@inheritDoc}
   */
  @Override
  public EntryIDSet evaluate()
  {
   EntryIDSet entryIDs = null;
   for (IndexQuery query : subIndexQueries)
   {
     if (entryIDs == null)
     {
       entryIDs = query.evaluate();
     }
     else
     {
       entryIDs.retainAll(query.evaluate());
     }
     if (entryIDs.isDefined() &&
         entryIDs.size() <= FILTER_CANDIDATE_THRESHOLD)
     {
       break;
     }
   }
   return entryIDs;
  }
}
/**
 * This class creates a union of IndexQuery objects.
 */
final class UnionIndexQuery extends IndexQuery
{
  /**
   * Collection containing IndexQuery objects.
   */
  private final Collection<IndexQuery> subIndexQueries;
  /**
   * Creates an instance of UnionIndexQuery.
   * @param subIndexQueries The Collection of IndexQuery objects.
   * Creates a union IndexQuery object from a collection of IndexQuery
   * objects.
   *
   * @param subIndexQueries
   *          Collection of IndexQuery objects.
   * @return A UnionIndexQuery object.
   */
  UnionIndexQuery(Collection<IndexQuery> subIndexQueries)
  public static IndexQuery createUnionIndexQuery(
      Collection<IndexQuery> subIndexQueries)
  {
    this.subIndexQueries = subIndexQueries;
    return new UnionIndexQuery(subIndexQueries);
  }
  /**
   * {@inheritDoc}
   * Creates an empty IndexQuery object.
   *
   * @return A NullIndexQuery object.
   */
  @Override
  public EntryIDSet evaluate()
  public static IndexQuery createNullIndexQuery()
  {
    EntryIDSet entryIDs = null;
    for (IndexQuery query : subIndexQueries)
    return new NullIndexQuery();
  }
  /**
   * This class creates a Null IndexQuery. It is used when there is no
   * record in the index. It may also be used when the index contains
   * all the records but an empty EntryIDSet should be returned as part
   * of the optimization.
   */
  private static final class NullIndexQuery extends IndexQuery
  {
    /**
     * {@inheritDoc}
     */
    @Override
    public EntryIDSet evaluate()
    {
      if (entryIDs == null)
      {
        entryIDs = query.evaluate();
      }
      else
      {
        entryIDs.addAll(query.evaluate());
      }
      if (entryIDs.isDefined() &&
          entryIDs.size() <= FILTER_CANDIDATE_THRESHOLD)
      {
        break;
      }
      return new EntryIDSet();
    }
    return entryIDs;
  }
}
  /**
   * This class creates an intersection IndexQuery from a collection of
   * IndexQuery objects.
   */
  private static final class IntersectionIndexQuery extends IndexQuery
  {
    /**
     * Collection of IndexQuery objects.
     */
    private final Collection<IndexQuery> subIndexQueries;
    /**
     * Creates an instance of IntersectionIndexQuery.
     *
     * @param subIndexQueries
     *          Collection of IndexQuery objects.
     */
    private IntersectionIndexQuery(Collection<IndexQuery> subIndexQueries)
    {
      this.subIndexQueries = subIndexQueries;
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public EntryIDSet evaluate()
    {
      EntryIDSet entryIDs = null;
      for (IndexQuery query : subIndexQueries)
      {
        if (entryIDs == null)
        {
          entryIDs = query.evaluate();
        }
        else
        {
          entryIDs.retainAll(query.evaluate());
        }
        if (entryIDs.isDefined()
            && entryIDs.size() <= FILTER_CANDIDATE_THRESHOLD)
        {
          break;
        }
      }
      return entryIDs;
    }
  }
  /**
   * This class creates a union of IndexQuery objects.
   */
  private static final class UnionIndexQuery extends IndexQuery
  {
    /**
     * Collection containing IndexQuery objects.
     */
    private final Collection<IndexQuery> subIndexQueries;
    /**
     * Creates an instance of UnionIndexQuery.
     *
     * @param subIndexQueries
     *          The Collection of IndexQuery objects.
     */
    private UnionIndexQuery(Collection<IndexQuery> subIndexQueries)
    {
      this.subIndexQueries = subIndexQueries;
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public EntryIDSet evaluate()
    {
      EntryIDSet entryIDs = null;
      for (IndexQuery query : subIndexQueries)
      {
        if (entryIDs == null)
        {
          entryIDs = query.evaluate();
        }
        else
        {
          entryIDs.addAll(query.evaluate());
        }
        if (entryIDs.isDefined()
            && entryIDs.size() <= FILTER_CANDIDATE_THRESHOLD)
        {
          break;
        }
      }
      return entryIDs;
    }
  }
}