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;