Query DSL: Simplify not filter to accept the filter directly, without a wrapping filter element, closes #992.

This commit is contained in:
kimchy 2011-06-03 01:42:57 +03:00
parent ec1f0b16f4
commit 0f1655cf22
5 changed files with 74 additions and 0 deletions

View File

@ -61,6 +61,9 @@ public class NotFilterParser extends AbstractIndexComponent implements XContentF
} else if (token == XContentParser.Token.START_OBJECT) {
if ("filter".equals(currentFieldName)) {
filter = parseContext.parseInnerFilter();
} else {
// its the filter, and the name is the field
filter = parseContext.parseInnerFilter(currentFieldName);
}
} else if (token.isValue()) {
if ("_cache".equals(currentFieldName)) {

View File

@ -175,6 +175,20 @@ public class QueryParseContext {
return result;
}
public Filter parseInnerFilter(String filterName) throws IOException, QueryParsingException {
XContentFilterParser filterParser = indexQueryParser.filterParser(filterName);
if (filterParser == null) {
throw new QueryParsingException(index, "No filter registered for [" + filterName + "]");
}
Filter result = filterParser.parse(this);
// don't move to the nextToken in this case...
// if (parser.currentToken() == XContentParser.Token.END_OBJECT || parser.currentToken() == XContentParser.Token.END_ARRAY) {
// // if we are at END_OBJECT, move to the next one...
// parser.nextToken();
// }
return result;
}
public FieldMapper fieldMapper(String name) {
FieldMappers fieldMappers = indexQueryParser.mapperService.smartNameFieldMappers(name);
if (fieldMappers == null) {

View File

@ -819,6 +819,31 @@ public class SimpleIndexQueryParserTests {
Query parsedQuery = queryParser.parse(query).query();
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
assertThat(((TermQuery) filteredQuery.getQuery()).getTerm(), equalTo(new Term("name.first", "shay")));
NotFilter notFilter = (NotFilter) filteredQuery.getFilter();
assertThat(((TermFilter) notFilter.filter()).getTerm(), equalTo(new Term("name.first", "shay1")));
}
@Test public void testNotFilteredQuery2() throws IOException {
IndexQueryParser queryParser = queryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/xcontent/not-filter2.json");
Query parsedQuery = queryParser.parse(query).query();
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
assertThat(((TermQuery) filteredQuery.getQuery()).getTerm(), equalTo(new Term("name.first", "shay")));
NotFilter notFilter = (NotFilter) filteredQuery.getFilter();
assertThat(((TermFilter) notFilter.filter()).getTerm(), equalTo(new Term("name.first", "shay1")));
}
@Test public void testNotFilteredQuery3() throws IOException {
IndexQueryParser queryParser = queryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/xcontent/not-filter3.json");
Query parsedQuery = queryParser.parse(query).query();
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
assertThat(((TermQuery) filteredQuery.getQuery()).getTerm(), equalTo(new Term("name.first", "shay")));
NotFilter notFilter = (NotFilter) filteredQuery.getFilter();
assertThat(((TermFilter) notFilter.filter()).getTerm(), equalTo(new Term("name.first", "shay1")));

View File

@ -0,0 +1,16 @@
{
"filtered" : {
"query" : {
"term" : {
"name.first" : "shay"
}
},
"filter" : {
"not" : {
"term" : {
"name.first" : "shay1"
}
}
}
}
}

View File

@ -0,0 +1,16 @@
{
"filtered" : {
"filter" : {
"not" : {
"term" : {
"name.first" : "shay1"
}
}
},
"query" : {
"term" : {
"name.first" : "shay"
}
}
}
}