Add sanity checks and support for reverse in FieldSortBuilder.parse(...)
After another round of input from @cbuescher this adds a few more sanity checks to request parsing. In addition adds (back) support for the reverse option.
This commit is contained in:
parent
02e698bc43
commit
fb647e9bf4
|
@ -35,14 +35,14 @@ import java.util.Objects;
|
||||||
/**
|
/**
|
||||||
* A sort builder to sort based on a document field.
|
* A sort builder to sort based on a document field.
|
||||||
*/
|
*/
|
||||||
public class FieldSortBuilder extends SortBuilder implements SortBuilderTemp<FieldSortBuilder> {
|
public class FieldSortBuilder extends SortBuilder<FieldSortBuilder> implements SortBuilderParser<FieldSortBuilder> {
|
||||||
public static final String NAME = "field_sort";
|
|
||||||
static final FieldSortBuilder PROTOTYPE = new FieldSortBuilder("");
|
static final FieldSortBuilder PROTOTYPE = new FieldSortBuilder("");
|
||||||
public static final String NAME = "field_sort";
|
public static final String NAME = "field_sort";
|
||||||
public static final ParseField NESTED_PATH = new ParseField("nested_path");
|
public static final ParseField NESTED_PATH = new ParseField("nested_path");
|
||||||
public static final ParseField NESTED_FILTER = new ParseField("nested_filter");
|
public static final ParseField NESTED_FILTER = new ParseField("nested_filter");
|
||||||
public static final ParseField MISSING = new ParseField("missing");
|
public static final ParseField MISSING = new ParseField("missing");
|
||||||
public static final ParseField ORDER = new ParseField("order");
|
public static final ParseField ORDER = new ParseField("order");
|
||||||
|
public static final ParseField REVERSE = new ParseField("reverse");
|
||||||
public static final ParseField SORT_MODE = new ParseField("mode");
|
public static final ParseField SORT_MODE = new ParseField("mode");
|
||||||
public static final ParseField UNMAPPED_TYPE = new ParseField("unmapped_type");
|
public static final ParseField UNMAPPED_TYPE = new ParseField("unmapped_type");
|
||||||
|
|
||||||
|
@ -304,12 +304,19 @@ public class FieldSortBuilder extends SortBuilder implements SortBuilderTemp<Fie
|
||||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
if (context.parseFieldMatcher().match(currentFieldName, NESTED_FILTER)) {
|
if (context.parseFieldMatcher().match(currentFieldName, NESTED_FILTER)) {
|
||||||
nestedFilter = context.parseInnerQueryBuilder();
|
nestedFilter = context.parseInnerQueryBuilder();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Expected " + NESTED_FILTER.getPreferredName() + " element.");
|
||||||
}
|
}
|
||||||
} else if (token.isValue()) {
|
} else if (token.isValue()) {
|
||||||
if (context.parseFieldMatcher().match(currentFieldName, NESTED_PATH)) {
|
if (context.parseFieldMatcher().match(currentFieldName, NESTED_PATH)) {
|
||||||
nestedPath = parser.text();
|
nestedPath = parser.text();
|
||||||
} else if (context.parseFieldMatcher().match(currentFieldName, MISSING)) {
|
} else if (context.parseFieldMatcher().match(currentFieldName, MISSING)) {
|
||||||
missing = parser.objectBytes();
|
missing = parser.objectBytes();
|
||||||
|
} else if (context.parseFieldMatcher().match(currentFieldName, REVERSE)) {
|
||||||
|
if (parser.booleanValue()) {
|
||||||
|
order = SortOrder.DESC;
|
||||||
|
}
|
||||||
|
// else we keep the default ASC
|
||||||
} else if (context.parseFieldMatcher().match(currentFieldName, ORDER)) {
|
} else if (context.parseFieldMatcher().match(currentFieldName, ORDER)) {
|
||||||
String sortOrder = parser.text();
|
String sortOrder = parser.text();
|
||||||
if ("asc".equals(sortOrder)) {
|
if ("asc".equals(sortOrder)) {
|
||||||
|
@ -323,6 +330,8 @@ public class FieldSortBuilder extends SortBuilder implements SortBuilderTemp<Fie
|
||||||
sortMode = parser.text();
|
sortMode = parser.text();
|
||||||
} else if (context.parseFieldMatcher().match(currentFieldName, UNMAPPED_TYPE)) {
|
} else if (context.parseFieldMatcher().match(currentFieldName, UNMAPPED_TYPE)) {
|
||||||
unmappedType = parser.text();
|
unmappedType = parser.text();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Option " + currentFieldName + " not supported.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ import java.util.Objects;
|
||||||
/**
|
/**
|
||||||
* A geo distance based sorting on a geo point like field.
|
* A geo distance based sorting on a geo point like field.
|
||||||
*/
|
*/
|
||||||
public class GeoDistanceSortBuilder extends SortBuilder implements SortBuilderTemp<GeoDistanceSortBuilder> {
|
public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder> implements SortBuilderParser<GeoDistanceSortBuilder> {
|
||||||
public static final String NAME = "_geo_distance";
|
public static final String NAME = "_geo_distance";
|
||||||
public static final boolean DEFAULT_COERCE = false;
|
public static final boolean DEFAULT_COERCE = false;
|
||||||
public static final boolean DEFAULT_IGNORE_MALFORMED = false;
|
public static final boolean DEFAULT_IGNORE_MALFORMED = false;
|
||||||
|
|
|
@ -22,7 +22,6 @@ package org.elasticsearch.search.sort;
|
||||||
import org.elasticsearch.common.ParseField;
|
import org.elasticsearch.common.ParseField;
|
||||||
import org.elasticsearch.common.ParseFieldMatcher;
|
import org.elasticsearch.common.ParseFieldMatcher;
|
||||||
import org.elasticsearch.common.ParsingException;
|
import org.elasticsearch.common.ParsingException;
|
||||||
import org.elasticsearch.common.io.stream.NamedWriteable;
|
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
@ -35,7 +34,7 @@ import java.util.Objects;
|
||||||
/**
|
/**
|
||||||
* A sort builder allowing to sort by score.
|
* A sort builder allowing to sort by score.
|
||||||
*/
|
*/
|
||||||
public class ScoreSortBuilder extends SortBuilder<ScoreSortBuilder> implements NamedWriteable<ScoreSortBuilder>,
|
public class ScoreSortBuilder extends SortBuilder<ScoreSortBuilder> implements SortBuilderParser<ScoreSortBuilder>,
|
||||||
SortElementParserTemp<ScoreSortBuilder> {
|
SortElementParserTemp<ScoreSortBuilder> {
|
||||||
|
|
||||||
private static final String NAME = "_score";
|
private static final String NAME = "_score";
|
||||||
|
|
|
@ -25,9 +25,9 @@ import org.elasticsearch.index.query.QueryParseContext;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public interface SortBuilderTemp<T extends ToXContent> extends NamedWriteable<T>, ToXContent {
|
public interface SortBuilderParser<T extends ToXContent> extends NamedWriteable<T>, ToXContent {
|
||||||
/**
|
/**
|
||||||
* Creates a new item from the json held by the {@link SortBuilderTemp}
|
* Creates a new item from the json held by the {@link SortBuilderParser}
|
||||||
* in {@link org.elasticsearch.common.xcontent.XContent} format
|
* in {@link org.elasticsearch.common.xcontent.XContent} format
|
||||||
*
|
*
|
||||||
* @param context
|
* @param context
|
||||||
|
@ -36,5 +36,5 @@ public interface SortBuilderTemp<T extends ToXContent> extends NamedWriteable<T>
|
||||||
* call
|
* call
|
||||||
* @return the new item
|
* @return the new item
|
||||||
*/
|
*/
|
||||||
SortBuilderTemp<T> fromXContent(QueryParseContext context, String elementName) throws IOException;
|
SortBuilder fromXContent(QueryParseContext context, String elementName) throws IOException;
|
||||||
}
|
}
|
|
@ -42,7 +42,7 @@ import java.io.IOException;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.not;
|
import static org.hamcrest.Matchers.not;
|
||||||
|
|
||||||
public abstract class AbstractSortTestCase<T extends SortBuilderTemp<T>> extends ESTestCase {
|
public abstract class AbstractSortTestCase<T extends SortBuilder & SortBuilderParser<T>> extends ESTestCase {
|
||||||
|
|
||||||
protected static NamedWriteableRegistry namedWriteableRegistry;
|
protected static NamedWriteableRegistry namedWriteableRegistry;
|
||||||
|
|
||||||
|
@ -54,6 +54,7 @@ public abstract class AbstractSortTestCase<T extends SortBuilderTemp<T>> extends
|
||||||
namedWriteableRegistry = new NamedWriteableRegistry();
|
namedWriteableRegistry = new NamedWriteableRegistry();
|
||||||
namedWriteableRegistry.registerPrototype(SortBuilder.class, GeoDistanceSortBuilder.PROTOTYPE);
|
namedWriteableRegistry.registerPrototype(SortBuilder.class, GeoDistanceSortBuilder.PROTOTYPE);
|
||||||
namedWriteableRegistry.registerPrototype(SortBuilder.class, ScoreSortBuilder.PROTOTYPE);
|
namedWriteableRegistry.registerPrototype(SortBuilder.class, ScoreSortBuilder.PROTOTYPE);
|
||||||
|
namedWriteableRegistry.registerPrototype(SortBuilder.class, FieldSortBuilder.PROTOTYPE);
|
||||||
indicesQueriesRegistry = new SearchModule(Settings.EMPTY, namedWriteableRegistry).buildQueryParserRegistry();
|
indicesQueriesRegistry = new SearchModule(Settings.EMPTY, namedWriteableRegistry).buildQueryParserRegistry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue