some queries/filters did not end at the correct state when used as inner json elements

This commit is contained in:
kimchy 2010-02-20 01:42:17 +02:00
parent bfc5ad7b92
commit e6b5ec7aaa
14 changed files with 98 additions and 35 deletions

View File

@ -33,7 +33,8 @@ public interface JsonFilterParser extends IndexComponent {
String name();
/**
* Parses the into a query from the current json parser location.
* Parses the into a filter from the current json parser location. Will be at "START_OBJECT" location,
* and should end when the token is at the matching "END_OBJECT".
*/
Filter parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException;
}

View File

@ -33,7 +33,8 @@ public interface JsonQueryParser extends IndexComponent {
String name();
/**
* Parses the into a query from the current json parser location.
* Parses the into a query from the current json parser location. Will be at "START_OBJECT" location,
* and should end when the token is at the matching "END_OBJECT".
*/
Query parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException;
}

View File

@ -54,10 +54,7 @@ public class PrefixJsonFilterParser extends AbstractIndexComponent implements Js
@Override public Filter parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();
jp.nextToken();

View File

@ -55,10 +55,7 @@ public class PrefixJsonQueryParser extends AbstractIndexComponent implements Jso
@Override public Query parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();

View File

@ -53,13 +53,14 @@ public class RangeJsonFilterParser extends AbstractIndexComponent implements Jso
@Override public Filter parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();
// now, we move after the field name, which starts the object
token = jp.nextToken();
assert token == JsonToken.START_OBJECT;
String from = null;
String to = null;
boolean includeLower = true;
@ -90,6 +91,10 @@ public class RangeJsonFilterParser extends AbstractIndexComponent implements Jso
}
}
// move to the next end object, to close the field name
token = jp.nextToken();
assert token == JsonToken.END_OBJECT;
Filter filter = null;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers != null) {

View File

@ -53,10 +53,7 @@ public class RangeJsonQueryParser extends AbstractIndexComponent implements Json
@Override public Query parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();
@ -93,6 +90,10 @@ public class RangeJsonQueryParser extends AbstractIndexComponent implements Json
}
}
// move to the next end object, to close the field name
token = jp.nextToken();
assert token == JsonToken.END_OBJECT;
Query query = null;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers != null) {

View File

@ -54,10 +54,7 @@ public class TermJsonFilterParser extends AbstractIndexComponent implements Json
@Override public Filter parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();

View File

@ -54,14 +54,10 @@ public class TermJsonQueryParser extends AbstractIndexComponent implements JsonQ
@Override public Query parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();
String value = null;
float boost = 1.0f;
token = jp.nextToken();
@ -78,6 +74,7 @@ public class TermJsonQueryParser extends AbstractIndexComponent implements JsonQ
}
}
}
jp.nextToken();
} else {
value = jp.getText();
// move to the next token

View File

@ -55,10 +55,7 @@ public class TermsJsonFilterParser extends AbstractIndexComponent implements Jso
@Override public Filter parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();

View File

@ -55,10 +55,7 @@ public class WildcardJsonQueryParser extends AbstractIndexComponent implements J
@Override public Query parse(JsonQueryParseContext parseContext) throws IOException, QueryParsingException {
JsonParser jp = parseContext.jp();
JsonToken token = jp.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
token = jp.nextToken();
}
JsonToken token = jp.nextToken();
assert token == JsonToken.FIELD_NAME;
String fieldName = jp.getCurrentName();
@ -79,6 +76,7 @@ public class WildcardJsonQueryParser extends AbstractIndexComponent implements J
}
}
}
jp.nextToken();
} else {
value = jp.getText();
jp.nextToken();

View File

@ -47,6 +47,7 @@ import static org.hamcrest.Matchers.*;
/**
* @author kimchy
*/
@Test
public class SimpleJsonIndexQueryParserTests {
private final Index index = new Index("test");
@ -377,6 +378,45 @@ public class SimpleJsonIndexQueryParserTests {
assertThat(((TermFilter) filteredQuery.getFilter()).getTerm(), equalTo(new Term("name.last", "banon")));
}
@Test public void testFilteredQuery2() throws IOException {
IndexQueryParser queryParser = newQueryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/filtered-query2.json");
Query parsedQuery = queryParser.parse(query);
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
assertThat(((TermQuery) filteredQuery.getQuery()).getTerm(), equalTo(new Term("name.first", "shay")));
assertThat(((TermFilter) filteredQuery.getFilter()).getTerm(), equalTo(new Term("name.last", "banon")));
}
@Test public void testFilteredQuery3() throws IOException {
IndexQueryParser queryParser = newQueryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/filtered-query3.json");
Query parsedQuery = queryParser.parse(query);
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
assertThat(((TermQuery) filteredQuery.getQuery()).getTerm(), equalTo(new Term("name.first", "shay")));
Filter filter = filteredQuery.getFilter();
assertThat(filter, instanceOf(NumericRangeFilter.class));
NumericRangeFilter rangeFilter = (NumericRangeFilter) filter;
assertThat(rangeFilter.getField(), equalTo("age"));
assertThat(rangeFilter.getMin().intValue(), equalTo(23));
assertThat(rangeFilter.getMax().intValue(), equalTo(54));
}
@Test public void testFilteredQuery4() throws IOException {
IndexQueryParser queryParser = newQueryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/json/filtered-query4.json");
Query parsedQuery = queryParser.parse(query);
assertThat(parsedQuery, instanceOf(FilteredQuery.class));
FilteredQuery filteredQuery = (FilteredQuery) parsedQuery;
WildcardQuery wildcardQuery = (WildcardQuery) filteredQuery.getQuery();
assertThat(wildcardQuery.getTerm(), equalTo(new Term("name.first", "sh*")));
assertThat((double) wildcardQuery.getBoost(), closeTo(1.1, 0.001));
assertThat(((TermFilter) filteredQuery.getFilter()).getTerm(), equalTo(new Term("name.last", "banon")));
}
@Test public void testTermsFilterQueryBuilder() throws Exception {
IndexQueryParser queryParser = newQueryParser();
Query parsedQuery = queryParser.parse(filteredQuery(termQuery("name.first", "shay"), termsFilter("name.last", "banon", "kimchy")).build());

View File

@ -0,0 +1,10 @@
{
filteredQuery : {
filter : {
term : { "name.last" : "banon"}
},
query : {
term : { "name.first" : "shay" }
}
}
}

View File

@ -0,0 +1,12 @@
{
filteredQuery : {
filter : {
range : {
age : { from : "23", to : "54", includeLower : true, includeUpper: false}
}
},
query : {
term : { "name.first" : "shay" }
}
}
}

View File

@ -0,0 +1,10 @@
{
filteredQuery : {
query : {
wildcard : { "name.first" : {wildcard : "sh*", boost : 1.1} }
},
filter : {
term : { "name.last" : "banon"}
}
}
}