You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2010/11/15 09:22:14 UTC

svn commit: r1035173 - in /lucene/dev/trunk/lucene/src/java/org/apache/lucene/search: ScoringRewrite.java spans/SpanMultiTermQueryWrapper.java

Author: uschindler
Date: Mon Nov 15 08:22:13 2010
New Revision: 1035173

URL: http://svn.apache.org/viewvc?rev=1035173&view=rev
Log:
LUCENE-2757: Fix hackish max clause count handling in trunk

Modified:
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/ScoringRewrite.java
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/ScoringRewrite.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/ScoringRewrite.java?rev=1035173&r1=1035172&r2=1035173&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/ScoringRewrite.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/ScoringRewrite.java Mon Nov 15 08:22:13 2010
@@ -68,6 +68,12 @@ public abstract class ScoringRewrite<Q e
       topLevel.add(tq, BooleanClause.Occur.SHOULD);
     }
     
+    @Override
+    protected void checkMaxClauseCount(int count) {
+      if (count > BooleanQuery.getMaxClauseCount())
+        throw new BooleanQuery.TooManyClauses();
+    }
+    
     // Make sure we are still a singleton even after deserializing
     protected Object readResolve() {
       return SCORING_BOOLEAN_QUERY_REWRITE;
@@ -104,10 +110,14 @@ public abstract class ScoringRewrite<Q e
     }
   };
 
+  /** This method is called after every new term to check if the number of max clauses
+   * (e.g. in BooleanQuery) is not exceeded. Throws the corresponding {@link RuntimeException}. */
+  protected abstract void checkMaxClauseCount(int count) throws IOException;
+  
   @Override
   public final Q rewrite(final IndexReader reader, final MultiTermQuery query) throws IOException {
     final Q result = getTopLevelQuery();
-    final ParallelArraysTermCollector col = new ParallelArraysTermCollector(result instanceof BooleanQuery);
+    final ParallelArraysTermCollector col = new ParallelArraysTermCollector();
     collectTerms(reader, query, col);
     
     final Term placeholderTerm = new Term(query.field);
@@ -127,18 +137,13 @@ public abstract class ScoringRewrite<Q e
     return result;
   }
 
-  static final class ParallelArraysTermCollector extends TermCollector {
-    private final boolean checkMaxClauseCount;
+  final class ParallelArraysTermCollector extends TermCollector {
     final TermFreqBoostByteStart array = new TermFreqBoostByteStart(16);
     final BytesRefHash terms = new BytesRefHash(new ByteBlockPool(new ByteBlockPool.DirectAllocator()), 16, array);
     TermsEnum termsEnum;
 
     private BoostAttribute boostAtt;
     
-    public ParallelArraysTermCollector(boolean checkMaxClauseCount) {
-      this.checkMaxClauseCount = checkMaxClauseCount;
-    }
-  
     @Override
     public void setNextEnum(TermsEnum termsEnum) throws IOException {
       this.termsEnum = termsEnum;
@@ -146,7 +151,7 @@ public abstract class ScoringRewrite<Q e
     }
   
     @Override
-    public boolean collect(BytesRef bytes) {
+    public boolean collect(BytesRef bytes) throws IOException {
       final int e = terms.add(bytes);
       if (e < 0 ) {
         // duplicate term: update docFreq
@@ -157,10 +162,8 @@ public abstract class ScoringRewrite<Q e
         // new entry: we populate the entry initially
         array.docFreq[e] = termsEnum.docFreq();
         array.boost[e] = boostAtt.getBoost();
+        ScoringRewrite.this.checkMaxClauseCount(terms.size());
       }
-      // if the new entry reaches the max clause count, we exit early
-      if (checkMaxClauseCount && e >= BooleanQuery.getMaxClauseCount())
-        throw new BooleanQuery.TooManyClauses();
       return true;
     }
   }

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java?rev=1035173&r1=1035172&r2=1035173&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/search/spans/SpanMultiTermQueryWrapper.java Mon Nov 15 08:22:13 2010
@@ -148,6 +148,11 @@ public class SpanMultiTermQueryWrapper<Q
       }
 
       @Override
+      protected void checkMaxClauseCount(int count) {
+        // we accept all terms as SpanOrQuery has no limits
+      }
+    
+      @Override
       protected void addClause(SpanOrQuery topLevel, Term term, int docCount, float boost) {
         final SpanTermQuery q = new SpanTermQuery(term);
         q.setBoost(boost);