SortComparator.java
01 package gate.creole.annic.apache.lucene.search;
02 
03 import gate.creole.annic.apache.lucene.index.IndexReader;
04 import java.io.IOException;
05 
06 /**
07  * Abstract base class for sorting hits returned by a Query.
08  *
09  <p>This class should only be used if the other SortField
10  * types (SCORE, DOC, STRING, INT, FLOAT) do not provide an
11  * adequate sorting.  It maintains an internal cache of values which
12  * could be quite large.  The cache is an array of Comparable,
13  * one for each document in the index.  There is a distinct
14  * Comparable for each unique term in the field - if
15  * some documents have the same term in the field, the cache
16  * array will have entries which reference the same Comparable.
17  *
18  <p>Created: Apr 21, 2004 5:08:38 PM
19  *
20  @author  Tim Jones
21  @version $Id: SortComparator.java 529 2004-10-05 11:55:26Z niraj $
22  @since   1.4
23  */
24 @SuppressWarnings({"serial","rawtypes","unchecked"})
25 public abstract class SortComparator
26 implements SortComparatorSource {
27 
28   // inherit javadocs
29   @Override
30   public ScoreDocComparator newComparator (final IndexReader reader, final String fieldname)
31   throws IOException {
32     final String field = fieldname.intern();
33     return new ScoreDocComparator() {
34       protected Comparable[] cachedValues = FieldCache.DEFAULT.getCustom (reader, field, SortComparator.this);
35 
36       @Override
37       public int compare (ScoreDoc i, ScoreDoc j) {
38         return cachedValues[i.doc].compareTo (cachedValues[j.doc]);
39       }
40 
41       @Override
42       public Comparable sortValue (ScoreDoc i) {
43         return cachedValues[i.doc];
44       }
45 
46       @Override
47       public int sortType(){
48         return SortField.CUSTOM;
49       }
50     };
51   }
52 
53   /**
54    * Returns an object which, when sorted according to natural order,
55    * will order the Term values in the correct order.
56    <p>For example, if the Terms contained integer values, this method
57    * would return <code>new Integer(termtext)</code>.  Note that this
58    * might not always be the most efficient implementation - for this
59    * particular example, a better implementation might be to make a
60    * ScoreDocLookupComparator that uses an internal lookup table of int.
61    @param termtext The textual value of the term.
62    @return An object representing <code>termtext</code> that sorts according to the natural order of <code>termtext</code>.
63    @see Comparable
64    @see ScoreDocComparator
65    */
66   protected abstract Comparable getComparable (String termtext);
67 
68 }