From fbd732cde284984a41c08945722b1c981525313f Mon Sep 17 00:00:00 2001 From: Derek McNeil Date: Fri, 3 May 2013 03:35:48 -0500 Subject: [PATCH] Added support for Collections in TermsQuery/InQuery. --- .../index/query/QueryBuilders.java | 22 +++++++++++ .../index/query/TermsQueryBuilder.java | 11 ++++++ .../query/SimpleIndexQueryParserTests.java | 38 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/main/java/org/elasticsearch/index/query/QueryBuilders.java b/src/main/java/org/elasticsearch/index/query/QueryBuilders.java index 6ae65d7ce8f..d78c061e1ac 100644 --- a/src/main/java/org/elasticsearch/index/query/QueryBuilders.java +++ b/src/main/java/org/elasticsearch/index/query/QueryBuilders.java @@ -22,6 +22,8 @@ package org.elasticsearch.index.query; import com.spatial4j.core.shape.Shape; import org.elasticsearch.common.Nullable; +import java.util.Collection; + /** * A static factory for simple "import static" usage. */ @@ -675,6 +677,16 @@ public abstract class QueryBuilders { return new TermsQueryBuilder(name, values); } + /** + * A filer for a field based on several terms matching on any of them. + * + * @param name The field name + * @param values The terms + */ + public static TermsQueryBuilder termsQuery(String name, Collection values) { + return new TermsQueryBuilder(name, values); + } + /** * A filer for a field based on several terms matching on any of them. * @@ -735,6 +747,16 @@ public abstract class QueryBuilders { return new TermsQueryBuilder(name, values); } + /** + * A filer for a field based on several terms matching on any of them. + * + * @param name The field name + * @param values The terms + */ + public static TermsQueryBuilder inQuery(String name, Collection values) { + return new TermsQueryBuilder(name, values); + } + /** * A query that will execute the wrapped query only for the specified indices, and "match_all" when * it does not match those indices. diff --git a/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java b/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java index 6cac39aee8a..5153cf9846f 100644 --- a/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java +++ b/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java @@ -22,6 +22,7 @@ package org.elasticsearch.index.query; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; +import java.util.Collection; /** * @@ -115,6 +116,16 @@ public class TermsQueryBuilder extends BaseQueryBuilder implements BoostableQuer this.values = values; } + /** + * A query for a field based on several terms matching on any of them. + * + * @param name The field name + * @param values The terms + */ + public TermsQueryBuilder(String name, Collection values) { + this(name, values.toArray()); + } + /** * Sets the minimum number of matches across the provided terms. Defaults to 1. */ diff --git a/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java b/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java index ada32595acd..10b04cfddce 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/query/SimpleIndexQueryParserTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.test.unit.index.query; +import com.google.common.collect.Lists; import org.apache.lucene.index.Term; import org.apache.lucene.queries.BoostingQuery; import org.apache.lucene.queries.FilterClause; @@ -1193,6 +1194,23 @@ public class SimpleIndexQueryParserTests { assertThat(clauses[3].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); } + @Test + public void testTermsQueryBuilder() throws IOException { + IndexQueryParserService queryParser = queryParser(); + Query parsedQuery = queryParser.parse(termsQuery("name.first", Lists.newArrayList("shay", "test"))).query(); + assertThat(parsedQuery, instanceOf(BooleanQuery.class)); + BooleanQuery booleanQuery = (BooleanQuery) parsedQuery; + BooleanClause[] clauses = booleanQuery.getClauses(); + + assertThat(clauses.length, equalTo(2)); + + assertThat(((TermQuery) clauses[0].getQuery()).getTerm(), equalTo(new Term("name.first", "shay"))); + assertThat(clauses[0].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + + assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("name.first", "test"))); + assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + } + @Test public void testTermsQuery() throws IOException { IndexQueryParserService queryParser = queryParser(); @@ -1211,6 +1229,26 @@ public class SimpleIndexQueryParserTests { assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); } + @Test + public void testInQuery() throws IOException { + IndexQueryParserService queryParser = queryParser(); + Query parsedQuery = queryParser.parse(termsQuery("name.first", Lists.newArrayList("test1", "test2", "test3"))).query(); + assertThat(parsedQuery, instanceOf(BooleanQuery.class)); + BooleanQuery booleanQuery = (BooleanQuery) parsedQuery; + BooleanClause[] clauses = booleanQuery.getClauses(); + + assertThat(clauses.length, equalTo(3)); + + assertThat(((TermQuery) clauses[0].getQuery()).getTerm(), equalTo(new Term("name.first", "test1"))); + assertThat(clauses[0].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + + assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("name.first", "test2"))); + assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + + assertThat(((TermQuery) clauses[2].getQuery()).getTerm(), equalTo(new Term("name.first", "test3"))); + assertThat(clauses[2].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + } + @Test public void testFilteredQueryBuilder() throws IOException { IndexQueryParserService queryParser = queryParser();