summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java10
-rw-r--r--core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java1
-rw-r--r--core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java28
-rw-r--r--core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java24
-rw-r--r--core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java21
6 files changed, 85 insertions, 3 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java b/core/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java
index f75ea37f85..414062c0cd 100644
--- a/core/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java
@@ -372,14 +372,14 @@ public class FieldSortBuilder extends SortBuilder<FieldSortBuilder> {
} else if ("desc".equals(sortOrder)) {
order = SortOrder.DESC;
} else {
- throw new IllegalStateException("Sort order " + sortOrder + " not supported.");
+ throw new ParsingException(parser.getTokenLocation(), "Sort order [{}] not supported.", sortOrder);
}
} else if (context.parseFieldMatcher().match(currentFieldName, SORT_MODE)) {
sortMode = SortMode.fromString(parser.text());
} else if (context.parseFieldMatcher().match(currentFieldName, UNMAPPED_TYPE)) {
unmappedType = parser.text();
} else {
- throw new IllegalArgumentException("Option " + currentFieldName + " not supported.");
+ throw new ParsingException(parser.getTokenLocation(), "Option [{}] not supported.", currentFieldName);
}
}
}
diff --git a/core/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java b/core/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java
index 4712799c65..c6a63d5f08 100644
--- a/core/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/sort/GeoDistanceSortBuilder.java
@@ -29,6 +29,7 @@ import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.Version;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.ParseFieldMatcher;
+import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.geo.GeoDistance.FixedSourceDistance;
import org.elasticsearch.common.geo.GeoPoint;
@@ -72,6 +73,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
public static final ParseField SORTMODE_FIELD = new ParseField("mode", "sort_mode");
public static final ParseField NESTED_PATH_FIELD = new ParseField("nested_path");
public static final ParseField NESTED_FILTER_FIELD = new ParseField("nested_filter");
+ public static final ParseField REVERSE_FORBIDDEN = new ParseField("reverse");
public static final GeoDistanceSortBuilder PROTOTYPE = new GeoDistanceSortBuilder("_na_", -1, -1);
@@ -465,6 +467,14 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
sortMode = SortMode.fromString(parser.text());
} else if (parseFieldMatcher.match(currentName, NESTED_PATH_FIELD)) {
nestedPath = parser.text();
+ } else if (parseFieldMatcher.match(currentName, REVERSE_FORBIDDEN)) {
+ // explicitly filter for reverse in json: used to be a valid sort option, forbidden now,
+ // if not filtered here it will be treated as a reference to a field in the index with
+ // geo coordinates given as geohash string
+ throw new ParsingException(
+ parser.getTokenLocation(),
+ "Sort option [{}] no longer supported.",
+ REVERSE_FORBIDDEN.getPreferredName());
} else {
GeoPoint point = new GeoPoint();
point.resetFromString(parser.text());
diff --git a/core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java b/core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java
index 9124540f88..c222634ca0 100644
--- a/core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java
@@ -41,6 +41,7 @@ public class ScoreSortBuilder extends SortBuilder<ScoreSortBuilder> {
public static final String NAME = "_score";
public static final ScoreSortBuilder PROTOTYPE = new ScoreSortBuilder();
public static final ParseField ORDER_FIELD = new ParseField("order");
+ private static final ParseField REVERSE_FORBIDDEN = new ParseField("reverse");
private static final SortField SORT_SCORE = new SortField(null, SortField.Type.SCORE);
private static final SortField SORT_SCORE_REVERSE = new SortField(null, SortField.Type.SCORE, true);
diff --git a/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java
index 2c1a4a65c7..f28ec8797c 100644
--- a/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java
@@ -20,6 +20,12 @@ x * Licensed to Elasticsearch under one or more contributor
package org.elasticsearch.search.sort;
import org.apache.lucene.search.SortField;
+import org.elasticsearch.common.ParseFieldMatcher;
+import org.elasticsearch.common.ParsingException;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.index.query.QueryParseContext;
import java.io.IOException;
@@ -103,4 +109,26 @@ public class FieldSortBuilderTests extends AbstractSortTestCase<FieldSortBuilder
assertEquals(builder.getFieldName(), sortField.getField());
}
}
+
+ public void testReverseOptionFails() throws IOException {
+ QueryParseContext context = new QueryParseContext(indicesQueriesRegistry);
+ context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY));
+ String json = "{ \"post_date\" : {\"reverse\" : true} },\n";
+
+ XContentParser parser = XContentFactory.xContent(json).createParser(json);
+ // need to skip until parser is located on second START_OBJECT
+ parser.nextToken();
+ parser.nextToken();
+ parser.nextToken();
+
+ context.reset(parser);
+
+ try {
+ FieldSortBuilder.PROTOTYPE.fromXContent(context, "");
+ fail("adding reverse sorting option should fail with an exception");
+ } catch (ParsingException e) {
+ // all good
+ }
+ }
+
}
diff --git a/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java
index 7544e644b0..e63cb5ad29 100644
--- a/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java
@@ -21,6 +21,7 @@ package org.elasticsearch.search.sort;
import org.apache.lucene.search.SortField;
+import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.geo.GeoDistance;
import org.elasticsearch.common.geo.GeoPoint;
@@ -202,6 +203,28 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
}
}
+ public void testReverseOptionFails() throws IOException {
+ String json = "{\n" +
+ " \"testname\" : [ {\n" +
+ " \"lat\" : -6.046997540714173,\n" +
+ " \"lon\" : -51.94128329747579\n" +
+ " } ],\n" +
+ " \"reverse\" : true\n" +
+ "}";
+ XContentParser itemParser = XContentHelper.createParser(new BytesArray(json));
+ itemParser.nextToken();
+
+ QueryParseContext context = new QueryParseContext(indicesQueriesRegistry);
+ context.reset(itemParser);
+
+ try {
+ GeoDistanceSortBuilder.PROTOTYPE.fromXContent(context, "");
+ fail("adding reverse sorting option should fail with an exception");
+ } catch (ParsingException e) {
+ assertEquals("Sort option [reverse] no longer supported.", e.getMessage());
+ }
+ }
+
public void testSortModeSumIsRejectedInJSON() throws IOException {
String json = "{\n" +
" \"testname\" : [ {\n" +
@@ -210,7 +233,6 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
" } ],\n" +
" \"unit\" : \"m\",\n" +
" \"distance_type\" : \"sloppy_arc\",\n" +
- " \"reverse\" : true,\n" +
" \"mode\" : \"SUM\",\n" +
" \"coerce\" : false,\n" +
" \"ignore_malformed\" : false\n" +
diff --git a/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java
index 225ae49ad5..6d605fd625 100644
--- a/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java
@@ -22,6 +22,7 @@ package org.elasticsearch.search.sort;
import org.apache.lucene.search.SortField;
import org.elasticsearch.common.ParseFieldMatcher;
+import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
@@ -81,6 +82,26 @@ public class ScoreSortBuilderTests extends AbstractSortTestCase<ScoreSortBuilder
assertEquals(order, scoreSort.order());
}
+ public void testReverseOptionFails() throws IOException {
+ QueryParseContext context = new QueryParseContext(indicesQueriesRegistry);
+ context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY));
+ String json = "{ \"_score\": { \"reverse\": true }}";
+ XContentParser parser = XContentFactory.xContent(json).createParser(json);
+ // need to skip until parser is located on second START_OBJECT
+ parser.nextToken();
+ parser.nextToken();
+ parser.nextToken();
+
+ context.reset(parser);
+
+ try {
+ ScoreSortBuilder.PROTOTYPE.fromXContent(context, "_score");
+ fail("adding reverse sorting option should fail with an exception");
+ } catch (ParsingException e) {
+ // all good
+ }
+ }
+
@Override
protected void sortFieldAssertions(ScoreSortBuilder builder, SortField sortField) {
assertEquals(SortField.Type.SCORE, sortField.getType());