diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonFilterParser.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonFilterParser.java index cdd3b1ea28b..0d1692930b8 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonFilterParser.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonFilterParser.java @@ -68,6 +68,20 @@ public class BoolJsonFilterParser extends AbstractIndexComponent implements Json } else if ("should".equals(currentFieldName)) { clauses.add(new FilterClause(parseContext.parseInnerFilter(), BooleanClause.Occur.SHOULD)); } + } else if (token == JsonToken.START_ARRAY) { + if ("must".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new FilterClause(parseContext.parseInnerFilter(), BooleanClause.Occur.MUST)); + } + } else if ("mustNot".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new FilterClause(parseContext.parseInnerFilter(), BooleanClause.Occur.MUST_NOT)); + } + } else if ("should".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new FilterClause(parseContext.parseInnerFilter(), BooleanClause.Occur.SHOULD)); + } + } } } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonQueryParser.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonQueryParser.java index 7d13299ce5e..d3e297eea31 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonQueryParser.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/json/BoolJsonQueryParser.java @@ -71,6 +71,20 @@ public class BoolJsonQueryParser extends AbstractIndexComponent implements JsonQ } else if ("should".equals(currentFieldName)) { clauses.add(new BooleanClause(parseContext.parseInnerQuery(), BooleanClause.Occur.SHOULD)); } + } else if (token == JsonToken.START_ARRAY) { + if ("must".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new BooleanClause(parseContext.parseInnerQuery(), BooleanClause.Occur.MUST)); + } + } else if ("mustNot".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new BooleanClause(parseContext.parseInnerQuery(), BooleanClause.Occur.MUST_NOT)); + } + } else if ("should".equals(currentFieldName)) { + while ((token = jp.nextToken()) != JsonToken.END_ARRAY) { + clauses.add(new BooleanClause(parseContext.parseInnerQuery(), BooleanClause.Occur.SHOULD)); + } + } } else if (token == JsonToken.VALUE_TRUE || token == JsonToken.VALUE_FALSE) { if ("disableCoord".equals(currentFieldName)) { disableCoord = token == JsonToken.VALUE_TRUE; diff --git a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/SimpleJsonIndexQueryParserTests.java b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/SimpleJsonIndexQueryParserTests.java index 9f61c8ec342..1f88ae4ece0 100644 --- a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/SimpleJsonIndexQueryParserTests.java +++ b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/SimpleJsonIndexQueryParserTests.java @@ -314,7 +314,7 @@ public class SimpleJsonIndexQueryParserTests { @Test public void testBoolQueryBuilder() throws IOException { IndexQueryParser queryParser = newQueryParser(); - Query parsedQuery = queryParser.parse(boolQuery().must(termQuery("content", "test1")).mustNot(termQuery("content", "test2")).should(termQuery("content", "test3")).must(termQuery("content", "test4")).build()); + Query parsedQuery = queryParser.parse(boolQuery().must(termQuery("content", "test1")).must(termQuery("content", "test4")).mustNot(termQuery("content", "test2")).should(termQuery("content", "test3")).build()); assertThat(parsedQuery, instanceOf(BooleanQuery.class)); BooleanQuery booleanQuery = (BooleanQuery) parsedQuery; BooleanClause[] clauses = booleanQuery.getClauses(); @@ -324,14 +324,14 @@ public class SimpleJsonIndexQueryParserTests { assertThat(((TermQuery) clauses[0].getQuery()).getTerm(), equalTo(new Term("content", "test1"))); assertThat(clauses[0].getOccur(), equalTo(BooleanClause.Occur.MUST)); - assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("content", "test2"))); - assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.MUST_NOT)); + assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("content", "test4"))); + assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.MUST)); - assertThat(((TermQuery) clauses[2].getQuery()).getTerm(), equalTo(new Term("content", "test3"))); - assertThat(clauses[2].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + assertThat(((TermQuery) clauses[2].getQuery()).getTerm(), equalTo(new Term("content", "test2"))); + assertThat(clauses[2].getOccur(), equalTo(BooleanClause.Occur.MUST_NOT)); - assertThat(((TermQuery) clauses[3].getQuery()).getTerm(), equalTo(new Term("content", "test4"))); - assertThat(clauses[3].getOccur(), equalTo(BooleanClause.Occur.MUST)); + assertThat(((TermQuery) clauses[3].getQuery()).getTerm(), equalTo(new Term("content", "test3"))); + assertThat(clauses[3].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); } @@ -348,14 +348,14 @@ public class SimpleJsonIndexQueryParserTests { assertThat(((TermQuery) clauses[0].getQuery()).getTerm(), equalTo(new Term("content", "test1"))); assertThat(clauses[0].getOccur(), equalTo(BooleanClause.Occur.MUST)); - assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("content", "test2"))); - assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.MUST_NOT)); + assertThat(((TermQuery) clauses[1].getQuery()).getTerm(), equalTo(new Term("content", "test4"))); + assertThat(clauses[1].getOccur(), equalTo(BooleanClause.Occur.MUST)); - assertThat(((TermQuery) clauses[2].getQuery()).getTerm(), equalTo(new Term("content", "test3"))); - assertThat(clauses[2].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + assertThat(((TermQuery) clauses[2].getQuery()).getTerm(), equalTo(new Term("content", "test2"))); + assertThat(clauses[2].getOccur(), equalTo(BooleanClause.Occur.MUST_NOT)); - assertThat(((TermQuery) clauses[3].getQuery()).getTerm(), equalTo(new Term("content", "test4"))); - assertThat(clauses[3].getOccur(), equalTo(BooleanClause.Occur.MUST)); + assertThat(((TermQuery) clauses[3].getQuery()).getTerm(), equalTo(new Term("content", "test3"))); + assertThat(clauses[3].getOccur(), equalTo(BooleanClause.Occur.SHOULD)); } @Test public void testFilteredQueryBuilder() throws IOException { diff --git a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool-filter.json b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool-filter.json index 0fa5f5ed2eb..58ec290d086 100644 --- a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool-filter.json +++ b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool-filter.json @@ -5,17 +5,19 @@ }, filter : { bool : { - must : { - term : { "name.first" : "shay1" } - }, + must : [ + { + term : { "name.first" : "shay1" } + }, + { + term : { "name.first" : "shay4" } + } + ], mustNot: { term : { "name.first" : "shay2" } }, should: { term : { "name.first" : "shay3" } - }, - must : { - term : { "name.first" : "shay4" } } } } diff --git a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool.json b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool.json index 758d21e4c45..036cffe6aa2 100644 --- a/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool.json +++ b/modules/elasticsearch/src/test/java/org/elasticsearch/index/query/json/bool.json @@ -1,11 +1,19 @@ { bool : { - must : { - queryString : { - defaultField : "content", - query : "test1" + must : [ + { + queryString : { + defaultField : "content", + query : "test1" + } + }, + { + queryString : { + defaultField : "content", + query : "test4" + } } - }, + ], mustNot: { queryString : { defaultField : "content", @@ -17,12 +25,6 @@ defaultField : "content", query : "test3" } - }, - must : { - queryString : { - defaultField : "content", - query : "test4" - } } } } \ No newline at end of file