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/07/16 02:12:18 UTC
svn commit: r794470 - in /lucene/solr/trunk/src:
java/org/apache/solr/search/ java/org/apache/solr/search/function/
test/org/apache/solr/search/
Author: yonik
Date: Thu Jul 16 00:12:17 2009
New Revision: 794470
URL: http://svn.apache.org/viewvc?rev=794470&view=rev
Log:
SOLR-1284: use/implement DISI.advance and friends
Modified:
lucene/solr/trunk/src/java/org/apache/solr/search/DocSet.java
lucene/solr/trunk/src/java/org/apache/solr/search/SortedIntDocSet.java
lucene/solr/trunk/src/java/org/apache/solr/search/function/BoostedQuery.java
lucene/solr/trunk/src/java/org/apache/solr/search/function/QueryValueSource.java
lucene/solr/trunk/src/test/org/apache/solr/search/TestDocSet.java
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/DocSet.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/DocSet.java?rev=794470&r1=794469&r2=794470&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/DocSet.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/DocSet.java Thu Jul 16 00:12:17 2009
@@ -267,18 +267,24 @@
public DocIdSetIterator iterator() throws IOException {
return new DocIdSetIterator() {
int pos=base-1;
- public int doc() {
- return pos-base;
+ int adjustedDoc=-1;
+
+ @Override
+ public int docID() {
+ return adjustedDoc;
}
- public boolean next() throws IOException {
+ @Override
+ public int nextDoc() throws IOException {
pos = bs.nextSetBit(pos+1);
- return pos>=0 && pos<max;
+ return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
}
- public boolean skipTo(int target) throws IOException {
+ @Override
+ public int advance(int target) throws IOException {
+ if (target==NO_MORE_DOCS) return adjustedDoc=NO_MORE_DOCS;
pos = bs.nextSetBit(target+base);
- return pos>=0 && pos<max;
+ return adjustedDoc = (pos>=0 && pos<max) ? pos-base : NO_MORE_DOCS;
}
};
}
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/SortedIntDocSet.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/SortedIntDocSet.java?rev=794470&r1=794469&r2=794470&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/SortedIntDocSet.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/SortedIntDocSet.java Thu Jul 16 00:12:17 2009
@@ -36,6 +36,7 @@
*/
public SortedIntDocSet(int[] docs) {
this.docs = docs;
+ // if (firstNonSorted(docs,0,docs.length)>=0) throw new RuntimeException("NON SORTED DOCS!!!");
}
/**
@@ -64,6 +65,24 @@
return newArr;
}
+ /** Returns the index of the first non-sorted element or -1 if they are all sorted */
+ public static int firstNonSorted(int[] arr, int offset, int len) {
+ if (len <= 1) return -1;
+ int lower = arr[offset];
+ int end = offset + len;
+ for(int i=offset+1; i<end; i++) {
+ int next = arr[i];
+ if (next <= lower) {
+ for (int j=i-1; j>offset; j--) {
+ if (arr[j]<next) return j+1;
+ }
+ return offset;
+ }
+ lower = next;
+ }
+ return -1;
+ }
+
public static int intersectionSize(int[] smallerSortedList, int[] biggerSortedList) {
final int a[] = smallerSortedList;
final int b[] = biggerSortedList;
@@ -573,24 +592,30 @@
public DocIdSetIterator iterator() throws IOException {
return new DocIdSetIterator() {
int idx = startIdx;
- int doc;
+ int adjustedDoc;
+
public int doc() {
- return doc - base;
+ return adjustedDoc;
+ }
+
+ @Override
+ public int docID() {
+ return adjustedDoc;
}
- public boolean next() throws IOException {
- if (idx > endIdx) return false;
- doc = docs[idx++];
- return true;
+ @Override
+ public int nextDoc() throws IOException {
+ return adjustedDoc = (idx > endIdx) ? NO_MORE_DOCS : (docs[idx++] - base);
}
- public boolean skipTo(int target) throws IOException {
- if (idx > endIdx) return false;
+ @Override
+ public int advance(int target) throws IOException {
+ if (idx > endIdx || target==NO_MORE_DOCS) return adjustedDoc=NO_MORE_DOCS;
target += base;
// probe next
- doc = docs[idx++];
- if (doc >= target) return true;
+ int rawDoc = docs[idx++];
+ if (rawDoc >= target) return adjustedDoc=rawDoc-base;
int high = endIdx;
@@ -599,28 +624,28 @@
// binary search
while (idx <= high) {
int mid = (idx+high) >>> 1;
- doc = docs[mid];
+ rawDoc = docs[mid];
- if (doc < target) {
+ if (rawDoc < target) {
idx = mid+1;
}
- else if (doc > target) {
+ else if (rawDoc > target) {
high = mid-1;
}
else {
idx=mid+1;
- return true;
+ return adjustedDoc=rawDoc - base;
}
}
// low is on the insertion point...
if (idx <= endIdx) {
- doc = docs[idx++];
- return true;
+ return adjustedDoc = docs[idx++] - base;
} else {
- return false;
+ return adjustedDoc=NO_MORE_DOCS;
}
}
+
};
}
};
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/function/BoostedQuery.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/function/BoostedQuery.java?rev=794470&r1=794469&r2=794470&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/function/BoostedQuery.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/function/BoostedQuery.java Thu Jul 16 00:12:17 2009
@@ -111,16 +111,24 @@
this.vals = vs.getValues(reader);
}
- public boolean next() throws IOException {
- return scorer.next();
+ @Override
+ public int docID() {
+ return scorer.docID();
}
- public int doc() {
- return scorer.doc();
+ @Override
+ public int advance(int target) throws IOException {
+ return scorer.advance(target);
}
+ @Override
+ public int nextDoc() throws IOException {
+ return scorer.nextDoc();
+ }
+
+ @Override
public float score() throws IOException {
- float score = qWeight * scorer.score() * vals.floatVal(scorer.doc());
+ float score = qWeight * scorer.score() * vals.floatVal(scorer.docID());
// Current Lucene priority queues can't handle NaN and -Infinity, so
// map to -Float.MAX_VALUE. This conditional handles both -infinity
@@ -128,10 +136,6 @@
return score>Float.NEGATIVE_INFINITY ? score : -Float.MAX_VALUE;
}
- public boolean skipTo(int target) throws IOException {
- return scorer.skipTo(target);
- }
-
public Explanation explain(int doc) throws IOException {
Explanation subQueryExpl = weight.qWeight.explain(reader,doc);
if (!subQueryExpl.isMatch()) {
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/function/QueryValueSource.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/function/QueryValueSource.java?rev=794470&r1=794469&r2=794470&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/function/QueryValueSource.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/function/QueryValueSource.java Thu Jul 16 00:12:17 2009
@@ -88,29 +88,17 @@
if (doc < lastDocRequested) {
// out-of-order access.... reset scorer.
scorer = weight.scorer(reader);
- boolean more = scorer.next();
- if (more) {
- scorerDoc = scorer.doc();
- } else {
- // pretend we skipped to the end
- scorerDoc = Integer.MAX_VALUE;
- }
+ scorerDoc = scorer.nextDoc();
}
lastDocRequested = doc;
if (scorerDoc < doc) {
- boolean more = scorer.skipTo(doc);
- if (more) {
- scorerDoc = scorer.doc();
- } else {
- // pretend we skipped to the end
- scorerDoc = Integer.MAX_VALUE;
- }
+ scorerDoc = scorer.nextDoc();
}
if (scorerDoc > doc) {
// query doesn't match this document... either because we hit the
- // end (Integer.MAX_VALUE), or because the next doc is after this doc.
+ // end, or because the next doc is after this doc.
return defVal;
}
@@ -119,8 +107,8 @@
} catch (IOException e) {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in QueryDocVals("+q+") doc="+doc, e);
}
- }
-
+ }
+
public int intVal(int doc) {
return (int)floatVal(doc);
}
Modified: lucene/solr/trunk/src/test/org/apache/solr/search/TestDocSet.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/search/TestDocSet.java?rev=794470&r1=794469&r2=794470&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/search/TestDocSet.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/search/TestDocSet.java Thu Jul 16 00:12:17 2009
@@ -373,12 +373,11 @@
// test for next() equivalence
for(;;) {
- boolean nexta = ia.next();
- boolean nextb = ib.next();
- assertEquals(nexta, nextb);
- if (!nexta) break;
- assertEquals(ia.doc(), ib.doc());
-
+ int da = ia.nextDoc();
+ int db = ib.nextDoc();
+ assertEquals(da, db);
+ assertEquals(ia.docID(), ib.docID());
+ if (da==DocIdSetIterator.NO_MORE_DOCS) break;
}
for (int i=0; i<10; i++) {
@@ -387,20 +386,20 @@
ib = b.iterator();
int doc = -1;
for (;;) {
- boolean nexta,nextb;
+ int da,db;
if (rand.nextBoolean()) {
- nexta = ia.next();
- nextb = ib.next();
+ da = ia.nextDoc();
+ db = ib.nextDoc();
} else {
int target = doc + rand.nextInt(10) + 1; // keep in mind future edge cases like probing (increase if necessary)
- nexta = ia.skipTo(target);
- nextb = ib.skipTo(target);
+ da = ia.advance(target);
+ db = ib.advance(target);
}
- assertEquals(nexta, nextb);
- if (!nexta) break;
- doc = ia.doc();
- assertEquals(doc, ib.doc());
+ assertEquals(da, db);
+ assertEquals(ia.docID(), ib.docID());
+ if (da==DocIdSetIterator.NO_MORE_DOCS) break;
+ doc = da;
}
}
}