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