You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2012/02/07 19:01:55 UTC

svn commit: r1241537 - /lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java

Author: yonik
Date: Tue Feb  7 18:01:54 2012
New Revision: 1241537

URL: http://svn.apache.org/viewvc?rev=1241537&view=rev
Log:
SOLR-3104: get sortfield values for fsv in docid order

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1241537&r1=1241536&r2=1241537&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Tue Feb  7 18:01:54 2012
@@ -581,7 +581,7 @@ public class QueryComponent extends Sear
     if(fsv){
       Sort sort = searcher.weightSort(rb.getSortSpec().getSort());
       SortField[] sortFields = sort==null ? new SortField[]{SortField.FIELD_SCORE} : sort.getSort();
-      NamedList<List> sortVals = new NamedList<List>(); // order is important for the sort fields
+      NamedList<Object[]> sortVals = new NamedList<Object[]>(); // order is important for the sort fields
       Field field = new StringField("dummy", ""); // a dummy Field
       IndexReaderContext topReaderContext = searcher.getTopReaderContext();
       AtomicReaderContext[] leaves = ReaderUtil.leaves(topReaderContext);
@@ -592,35 +592,49 @@ public class QueryComponent extends Sear
         leaves=null;
       }
 
+      DocList docList = rb.getResults().docList;
+
+      // sort ids from lowest to highest so we can access them in order
+      int nDocs = docList.size();
+      long[] sortedIds = new long[nDocs];
+      DocIterator it = rb.getResults().docList.iterator();
+      for (int i=0; i<nDocs; i++) {
+        sortedIds[i] = (((long)it.nextDoc()) << 32) | i;
+      }
+      Arrays.sort(sortedIds);
+
+
       for (SortField sortField: sortFields) {
         SortField.Type type = sortField.getType();
         if (type==SortField.Type.SCORE || type==SortField.Type.DOC) continue;
 
         FieldComparator comparator = null;
-        FieldComparator comparators[] = (leaves==null) ? null : new FieldComparator[leaves.length];
 
         String fieldname = sortField.getField();
         FieldType ft = fieldname==null ? null : req.getSchema().getFieldTypeNoEx(fieldname);
 
-        DocList docList = rb.getResults().docList;
-        List<Object> vals = new ArrayList<Object>(docList.size());
-        DocIterator it = rb.getResults().docList.iterator();
+        Object[] vals = new Object[nDocs];
+        
 
+        int lastIdx = -1;
         int idx = 0;
 
-        while(it.hasNext()) {
-          int doc = it.nextDoc();
+        for (long idAndPos : sortedIds) {
+          int doc = (int)(idAndPos >>> 32);
+          int position = (int)idAndPos;
+
           if (leaves != null) {
             idx = ReaderUtil.subIndex(doc, leaves);
             currentLeaf = leaves[idx];
-            comparator = comparators[idx];
+            if (idx != lastIdx) {
+              // we switched segments.  invalidate comparator.
+              comparator = null;
+            }
           }
 
           if (comparator == null) {
             comparator = sortField.getComparator(1,0);
             comparator = comparator.setNextReader(currentLeaf);
-            if (comparators != null)
-              comparators[idx] = comparator;
           }
 
           doc -= currentLeaf.docBase;  // adjust for what segment this is in
@@ -647,7 +661,7 @@ public class QueryComponent extends Sear
             val = ft.toObject(field);
           }
 
-          vals.add(val);
+          vals[position] = val;
         }
 
         sortVals.add(fieldname, vals);