mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-28 02:48:38 +00:00
Merge pull request #18036 from MaineC/enhancement/switch_geodistancesortbuilder_to_geovalidationmethod
Introduces GeoValidationMethod to GeoDistanceSortBuilder
This commit is contained in:
commit
247b5c8430
core/src
main/java/org/elasticsearch
index/query
GeoBoundingBoxQueryBuilder.javaGeoDistanceQueryBuilder.javaGeoDistanceRangeQueryBuilder.javaGeoPolygonQueryBuilder.java
search/sort
test/java/org/elasticsearch
docs/reference
migration/migrate_5_0
query-dsl
@ -64,10 +64,12 @@ public class GeoBoundingBoxQueryBuilder extends AbstractQueryBuilder<GeoBounding
|
||||
*/
|
||||
public static final boolean DEFAULT_IGNORE_UNMAPPED = false;
|
||||
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed");
|
||||
private static final ParseField TYPE_FIELD = new ParseField("type");
|
||||
private static final ParseField VALIDATION_METHOD_FIELD = new ParseField("validation_method");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize");
|
||||
private static final ParseField COERCE_FIELD =new ParseField("coerce", "normalize")
|
||||
.withAllDeprecated("use field validation_method instead");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed")
|
||||
.withAllDeprecated("use field validation_method instead");
|
||||
private static final ParseField FIELD_FIELD = new ParseField("field");
|
||||
private static final ParseField TOP_FIELD = new ParseField("top");
|
||||
private static final ParseField BOTTOM_FIELD = new ParseField("bottom");
|
||||
|
@ -73,8 +73,10 @@ public class GeoDistanceQueryBuilder extends AbstractQueryBuilder<GeoDistanceQue
|
||||
public static final boolean DEFAULT_IGNORE_UNMAPPED = false;
|
||||
|
||||
private static final ParseField VALIDATION_METHOD_FIELD = new ParseField("validation_method");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField OPTIMIZE_BBOX_FIELD = new ParseField("optimize_bbox");
|
||||
private static final ParseField DISTANCE_TYPE_FIELD = new ParseField("distance_type");
|
||||
private static final ParseField UNIT_FIELD = new ParseField("unit");
|
||||
|
@ -78,8 +78,10 @@ public class GeoDistanceRangeQueryBuilder extends AbstractQueryBuilder<GeoDistan
|
||||
private static final ParseField NAME_FIELD = new ParseField("_name");
|
||||
private static final ParseField BOOST_FIELD = new ParseField("boost");
|
||||
private static final ParseField OPTIMIZE_BBOX_FIELD = new ParseField("optimize_bbox");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField VALIDATION_METHOD = new ParseField("validation_method");
|
||||
private static final ParseField IGNORE_UNMAPPED_FIELD = new ParseField("ignore_unmapped");
|
||||
|
||||
|
@ -54,8 +54,10 @@ public class GeoPolygonQueryBuilder extends AbstractQueryBuilder<GeoPolygonQuery
|
||||
*/
|
||||
public static final boolean DEFAULT_IGNORE_UNMAPPED = false;
|
||||
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField VALIDATION_METHOD = new ParseField("validation_method");
|
||||
private static final ParseField POINTS_FIELD = new ParseField("points");
|
||||
private static final ParseField IGNORE_UNMAPPED_FIELD = new ParseField("ignore_unmapped");
|
||||
@ -232,9 +234,7 @@ public class GeoPolygonQueryBuilder extends AbstractQueryBuilder<GeoPolygonQuery
|
||||
builder.endArray();
|
||||
builder.endObject();
|
||||
|
||||
builder.field(COERCE_FIELD.getPreferredName(), GeoValidationMethod.isCoerce(validationMethod));
|
||||
builder.field(IGNORE_MALFORMED_FIELD.getPreferredName(),
|
||||
GeoValidationMethod.isIgnoreMalformed(validationMethod));
|
||||
builder.field(VALIDATION_METHOD.getPreferredName(), validationMethod);
|
||||
builder.field(IGNORE_UNMAPPED_FIELD.getPreferredName(), ignoreUnmapped);
|
||||
|
||||
printBoostAndQueryName(builder);
|
||||
|
@ -47,6 +47,7 @@ import org.elasticsearch.index.fielddata.MultiGeoPointValues;
|
||||
import org.elasticsearch.index.fielddata.NumericDoubleValues;
|
||||
import org.elasticsearch.index.fielddata.SortedNumericDoubleValues;
|
||||
import org.elasticsearch.index.mapper.MappedFieldType;
|
||||
import org.elasticsearch.index.query.GeoValidationMethod;
|
||||
import org.elasticsearch.index.query.QueryBuilder;
|
||||
import org.elasticsearch.index.query.QueryParseContext;
|
||||
import org.elasticsearch.index.query.QueryShardContext;
|
||||
@ -65,16 +66,18 @@ import java.util.Objects;
|
||||
public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder> {
|
||||
public static final String NAME = "_geo_distance";
|
||||
public static final String ALTERNATIVE_NAME = "_geoDistance";
|
||||
public static final boolean DEFAULT_COERCE = false;
|
||||
public static final boolean DEFAULT_IGNORE_MALFORMED = false;
|
||||
public static final ParseField UNIT_FIELD = new ParseField("unit");
|
||||
public static final ParseField DISTANCE_TYPE_FIELD = new ParseField("distance_type");
|
||||
public static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize");
|
||||
public static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed");
|
||||
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 GeoValidationMethod DEFAULT_VALIDATION = GeoValidationMethod.DEFAULT;
|
||||
|
||||
private static final ParseField UNIT_FIELD = new ParseField("unit");
|
||||
private static final ParseField DISTANCE_TYPE_FIELD = new ParseField("distance_type");
|
||||
private static final ParseField VALIDATION_METHOD_FIELD = new ParseField("validation_method");
|
||||
private static final ParseField IGNORE_MALFORMED_FIELD = new ParseField("ignore_malformed")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField COERCE_FIELD = new ParseField("coerce", "normalize")
|
||||
.withAllDeprecated("use validation_method instead");
|
||||
private static final ParseField SORTMODE_FIELD = new ParseField("mode", "sort_mode");
|
||||
private static final ParseField NESTED_PATH_FIELD = new ParseField("nested_path");
|
||||
private static final ParseField NESTED_FILTER_FIELD = new ParseField("nested_filter");
|
||||
|
||||
private final String fieldName;
|
||||
private final List<GeoPoint> points = new ArrayList<>();
|
||||
@ -87,9 +90,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
private QueryBuilder nestedFilter;
|
||||
private String nestedPath;
|
||||
|
||||
// TODO switch to GeoValidationMethod enum
|
||||
private boolean coerce = DEFAULT_COERCE;
|
||||
private boolean ignoreMalformed = DEFAULT_IGNORE_MALFORMED;
|
||||
private GeoValidationMethod validation = DEFAULT_VALIDATION;
|
||||
|
||||
/**
|
||||
* Constructs a new distance based sort on a geo point like field.
|
||||
@ -144,8 +145,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
this.sortMode = original.sortMode;
|
||||
this.nestedFilter = original.nestedFilter;
|
||||
this.nestedPath = original.nestedPath;
|
||||
this.coerce = original.coerce;
|
||||
this.ignoreMalformed = original.ignoreMalformed;
|
||||
this.validation = original.validation;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -161,8 +161,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
sortMode = in.readOptionalWriteable(SortMode::readFromStream);
|
||||
nestedFilter = in.readOptionalNamedWriteable(QueryBuilder.class);
|
||||
nestedPath = in.readOptionalString();
|
||||
coerce = in.readBoolean();
|
||||
ignoreMalformed =in.readBoolean();
|
||||
validation = GeoValidationMethod.readFromStream(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -175,8 +174,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
out.writeOptionalWriteable(sortMode);
|
||||
out.writeOptionalNamedWriteable(nestedFilter);
|
||||
out.writeOptionalString(nestedPath);
|
||||
out.writeBoolean(coerce);
|
||||
out.writeBoolean(ignoreMalformed);
|
||||
validation.writeTo(out);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -257,6 +255,21 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
return this.unit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets validation method for this sort builder.
|
||||
*/
|
||||
public GeoDistanceSortBuilder validation(GeoValidationMethod method) {
|
||||
this.validation = method;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the validation method to use for this sort builder.
|
||||
*/
|
||||
public GeoValidationMethod validation() {
|
||||
return validation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines which distance to use for sorting in the case a document contains multiple geo points.
|
||||
* Possible values: min and max
|
||||
@ -309,26 +322,6 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
return this.nestedPath;
|
||||
}
|
||||
|
||||
public GeoDistanceSortBuilder coerce(boolean coerce) {
|
||||
this.coerce = coerce;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean coerce() {
|
||||
return this.coerce;
|
||||
}
|
||||
|
||||
public GeoDistanceSortBuilder ignoreMalformed(boolean ignoreMalformed) {
|
||||
if (coerce == false) {
|
||||
this.ignoreMalformed = ignoreMalformed;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean ignoreMalformed() {
|
||||
return this.ignoreMalformed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||
builder.startObject();
|
||||
@ -354,8 +347,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
if (nestedFilter != null) {
|
||||
builder.field(NESTED_FILTER_FIELD.getPreferredName(), nestedFilter, params);
|
||||
}
|
||||
builder.field(COERCE_FIELD.getPreferredName(), coerce);
|
||||
builder.field(IGNORE_MALFORMED_FIELD.getPreferredName(), ignoreMalformed);
|
||||
builder.field(VALIDATION_METHOD_FIELD.getPreferredName(), validation);
|
||||
|
||||
builder.endObject();
|
||||
builder.endObject();
|
||||
@ -386,14 +378,14 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
Objects.equals(order, other.order) &&
|
||||
Objects.equals(nestedFilter, other.nestedFilter) &&
|
||||
Objects.equals(nestedPath, other.nestedPath) &&
|
||||
Objects.equals(coerce, other.coerce) &&
|
||||
Objects.equals(ignoreMalformed, other.ignoreMalformed);
|
||||
Objects.equals(validation, other.validation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.fieldName, this.points, this.geoDistance,
|
||||
this.unit, this.sortMode, this.order, this.nestedFilter, this.nestedPath, this.coerce, this.ignoreMalformed);
|
||||
this.unit, this.sortMode, this.order, this.nestedFilter,
|
||||
this.nestedPath, this.validation);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -417,8 +409,9 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
QueryBuilder<?> nestedFilter = null;
|
||||
String nestedPath = null;
|
||||
|
||||
boolean coerce = GeoDistanceSortBuilder.DEFAULT_COERCE;
|
||||
boolean ignoreMalformed = GeoDistanceSortBuilder.DEFAULT_IGNORE_MALFORMED;
|
||||
boolean coerce = GeoValidationMethod.DEFAULT_LENIENT_PARSING;
|
||||
boolean ignoreMalformed = GeoValidationMethod.DEFAULT_LENIENT_PARSING;
|
||||
GeoValidationMethod validation = null;
|
||||
|
||||
XContentParser.Token token;
|
||||
String currentName = parser.currentName();
|
||||
@ -463,6 +456,8 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
if (coerce == false) {
|
||||
ignoreMalformed = ignore_malformed_value;
|
||||
}
|
||||
} else if (parseFieldMatcher.match(currentName, VALIDATION_METHOD_FIELD)) {
|
||||
validation = GeoValidationMethod.fromString(parser.text());
|
||||
} else if (parseFieldMatcher.match(currentName, SORTMODE_FIELD)) {
|
||||
sortMode = SortMode.fromString(parser.text());
|
||||
} else if (parseFieldMatcher.match(currentName, NESTED_PATH_FIELD)) {
|
||||
@ -498,8 +493,13 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
}
|
||||
result.setNestedFilter(nestedFilter);
|
||||
result.setNestedPath(nestedPath);
|
||||
result.coerce(coerce);
|
||||
result.ignoreMalformed(ignoreMalformed);
|
||||
if (validation == null) {
|
||||
// looks like either validation was left unset or we are parsing old validation json
|
||||
result.validation(GeoValidationMethod.infer(coerce, ignoreMalformed));
|
||||
} else {
|
||||
// ignore deprecated coerce/ignore_malformed
|
||||
result.validation(validation);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -512,7 +512,7 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
localPoints.add(new GeoPoint(geoPoint));
|
||||
}
|
||||
|
||||
if (!indexCreatedBeforeV2_0 && !ignoreMalformed) {
|
||||
if (!indexCreatedBeforeV2_0 && !GeoValidationMethod.isIgnoreMalformed(validation)) {
|
||||
for (GeoPoint point : localPoints) {
|
||||
if (GeoUtils.isValidLatitude(point.lat()) == false) {
|
||||
throw new ElasticsearchParseException(
|
||||
@ -529,9 +529,9 @@ public class GeoDistanceSortBuilder extends SortBuilder<GeoDistanceSortBuilder>
|
||||
}
|
||||
}
|
||||
|
||||
if (coerce) {
|
||||
if (GeoValidationMethod.isCoerce(validation)) {
|
||||
for (GeoPoint point : localPoints) {
|
||||
GeoUtils.normalizePoint(point, coerce, coerce);
|
||||
GeoUtils.normalizePoint(point, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -505,6 +505,42 @@ public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase<GeoBo
|
||||
}
|
||||
}
|
||||
|
||||
public void testFromJsonCoerceFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_bounding_box\" : {\n" +
|
||||
" \"pin.location\" : {\n" +
|
||||
" \"top_left\" : [ -74.1, 40.73 ],\n" +
|
||||
" \"bottom_right\" : [ -71.12, 40.01 ]\n" +
|
||||
" },\n" +
|
||||
" \"coerce\" : true,\n" +
|
||||
" \"type\" : \"MEMORY\",\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
public void testFromJsonIgnoreMalformedFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_bounding_box\" : {\n" +
|
||||
" \"pin.location\" : {\n" +
|
||||
" \"top_left\" : [ -74.1, 40.73 ],\n" +
|
||||
" \"bottom_right\" : [ -71.12, 40.01 ]\n" +
|
||||
" },\n" +
|
||||
" \"ignore_malformed\" : true,\n" +
|
||||
" \"type\" : \"MEMORY\",\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testMustRewrite() throws IOException {
|
||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||
|
@ -420,6 +420,40 @@ public class GeoDistanceQueryBuilderTests extends AbstractQueryTestCase<GeoDista
|
||||
assertEquals(json, 12000.0, parsed.distance(), 0.0001);
|
||||
}
|
||||
|
||||
public void testFromCoerceFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_distance\" : {\n" +
|
||||
" \"pin.location\" : [ -70.0, 40.0 ],\n" +
|
||||
" \"distance\" : 12000.0,\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"optimize_bbox\" : \"memory\",\n" +
|
||||
" \"coerce\" : true,\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
public void testFromJsonIgnoreMalformedFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_distance\" : {\n" +
|
||||
" \"pin.location\" : [ -70.0, 40.0 ],\n" +
|
||||
" \"distance\" : 12000.0,\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"optimize_bbox\" : \"memory\",\n" +
|
||||
" \"ignore_malformed\" : true,\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testMustRewrite() throws IOException {
|
||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||
|
@ -357,6 +357,48 @@ public class GeoDistanceRangeQueryTests extends AbstractQueryTestCase<GeoDistanc
|
||||
assertEquals(json, -70.0, parsed.point().lon(), 0.0001);
|
||||
}
|
||||
|
||||
public void testFromJsonCoerceFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_distance_range\" : {\n" +
|
||||
" \"pin.location\" : [ -70.0, 40.0 ],\n" +
|
||||
" \"from\" : \"200km\",\n" +
|
||||
" \"to\" : \"400km\",\n" +
|
||||
" \"include_lower\" : true,\n" +
|
||||
" \"include_upper\" : true,\n" +
|
||||
" \"unit\" : \"m\",\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"optimize_bbox\" : \"memory\",\n" +
|
||||
" \"coerce\" : true,\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
public void testFromJsonIgnoreMalformedFails() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_distance_range\" : {\n" +
|
||||
" \"pin.location\" : [ -70.0, 40.0 ],\n" +
|
||||
" \"from\" : \"200km\",\n" +
|
||||
" \"to\" : \"400km\",\n" +
|
||||
" \"include_lower\" : true,\n" +
|
||||
" \"include_upper\" : true,\n" +
|
||||
" \"unit\" : \"m\",\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"optimize_bbox\" : \"memory\",\n" +
|
||||
" \"ignore_malformed\" : true,\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testMustRewrite() throws IOException {
|
||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||
|
@ -207,7 +207,7 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase<GeoPolygo
|
||||
parseQuery(builder.string());
|
||||
fail("normalize is deprecated");
|
||||
} catch (IllegalArgumentException ex) {
|
||||
assertEquals("Deprecated field [normalize] used, expected [coerce] instead", ex.getMessage());
|
||||
assertEquals("Deprecated field [normalize] used, replaced by [use validation_method instead]", ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -342,8 +342,7 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase<GeoPolygo
|
||||
" \"person.location\" : {\n" +
|
||||
" \"points\" : [ [ -70.0, 40.0 ], [ -80.0, 30.0 ], [ -90.0, 20.0 ], [ -70.0, 40.0 ] ]\n" +
|
||||
" },\n" +
|
||||
" \"coerce\" : false,\n" +
|
||||
" \"ignore_malformed\" : false,\n" +
|
||||
" \"validation_method\" : \"STRICT\",\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
@ -353,6 +352,38 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase<GeoPolygo
|
||||
assertEquals(json, 4, parsed.points().size());
|
||||
}
|
||||
|
||||
public void testFromJsonIgnoreMalformedDeprecated() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_polygon\" : {\n" +
|
||||
" \"person.location\" : {\n" +
|
||||
" \"points\" : [ [ -70.0, 40.0 ], [ -80.0, 30.0 ], [ -90.0, 20.0 ], [ -70.0, 40.0 ] ]\n" +
|
||||
" },\n" +
|
||||
" \"ignore_malformed\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
|
||||
}
|
||||
|
||||
public void testFromJsonCoerceDeprecated() throws IOException {
|
||||
String json =
|
||||
"{\n" +
|
||||
" \"geo_polygon\" : {\n" +
|
||||
" \"person.location\" : {\n" +
|
||||
" \"points\" : [ [ -70.0, 40.0 ], [ -80.0, 30.0 ], [ -90.0, 20.0 ], [ -70.0, 40.0 ] ]\n" +
|
||||
" },\n" +
|
||||
" \"coerce\" : false,\n" +
|
||||
" \"ignore_unmapped\" : false,\n" +
|
||||
" \"boost\" : 1.0\n" +
|
||||
" }\n" +
|
||||
"}";
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(json));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testMustRewrite() throws IOException {
|
||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||
|
@ -28,6 +28,7 @@ import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.text.Text;
|
||||
import org.elasticsearch.common.unit.DistanceUnit;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.index.query.GeoValidationMethod;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
@ -314,7 +315,7 @@ public class GeoDistanceSortBuilderIT extends ESIntegTestCase {
|
||||
.setSource(
|
||||
new SearchSourceBuilder().sort(SortBuilders.geoDistanceSort(LOCATION_FIELD, 2.0, 2.0)
|
||||
.unit(DistanceUnit.KILOMETERS).geoDistance(GeoDistance.PLANE)
|
||||
.ignoreMalformed(true).coerce(true))).execute().actionGet();
|
||||
.validation(GeoValidationMethod.COERCE))).execute().actionGet();
|
||||
checkCorrectSortOrderForGeoSort(searchResponse);
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@ import org.elasticsearch.common.xcontent.XContentHelper;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.index.mapper.MappedFieldType;
|
||||
import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper;
|
||||
import org.elasticsearch.index.query.GeoValidationMethod;
|
||||
import org.elasticsearch.index.query.QueryParseContext;
|
||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||
import org.elasticsearch.test.geo.RandomGeoGenerator;
|
||||
@ -79,13 +80,13 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
result.geoDistance(geoDistance(result.geoDistance()));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.unit(unit(result.unit()));
|
||||
result.unit(randomValueOtherThan(result.unit(), () -> randomFrom(DistanceUnit.values())));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.order(randomFrom(SortOrder.values()));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.sortMode(mode(result.sortMode()));
|
||||
result.sortMode(randomValueOtherThan(SortMode.SUM, () -> randomFrom(SortMode.values())));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.setNestedFilter(randomNestedFilter());
|
||||
@ -97,10 +98,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
() -> randomAsciiOfLengthBetween(1, 10)));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.coerce(! result.coerce());
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
result.ignoreMalformed(! result.ignoreMalformed());
|
||||
result.validation(randomValueOtherThan(result.validation(), () -> randomFrom(GeoValidationMethod.values())));
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -113,22 +111,6 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
return clone;
|
||||
}
|
||||
|
||||
private static SortMode mode(SortMode original) {
|
||||
SortMode result;
|
||||
do {
|
||||
result = randomFrom(SortMode.values());
|
||||
} while (result == SortMode.SUM || result == original);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static DistanceUnit unit(DistanceUnit original) {
|
||||
int id = -1;
|
||||
while (id == -1 || (original != null && original.ordinal() == id)) {
|
||||
id = randomIntBetween(0, DistanceUnit.values().length - 1);
|
||||
}
|
||||
return DistanceUnit.values()[id];
|
||||
}
|
||||
|
||||
private static GeoPoint[] points(GeoPoint[] original) {
|
||||
GeoPoint[] result = null;
|
||||
while (result == null || Arrays.deepEquals(original, result)) {
|
||||
@ -152,7 +134,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
@Override
|
||||
protected GeoDistanceSortBuilder mutate(GeoDistanceSortBuilder original) throws IOException {
|
||||
GeoDistanceSortBuilder result = new GeoDistanceSortBuilder(original);
|
||||
int parameter = randomIntBetween(0, 9);
|
||||
int parameter = randomIntBetween(0, 8);
|
||||
switch (parameter) {
|
||||
case 0:
|
||||
while (Arrays.deepEquals(original.points(), result.points())) {
|
||||
@ -167,13 +149,15 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
result.geoDistance(geoDistance(original.geoDistance()));
|
||||
break;
|
||||
case 3:
|
||||
result.unit(unit(original.unit()));
|
||||
result.unit(randomValueOtherThan(result.unit(), () -> randomFrom(DistanceUnit.values())));
|
||||
break;
|
||||
case 4:
|
||||
result.order(randomValueOtherThan(original.order(), () -> randomFrom(SortOrder.values())));
|
||||
break;
|
||||
case 5:
|
||||
result.sortMode(mode(original.sortMode()));
|
||||
result.sortMode(randomValueOtherThanMany(
|
||||
Arrays.asList(SortMode.SUM, result.sortMode())::contains,
|
||||
() -> randomFrom(SortMode.values())));
|
||||
break;
|
||||
case 6:
|
||||
result.setNestedFilter(randomValueOtherThan(
|
||||
@ -186,12 +170,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
() -> randomAsciiOfLengthBetween(1, 10)));
|
||||
break;
|
||||
case 8:
|
||||
result.coerce(! original.coerce());
|
||||
break;
|
||||
case 9:
|
||||
// ignore malformed will only be set if coerce is set to true
|
||||
result.coerce(false);
|
||||
result.ignoreMalformed(! original.ignoreMalformed());
|
||||
result.validation(randomValueOtherThan(result.validation(), () -> randomFrom(GeoValidationMethod.values())));
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
@ -269,7 +248,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
|
||||
try {
|
||||
GeoDistanceSortBuilder item = GeoDistanceSortBuilder.fromXContent(context, "");
|
||||
item.ignoreMalformed(false);
|
||||
item.validation(GeoValidationMethod.STRICT);
|
||||
item.build(createMockShardContext());
|
||||
|
||||
fail("adding reverse sorting option should fail with an exception");
|
||||
@ -277,6 +256,48 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
assertEquals("illegal latitude value [269.384765625] for [GeoDistanceSort] for field [reverse].", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testCoerceIsDeprecated() throws IOException {
|
||||
String json = "{\n" +
|
||||
" \"testname\" : [ {\n" +
|
||||
" \"lat\" : -6.046997540714173,\n" +
|
||||
" \"lon\" : -51.94128329747579\n" +
|
||||
" } ],\n" +
|
||||
" \"unit\" : \"m\",\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"mode\" : \"SUM\",\n" +
|
||||
" \"coerce\" : true\n" +
|
||||
"}";
|
||||
XContentParser itemParser = XContentHelper.createParser(new BytesArray(json));
|
||||
itemParser.nextToken();
|
||||
|
||||
QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT);
|
||||
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> GeoDistanceSortBuilder.fromXContent(context, ""));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
|
||||
}
|
||||
|
||||
public void testIgnoreMalformedIsDeprecated() throws IOException {
|
||||
String json = "{\n" +
|
||||
" \"testname\" : [ {\n" +
|
||||
" \"lat\" : -6.046997540714173,\n" +
|
||||
" \"lon\" : -51.94128329747579\n" +
|
||||
" } ],\n" +
|
||||
" \"unit\" : \"m\",\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"mode\" : \"SUM\",\n" +
|
||||
" \"ignore_malformed\" : true\n" +
|
||||
"}";
|
||||
XContentParser itemParser = XContentHelper.createParser(new BytesArray(json));
|
||||
itemParser.nextToken();
|
||||
|
||||
QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT);
|
||||
|
||||
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> GeoDistanceSortBuilder.fromXContent(context, ""));
|
||||
assertTrue(e.getMessage().startsWith("Deprecated field "));
|
||||
|
||||
}
|
||||
|
||||
public void testSortModeSumIsRejectedInJSON() throws IOException {
|
||||
String json = "{\n" +
|
||||
@ -286,9 +307,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
" } ],\n" +
|
||||
" \"unit\" : \"m\",\n" +
|
||||
" \"distance_type\" : \"sloppy_arc\",\n" +
|
||||
" \"mode\" : \"SUM\",\n" +
|
||||
" \"coerce\" : false,\n" +
|
||||
" \"ignore_malformed\" : false\n" +
|
||||
" \"mode\" : \"SUM\"\n" +
|
||||
"}";
|
||||
XContentParser itemParser = XContentHelper.createParser(new BytesArray(json));
|
||||
itemParser.nextToken();
|
||||
@ -313,8 +332,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc
|
||||
" \"boost\" : 5.711116\n" +
|
||||
" }\n" +
|
||||
" },\n" +
|
||||
" \"coerce\" : false,\n" +
|
||||
" \"ignore_malformed\" : true\n" +
|
||||
" \"validation_method\" : \"STRICT\"\n" +
|
||||
" }";
|
||||
XContentParser itemParser = XContentHelper.createParser(new BytesArray(json));
|
||||
itemParser.nextToken();
|
||||
|
@ -126,7 +126,13 @@ in favour of `query` and `no_match_query`.
|
||||
|
||||
* The `exists` query will now fail if the `_field_names` field is disabled.
|
||||
|
||||
* Deprecated support for the coerce, normalize, ignore_malformed parameters in GeoPolygonQuery. Use parameter validation_method instead.
|
||||
|
||||
* Deprecated support for the coerce, normalize, ignore_malformed parameters in GeoDistanceRangeQuery. Use parameter validation_method instead.
|
||||
|
||||
* Deprecated support for the coerce, normalize, ignore_malformed parameters in GeoDistanceQuery. Use parameter validation_method instead.
|
||||
|
||||
* Deprecated support for the coerce, normalize, ignore_malformed parameters in GeoBoundingBoxQuery. Use parameter validation_method instead.
|
||||
==== Top level `filter` parameter
|
||||
|
||||
Removed support for the deprecated top level `filter` in the search api,
|
||||
@ -149,6 +155,8 @@ vectors don't support distributed document frequencies anymore.
|
||||
The `reverse` parameter has been removed, in favour of explicitly
|
||||
specifying the sort order with the `order` option.
|
||||
|
||||
The `coerce` and `ignore_malformed` parameters were deprecated in favour of `validation_method`.
|
||||
|
||||
==== Inner hits
|
||||
|
||||
* Top level inner hits syntax has been removed. Inner hits can now only be specified as part of the `nested`,
|
||||
|
@ -52,9 +52,13 @@ Then the following simple query can be executed with a
|
||||
|Option |Description
|
||||
|`_name` |Optional name field to identify the filter
|
||||
|
||||
|`ignore_malformed` |Set to `true` to
|
||||
|`ignore_malformed` |deprecated[5.0.0,Use `validation_method` instead] Set to `true` to
|
||||
accept geo points with invalid latitude or longitude (default is `false`).
|
||||
|
||||
|`validation_method` |Set to `IGNORE_MALFORMED` to
|
||||
accept geo points with invalid latitude or longitude, set to
|
||||
`COERCE` to also try to infer correct latitude or longitude. (default is `STRICT`).
|
||||
|
||||
|`type` |Set to one of `indexed` or `memory` to defines whether this filter will
|
||||
be executed in memory or indexed. See <<geo-bbox-type,Type>> below for further details
|
||||
Default is `memory`.
|
||||
|
@ -163,10 +163,16 @@ The following are options allowed on the filter:
|
||||
Optional name field to identify the query
|
||||
|
||||
`ignore_malformed`::
|
||||
|
||||
Set to `true` to accept geo points with invalid latitude or
|
||||
|
||||
deprecated[5.0.0,Use `validation_method` instead] Set to `true` to accept geo points with invalid latitude or
|
||||
longitude (default is `false`).
|
||||
|
||||
`validation_method`::
|
||||
|
||||
Set to `IGNORE_MALFORMED` to accept geo points with invalid latitude or
|
||||
longitude, set to `COERCE` to additionally try and infer correct
|
||||
coordinates (default is `STRICT`).
|
||||
|
||||
[float]
|
||||
==== geo_point Type
|
||||
|
||||
|
@ -34,8 +34,12 @@ points. Here is an example:
|
||||
|Option |Description
|
||||
|`_name` |Optional name field to identify the filter
|
||||
|
||||
|`ignore_malformed` |Set to `true` to accept geo points with invalid latitude or
|
||||
|`ignore_malformed` |deprecated[5.0.0,Use `validation_method` instead] Set to `true` to accept geo points with invalid latitude or
|
||||
longitude (default is `false`).
|
||||
|
||||
|`validation_method` |Set to `IGNORE_MALFORMED` to accept geo points with
|
||||
invalid latitude or longitude, `COERCE` to try and infer correct latitude
|
||||
or longitude, or `STRICT` (default is `STRICT`).
|
||||
|=======================================================================
|
||||
|
||||
[float]
|
||||
|
Loading…
x
Reference in New Issue
Block a user