pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / facet / src / java / org / apache / lucene / facet / index / params / CategoryListParams.java
diff --git a/lucene-java-3.5.0/lucene/contrib/facet/src/java/org/apache/lucene/facet/index/params/CategoryListParams.java b/lucene-java-3.5.0/lucene/contrib/facet/src/java/org/apache/lucene/facet/index/params/CategoryListParams.java
new file mode 100644 (file)
index 0000000..f40c4ab
--- /dev/null
@@ -0,0 +1,149 @@
+package org.apache.lucene.facet.index.params;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+
+import org.apache.lucene.facet.search.CategoryListIterator;
+import org.apache.lucene.facet.search.PayloadIntDecodingIterator;
+import org.apache.lucene.facet.search.TotalFacetCounts;
+import org.apache.lucene.facet.util.PartitionsUtils;
+import org.apache.lucene.util.encoding.DGapIntEncoder;
+import org.apache.lucene.util.encoding.IntDecoder;
+import org.apache.lucene.util.encoding.IntEncoder;
+import org.apache.lucene.util.encoding.SortingIntEncoder;
+import org.apache.lucene.util.encoding.UniqueValuesIntEncoder;
+import org.apache.lucene.util.encoding.VInt8IntEncoder;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Contains parameters for a category list *
+ * 
+ * @lucene.experimental
+ */
+public class CategoryListParams implements Serializable {
+
+  /** The default term used to store the facets information. */
+  public static final Term DEFAULT_TERM = new Term("$facets", "$fulltree$");
+
+  private final Term term;
+
+  private final int hashCode;
+
+  /**
+   * Constructs a default category list parameters object, using
+   * {@link #DEFAULT_TERM}.
+   */
+  public CategoryListParams() {
+    this(DEFAULT_TERM);
+  }
+
+  /**
+   * Constructs a category list parameters object, using the given {@link Term}.
+   * @param term who's payload hold the category-list.
+   */
+  public CategoryListParams(Term term) {
+    this.term = term;
+    // Pre-compute the hashCode because these objects are immutable.  Saves
+    // some time on the comparisons later.
+    this.hashCode = term.hashCode();
+  }
+  
+  /** 
+   * A {@link Term} who's payload holds the category-list. 
+   */
+  public final Term getTerm() {
+    return term;
+  }
+
+  /**
+   * Allows to override how categories are encoded and decoded. A matching
+   * {@link IntDecoder} is provided by the {@link IntEncoder}.
+   * <p>
+   * Default implementation creates a new Sorting(<b>Unique</b>(DGap)) encoder.
+   * Uniqueness in this regard means when the same category appears twice in a
+   * document, only one appearance would be encoded. This has effect on facet
+   * counting results.
+   * <p>
+   * Some possible considerations when overriding may be:
+   * <ul>
+   * <li>an application "knows" that all categories are unique. So no need to
+   * pass through the unique filter.</li>
+   * <li>Another application might wish to count multiple occurrences of the
+   * same category, or, use a faster encoding which will consume more space.</li>
+   * </ul>
+   * In any event when changing this value make sure you know what you are
+   * doing, and test the results - e.g. counts, if the application is about
+   * counting facets.
+   */
+  public IntEncoder createEncoder() {
+    return new SortingIntEncoder(new UniqueValuesIntEncoder(new DGapIntEncoder(new VInt8IntEncoder())));
+  }
+
+  /**
+   * Equality is defined by the 'term' that defines this category list.  
+   * Sub-classes should override this method if a more complex calculation
+   * is needed to ensure equality. 
+   */
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (!(o instanceof CategoryListParams)) {
+      return false;
+    }
+    CategoryListParams other = (CategoryListParams) o;
+    if (this.hashCode != other.hashCode) {
+      return false;
+    }
+    // The above hashcodes might equal each other in the case of a collision,
+    // so at this point only directly term equality testing will settle
+    // the equality test.
+    return this.term.equals(other.term);
+  }
+
+  /**
+   * Hashcode is similar to {@link #equals(Object)}, in that it uses
+   * the term that defines this category list to derive the hashcode.
+   * Subclasses need to ensure that equality/hashcode is correctly defined,
+   * or there could be side-effects in the {@link TotalFacetCounts} caching 
+   * mechanism (as the filename for a Total Facet Counts array cache 
+   * is dependent on the hashCode, so it should consistently return the same
+   * hash for identity).
+   */
+  @Override
+  public int hashCode() {
+    return this.hashCode;
+  }
+
+  /**
+   * Create the category list iterator for the specified partition.
+   */
+  public CategoryListIterator createCategoryListIterator(IndexReader reader,
+      int partition) throws IOException {
+    String categoryListTermStr = PartitionsUtils.partitionName(this, partition);
+    Term payloadTerm = term.createTerm(categoryListTermStr);
+    return new PayloadIntDecodingIterator(reader, payloadTerm,
+        createEncoder().createMatchingDecoder());
+  }
+  
+}
\ No newline at end of file