mirror of https://github.com/apache/lucene.git
LUCENE-6984: SpanMultiTermQueryWrapper no longer modifies its wrapped query
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/branch_5x@1725724 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a4389c72f6
commit
d3040ac17c
|
@ -91,6 +91,9 @@ Bug Fixes
|
||||||
long document in SimilarityBase or BM25Similarity. Add more warnings to sims
|
long document in SimilarityBase or BM25Similarity. Add more warnings to sims
|
||||||
that will not work well with extreme tf values. (Ahmet Arslan, Robert Muir)
|
that will not work well with extreme tf values. (Ahmet Arslan, Robert Muir)
|
||||||
|
|
||||||
|
* LUCENE-6984: SpanMultiTermQueryWrapper no longer modifies its wrapped query.
|
||||||
|
(Alan Woodward, Adrien Grand)
|
||||||
|
|
||||||
Other
|
Other
|
||||||
|
|
||||||
* LUCENE-6924: Upgrade randomizedtesting to 2.3.2. (Dawid Weiss)
|
* LUCENE-6924: Upgrade randomizedtesting to 2.3.2. (Dawid Weiss)
|
||||||
|
|
|
@ -20,6 +20,11 @@ package org.apache.lucene.search.spans;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.index.TermContext;
|
import org.apache.lucene.index.TermContext;
|
||||||
|
@ -30,11 +35,6 @@ import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.ScoringRewrite;
|
import org.apache.lucene.search.ScoringRewrite;
|
||||||
import org.apache.lucene.search.TopTermsRewrite;
|
import org.apache.lucene.search.TopTermsRewrite;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wraps any {@link MultiTermQuery} as a {@link SpanQuery},
|
* Wraps any {@link MultiTermQuery} as a {@link SpanQuery},
|
||||||
* so it can be nested within other SpanQuery classes.
|
* so it can be nested within other SpanQuery classes.
|
||||||
|
@ -52,7 +52,9 @@ import java.util.ArrayList;
|
||||||
* </pre></blockquote>
|
* </pre></blockquote>
|
||||||
*/
|
*/
|
||||||
public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQuery {
|
public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQuery {
|
||||||
|
|
||||||
protected final Q query;
|
protected final Q query;
|
||||||
|
private SpanRewriteMethod rewriteMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new SpanMultiTermQueryWrapper.
|
* Create a new SpanMultiTermQueryWrapper.
|
||||||
|
@ -67,13 +69,16 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
|
||||||
@SuppressWarnings({"rawtypes","unchecked"})
|
@SuppressWarnings({"rawtypes","unchecked"})
|
||||||
public SpanMultiTermQueryWrapper(Q query) {
|
public SpanMultiTermQueryWrapper(Q query) {
|
||||||
this.query = Objects.requireNonNull(query);
|
this.query = Objects.requireNonNull(query);
|
||||||
|
this.rewriteMethod = selectRewriteMethod(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SpanRewriteMethod selectRewriteMethod(MultiTermQuery query) {
|
||||||
MultiTermQuery.RewriteMethod method = query.getRewriteMethod();
|
MultiTermQuery.RewriteMethod method = query.getRewriteMethod();
|
||||||
if (method instanceof TopTermsRewrite) {
|
if (method instanceof TopTermsRewrite) {
|
||||||
final int pqsize = ((TopTermsRewrite) method).getSize();
|
final int pqsize = ((TopTermsRewrite) method).getSize();
|
||||||
setRewriteMethod(new TopTermsSpanBooleanQueryRewrite(pqsize));
|
return new TopTermsSpanBooleanQueryRewrite(pqsize);
|
||||||
} else {
|
} else {
|
||||||
setRewriteMethod(SCORING_SPAN_QUERY_REWRITE);
|
return SCORING_SPAN_QUERY_REWRITE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,10 +86,7 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
|
||||||
* Expert: returns the rewriteMethod
|
* Expert: returns the rewriteMethod
|
||||||
*/
|
*/
|
||||||
public final SpanRewriteMethod getRewriteMethod() {
|
public final SpanRewriteMethod getRewriteMethod() {
|
||||||
final MultiTermQuery.RewriteMethod m = query.getRewriteMethod();
|
return rewriteMethod;
|
||||||
if (!(m instanceof SpanRewriteMethod))
|
|
||||||
throw new UnsupportedOperationException("You can only use SpanMultiTermQueryWrapper with a suitable SpanRewriteMethod.");
|
|
||||||
return (SpanRewriteMethod) m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,7 +94,7 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
|
||||||
* to be a span rewrite method.
|
* to be a span rewrite method.
|
||||||
*/
|
*/
|
||||||
public final void setRewriteMethod(SpanRewriteMethod rewriteMethod) {
|
public final void setRewriteMethod(SpanRewriteMethod rewriteMethod) {
|
||||||
query.setRewriteMethod(rewriteMethod);
|
this.rewriteMethod = rewriteMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -124,10 +126,7 @@ public class SpanMultiTermQueryWrapper<Q extends MultiTermQuery> extends SpanQue
|
||||||
if (getBoost() != 1f) {
|
if (getBoost() != 1f) {
|
||||||
return super.rewrite(reader);
|
return super.rewrite(reader);
|
||||||
}
|
}
|
||||||
final Query q = query.rewrite(reader);
|
return rewriteMethod.rewrite(reader, query);
|
||||||
if (!(q instanceof SpanQuery))
|
|
||||||
throw new UnsupportedOperationException("You can only use SpanMultiTermQueryWrapper with a suitable SpanRewriteMethod.");
|
|
||||||
return q;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -17,6 +17,8 @@ package org.apache.lucene.search.spans;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.lucene.document.Document;
|
import org.apache.lucene.document.Document;
|
||||||
import org.apache.lucene.document.Field;
|
import org.apache.lucene.document.Field;
|
||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
|
@ -24,11 +26,13 @@ import org.apache.lucene.index.RandomIndexWriter;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.FuzzyQuery;
|
import org.apache.lucene.search.FuzzyQuery;
|
||||||
import org.apache.lucene.search.IndexSearcher;
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
|
import org.apache.lucene.search.MultiTermQuery;
|
||||||
import org.apache.lucene.search.PrefixQuery;
|
import org.apache.lucene.search.PrefixQuery;
|
||||||
import org.apache.lucene.search.RegexpQuery;
|
import org.apache.lucene.search.RegexpQuery;
|
||||||
import org.apache.lucene.search.WildcardQuery;
|
import org.apache.lucene.search.WildcardQuery;
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link SpanMultiTermQueryWrapper}, wrapping a few MultiTermQueries.
|
* Tests for {@link SpanMultiTermQueryWrapper}, wrapping a few MultiTermQueries.
|
||||||
|
@ -226,4 +230,19 @@ public class TestSpanMultiTermQueryWrapper extends LuceneTestCase {
|
||||||
spanFirst = new SpanFirstQuery(spanPrfxNoSuch, 10);
|
spanFirst = new SpanFirstQuery(spanPrfxNoSuch, 10);
|
||||||
assertEquals(0, searcher.search(spanFirst, 10).totalHits);
|
assertEquals(0, searcher.search(spanFirst, 10).totalHits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWrappedQueryIsNotModified() {
|
||||||
|
final PrefixQuery pq = new PrefixQuery(new Term("field", "test"));
|
||||||
|
int pqHash = pq.hashCode();
|
||||||
|
SpanMultiTermQueryWrapper<PrefixQuery> wrapper = new SpanMultiTermQueryWrapper<>(pq);
|
||||||
|
assertEquals(pqHash, pq.hashCode());
|
||||||
|
wrapper.setRewriteMethod(new SpanMultiTermQueryWrapper.SpanRewriteMethod() {
|
||||||
|
@Override
|
||||||
|
public SpanQuery rewrite(IndexReader reader, MultiTermQuery query) throws IOException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assertEquals(pqHash, pq.hashCode());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue