You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2011/08/21 17:22:42 UTC
svn commit: r1159995 - in /lucene/dev/trunk/lucene/src:
java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java
test/org/apache/lucene/index/TestTermsEnum.java
Author: mikemccand
Date: Sun Aug 21 15:22:42 2011
New Revision: 1159995
URL: http://svn.apache.org/viewvc?rev=1159995&view=rev
Log:
LUCENE-3388: fix bug in intersect's seekToStartTerm when final floor frame doesn't match the automaton
Modified:
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java
lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java?rev=1159995&r1=1159994&r2=1159995&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/BlockTreeTermsReader.java Sun Aug 21 15:22:42 2011
@@ -922,7 +922,7 @@ public class BlockTreeTermsReader extend
final boolean isSubBlock = currentFrame.next();
- //if (DEBUG) System.out.println(" cycle ent=" + currentFrame.nextEnt + " (of " + currentFrame.entCount + ") prefix=" + currentFrame.prefix + " suffix=" + currentFrame.suffix);
+ //if (DEBUG) System.out.println(" cycle ent=" + currentFrame.nextEnt + " (of " + currentFrame.entCount + ") prefix=" + currentFrame.prefix + " suffix=" + currentFrame.suffix + " isBlock=" + isSubBlock + " firstLabel=" + (currentFrame.suffix == 0 ? "" : (currentFrame.suffixBytes[currentFrame.startBytePos])&0xff));
term.length = currentFrame.prefix + currentFrame.suffix;
if (term.bytes.length < term.length) {
term.bytes = ArrayUtil.grow(term.bytes, term.length);
@@ -931,6 +931,7 @@ public class BlockTreeTermsReader extend
if (isSubBlock && target.startsWith(term)) {
// Recurse
+ //if (DEBUG) System.out.println(" recurse!");
currentFrame = pushFrame(getState());
break;
} else {
@@ -964,14 +965,11 @@ public class BlockTreeTermsReader extend
currentFrame.termState.termBlockOrd = saveTermBlockOrd;
System.arraycopy(currentFrame.suffixBytes, currentFrame.startBytePos, term.bytes, currentFrame.prefix, currentFrame.suffix);
term.length = currentFrame.prefix + currentFrame.suffix;
- if (lastIsSubBlock) {
- // Recurse
- currentFrame = pushFrame(getState());
- break;
- } else {
- //if (DEBUG) System.out.println(" fallback return term=" + brToString(term) + " curFrame.nextEnt=" + currentFrame.nextEnt);
- return;
- }
+ // If the last entry was a block we don't
+ // need to bother recursing and pushing to
+ // the last term under it because the first
+ // next() will simply skip the frame anyway
+ return;
}
}
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java?rev=1159995&r1=1159994&r2=1159995&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java Sun Aug 21 15:22:42 2011
@@ -158,11 +158,6 @@ public class TestTermsEnum extends Lucen
d.close();
}
- private String randomString() {
- //return _TestUtil.randomSimpleString(random);
- return _TestUtil.randomRealisticUnicodeString(random);
- }
-
private void addDoc(RandomIndexWriter w, Collection<String> terms, Map<BytesRef,Integer> termToID, int id) throws IOException {
Document doc = new Document();
doc.add(new NumericField("id").setIntValue(id));
@@ -199,7 +194,7 @@ public class TestTermsEnum extends Lucen
final Map<BytesRef,Integer> termToID = new HashMap<BytesRef,Integer>();
int id = 0;
while(terms.size() != numTerms) {
- final String s = randomString();
+ final String s = getRandomString();
if (!terms.contains(s)) {
terms.add(s);
pendingTerms.add(s);
@@ -259,7 +254,7 @@ public class TestTermsEnum extends Lucen
if (random.nextDouble() <= keepPct) {
s2 = s;
} else {
- s2 = randomString();
+ s2 = getRandomString();
}
acceptTerms.add(s2);
sortedAcceptTerms.add(new BytesRef(s2));
@@ -290,12 +285,23 @@ public class TestTermsEnum extends Lucen
for(int iter2=0;iter2<100;iter2++) {
final BytesRef startTerm = acceptTermsArray.length == 0 || random.nextBoolean() ? null : acceptTermsArray[random.nextInt(acceptTermsArray.length)];
- final TermsEnum te = MultiFields.getTerms(r, "f").intersect(c, startTerm);
-
if (VERBOSE) {
System.out.println("\nTEST: iter2=" + iter2 + " startTerm=" + (startTerm == null ? "<null>" : startTerm.utf8ToString()));
+
+ if (startTerm != null) {
+ int state = c.runAutomaton.getInitialState();
+ for(int idx=0;idx<startTerm.length;idx++) {
+ final int label = startTerm.bytes[startTerm.offset+idx] & 0xff;
+ System.out.println(" state=" + state + " label=" + label);
+ state = c.runAutomaton.step(state, label);
+ assertTrue(state != -1);
+ }
+ System.out.println(" state=" + state);
+ }
}
+ final TermsEnum te = MultiFields.getTerms(r, "f").intersect(c, startTerm);
+
int loc;
if (startTerm == null) {
loc = 0;