Browse Source

percolator: Also support query extraction for queries wrapped inside a ESToParentBlockJoinQuery

Martijn van Groningen 8 years ago
parent
commit
805437b8bc

+ 10 - 0
modules/percolator/src/main/java/org/elasticsearch/percolator/QueryAnalyzer.java

@@ -47,6 +47,7 @@ import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.NumericUtils;
 import org.elasticsearch.common.logging.LoggerMessageFormat;
 import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
+import org.elasticsearch.index.search.ESToParentBlockJoinQuery;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -88,6 +89,7 @@ final class QueryAnalyzer {
         map.put(FunctionScoreQuery.class, functionScoreQuery());
         map.put(PointRangeQuery.class, pointRangeQuery());
         map.put(IndexOrDocValuesQuery.class, indexOrDocValuesQuery());
+        map.put(ESToParentBlockJoinQuery.class, toParentBlockJoinQuery());
         queryProcessors = Collections.unmodifiableMap(map);
     }
 
@@ -390,6 +392,14 @@ final class QueryAnalyzer {
         };
     }
 
+    private static BiFunction<Query, Map<String, Float>, Result> toParentBlockJoinQuery() {
+        return (query, boosts) -> {
+            ESToParentBlockJoinQuery toParentBlockJoinQuery = (ESToParentBlockJoinQuery) query;
+            Result result = analyze(toParentBlockJoinQuery.getChildQuery(), boosts);
+            return new Result(false, result.extractions);
+        };
+    }
+
     private static Result handleDisjunction(List<Query> disjunctions, int minimumShouldMatch, boolean otherClauses,
                                             Map<String, Float> boosts) {
         boolean verified = minimumShouldMatch <= 1 && otherClauses == false;

+ 14 - 0
modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java

@@ -44,6 +44,8 @@ import org.apache.lucene.search.SynonymQuery;
 import org.apache.lucene.search.TermInSetQuery;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TermRangeQuery;
+import org.apache.lucene.search.join.QueryBitSetProducer;
+import org.apache.lucene.search.join.ScoreMode;
 import org.apache.lucene.search.spans.SpanFirstQuery;
 import org.apache.lucene.search.spans.SpanNearQuery;
 import org.apache.lucene.search.spans.SpanNotQuery;
@@ -54,6 +56,7 @@ import org.elasticsearch.common.lucene.search.function.CombineFunction;
 import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
 import org.elasticsearch.common.lucene.search.function.RandomScoreFunction;
 import org.elasticsearch.common.network.InetAddresses;
+import org.elasticsearch.index.search.ESToParentBlockJoinQuery;
 import org.elasticsearch.percolator.QueryAnalyzer.QueryExtraction;
 import org.elasticsearch.percolator.QueryAnalyzer.Result;
 import org.elasticsearch.test.ESTestCase;
@@ -788,6 +791,17 @@ public class QueryAnalyzerTests extends ESTestCase {
         assertDimension(ranges.get(0).range.upperPoint, bytes -> IntPoint.encodeDimension(20, bytes, 0));
     }
 
+    public void testToParentBlockJoinQuery() {
+        TermQuery termQuery = new TermQuery(new Term("field", "value"));
+        QueryBitSetProducer queryBitSetProducer = new QueryBitSetProducer(new TermQuery(new Term("_type", "child")));
+        ESToParentBlockJoinQuery query = new ESToParentBlockJoinQuery(termQuery, queryBitSetProducer, ScoreMode.None, "child");
+        Result result = analyze(query, Collections.emptyMap());
+        assertFalse(result.verified);
+        assertEquals(1, result.extractions.size());
+        assertNull(result.extractions.toArray(new QueryExtraction[0])[0].range);
+        assertEquals(new Term("field", "value"), result.extractions.toArray(new QueryExtraction[0])[0].term);
+    }
+
     public void testPointRangeQuerySelectShortestRange() {
         BooleanQuery.Builder boolQuery = new BooleanQuery.Builder();
         boolQuery.add(LongPoint.newRangeQuery("_field1", 10, 20), BooleanClause.Occur.FILTER);