summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsabel Drost-Fromm <isabel.drostfromm@elasticsearch.com>2016-03-24 15:55:21 +0100
committerIsabel Drost-Fromm <isabel.drostfromm@elasticsearch.com>2016-03-24 15:55:21 +0100
commit5dd481bfe3ef81a59217f7809ca51dc4f31b893e (patch)
tree8d803fc6994fcd2bf5dab5b80c7c72ab1f9d9317
parent08d989d9b61a5c4a526b64e9b3d80ad4c4a3cb8d (diff)
Disallow reverse option and check it throws an exception
This adds tests to check that using reverse as sort option is disallowed and throws an exception.
-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());