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);