You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by yo...@apache.org on 2009/06/07 03:16:16 UTC

svn commit: r782324 - /lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java

Author: yonik
Date: Sun Jun  7 01:16:15 2009
New Revision: 782324

URL: http://svn.apache.org/viewvc?rev=782324&view=rev
Log:
SOLR-1111: convert RandomSortField to use new FieldComparatorSource

Modified:
    lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java

Modified: lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java?rev=782324&r1=782323&r2=782324&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/schema/RandomSortField.java Sun Jun  7 01:16:15 2009
@@ -18,17 +18,16 @@
 package org.apache.solr.schema;
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.ScoreDocComparator;
-import org.apache.lucene.search.SortComparatorSource;
-import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.*;
 import org.apache.solr.request.TextResponseWriter;
 import org.apache.solr.request.XMLWriter;
 import org.apache.solr.search.function.DocValues;
 import org.apache.solr.search.function.ValueSource;
+import org.apache.solr.search.SolrIndexReader;
 
 /**
  * Utility Field used for random sorting.  It should not be passed a value.
@@ -79,12 +78,21 @@
    * Using dynamic fields, you can force the random order to change 
    */
   private static int getSeed(String fieldName, IndexReader r) {
-    return (int) (fieldName.hashCode()^r.getVersion() );
+    SolrIndexReader top = (SolrIndexReader)r;
+    int base=0;
+    while (top.getParent() != null) {
+      base += top.getBase();
+      top = top.getParent();
+    }
+
+    // calling getVersion() on a segment will currently give you a null pointer exception, so
+    // we use the top-level reader.
+    return fieldName.hashCode() + base + (int)top.getVersion();
   }
 
   @Override
   public SortField getSortField(SchemaField field, boolean reverse) {
-    return new RandomSort(field.getName(), reverse);
+    return new SortField(field.getName(), randomComparatorSource, reverse);
   }
 
   @Override
@@ -98,60 +106,47 @@
   @Override
   public void write(TextResponseWriter writer, String name, Fieldable f) throws IOException { }
 
-  private static class RandomComparator implements ScoreDocComparator {
-    final int seed;
-
-    RandomComparator(int seed) {
-      this.seed = seed;
-    }
 
-    public int compare(ScoreDoc i, ScoreDoc j) {
-      return hash(i.doc + seed) - hash(j.doc + seed);
-    }
-
-    public Comparable sortValue(ScoreDoc i) {
-      return new Integer(hash(i.doc + seed));
-    }
-
-    public int sortType() {
-      return SortField.CUSTOM;
+  private static FieldComparatorSource randomComparatorSource = new FieldComparatorSource() {
+    public FieldComparator newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException {
+      return new FieldComparator() {
+        int seed;
+        private final int[] values = new int[numHits];
+        int bottomVal;
+
+        public int compare(int slot1, int slot2) {
+          return values[slot1] - values[slot2];  // values will be positive... no overflow possible.
+        }
+
+        public void setBottom(int slot) {
+          bottomVal = values[slot];
+        }
+
+        public int compareBottom(int doc) throws IOException {
+          return bottomVal - hash(doc+seed);
+        }
+
+        public void copy(int slot, int doc) throws IOException {
+          values[slot] = hash(doc+seed);
+        }
+
+        public void setNextReader(IndexReader reader, int docBase, int numSlotsFull) throws IOException {
+          seed = getSeed(fieldname, reader);
+        }
+
+        public int sortType() {
+          return SortField.CUSTOM;
+        }
+
+        public Comparable value(int slot) {
+          return values[slot];
+        }
+      };
     }
   };
 
-  private static class RandomSort extends SortField {
-    public RandomSort(String n, boolean reverse) {
-      super(n, SortField.CUSTOM, reverse);
-    }
-    
-    static class RandomComparatorSource implements SortComparatorSource {
-      final String field;
-      public RandomComparatorSource( String field ){
-        this.field = field;
-      }
-      public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
-        return new RandomComparator( getSeed(field, reader) );
-      }
-      
-      @Override
-      public int hashCode() {
-        return field.hashCode();
-      }
-
-      @Override
-      public boolean equals(Object o) {
-        if( !(o instanceof RandomComparatorSource ) ) return false;
-        RandomComparatorSource other = (RandomComparatorSource)o;
-        if( !field.equals( other.field ) ) return false;
-        return true;
-      }
-    }
 
-    @Override
-    public SortComparatorSource getFactory() {
-      return new RandomComparatorSource( getField() );
-    }
-  }
-  
+
   public class RandomValueSource extends ValueSource {
     private final String field;