From 72e616dd52b2b3979ef4e824966ac4ce0de592ba Mon Sep 17 00:00:00 2001 From: Erik Hatcher Date: Thu, 27 Apr 2017 08:55:05 -0400 Subject: [PATCH] LUCENE-7481: Fix SpanPayloadCheckQuery rewrite --- .../payloads/SpanPayloadCheckQuery.java | 4 ++++ .../payloads/TestPayloadCheckQuery.java | 23 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lucene/queries/src/java/org/apache/lucene/queries/payloads/SpanPayloadCheckQuery.java b/lucene/queries/src/java/org/apache/lucene/queries/payloads/SpanPayloadCheckQuery.java index e33eb184ce9..ca0e062893e 100644 --- a/lucene/queries/src/java/org/apache/lucene/queries/payloads/SpanPayloadCheckQuery.java +++ b/lucene/queries/src/java/org/apache/lucene/queries/payloads/SpanPayloadCheckQuery.java @@ -69,6 +69,10 @@ public class SpanPayloadCheckQuery extends SpanQuery { @Override public Query rewrite(IndexReader reader) throws IOException { + Query matchRewritten = match.rewrite(reader); + if (match != matchRewritten && matchRewritten instanceof SpanQuery) { + return new SpanPayloadCheckQuery((SpanQuery)matchRewritten, payloadToMatch); + } return super.rewrite(reader); } diff --git a/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadCheckQuery.java b/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadCheckQuery.java index ffe2cb8361a..9e347841479 100644 --- a/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadCheckQuery.java +++ b/lucene/queries/src/test/org/apache/lucene/queries/payloads/TestPayloadCheckQuery.java @@ -34,6 +34,8 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.CheckHits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; +import org.apache.lucene.search.WildcardQuery; +import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper; import org.apache.lucene.search.spans.SpanNearQuery; import org.apache.lucene.search.spans.SpanPositionRangeQuery; import org.apache.lucene.search.spans.SpanQuery; @@ -186,7 +188,6 @@ public class TestPayloadCheckQuery extends LuceneTestCase { payloads.add(pay4); query = new SpanPayloadCheckQuery(oneThousHunThree, payloads); checkHits(query, new int[]{1103, 1203,1303,1403,1503,1603,1703,1803,1903}); - } public void testEquality() { @@ -208,4 +209,24 @@ public class TestPayloadCheckQuery extends LuceneTestCase { assertFalse(query2.equals(query4)); assertFalse(query3.equals(query4)); } + + public void testRewrite() throws IOException { + SpanMultiTermQueryWrapper fiv = new SpanMultiTermQueryWrapper(new WildcardQuery(new Term("field", "fiv*"))); + SpanMultiTermQueryWrapper hund = new SpanMultiTermQueryWrapper(new WildcardQuery(new Term("field", "hund*"))); + SpanMultiTermQueryWrapper twent = new SpanMultiTermQueryWrapper(new WildcardQuery(new Term("field", "twent*"))); + SpanMultiTermQueryWrapper nin = new SpanMultiTermQueryWrapper(new WildcardQuery(new Term("field", "nin*"))); + + SpanNearQuery sq = new SpanNearQuery(new SpanQuery[] {fiv, hund, twent, nin}, 0, true); + + List payloads = new ArrayList<>(); + payloads.add(new BytesRef("pos: 0")); + payloads.add(new BytesRef("pos: 1")); + payloads.add(new BytesRef("pos: 2")); + payloads.add(new BytesRef("pos: 3")); + + SpanPayloadCheckQuery query = new SpanPayloadCheckQuery(sq, payloads); + + // if query wasn't rewritten properly, the query would have failed with "Rewrite first!" + checkHits(query, new int[]{529}); + } } \ No newline at end of file