|
@@ -24,13 +24,10 @@ import org.apache.lucene.spatial.prefix.RecursivePrefixTreeStrategy;
|
|
|
import org.apache.lucene.spatial.prefix.tree.GeohashPrefixTree;
|
|
|
import org.apache.lucene.spatial.prefix.tree.QuadPrefixTree;
|
|
|
import org.elasticsearch.ElasticsearchException;
|
|
|
-import org.elasticsearch.ElasticsearchParseException;
|
|
|
import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.cluster.metadata.IndexMetadata;
|
|
|
import org.elasticsearch.common.Explicit;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
-import org.elasticsearch.common.bytes.BytesReference;
|
|
|
-import org.elasticsearch.common.compress.CompressedXContent;
|
|
|
import org.elasticsearch.common.geo.GeoUtils;
|
|
|
import org.elasticsearch.common.geo.ShapeRelation;
|
|
|
import org.elasticsearch.common.geo.SpatialStrategy;
|
|
@@ -39,23 +36,20 @@ import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.xcontent.ToXContent;
|
|
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
-import org.elasticsearch.common.xcontent.XContentType;
|
|
|
import org.elasticsearch.geometry.Point;
|
|
|
import org.elasticsearch.index.query.QueryShardContext;
|
|
|
import org.elasticsearch.plugins.Plugin;
|
|
|
import org.elasticsearch.search.lookup.SourceLookup;
|
|
|
-import org.elasticsearch.test.InternalSettingsPlugin;
|
|
|
import org.elasticsearch.test.TestGeoShapeFieldMapperPlugin;
|
|
|
import org.junit.Before;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.Collection;
|
|
|
-import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
-import static org.elasticsearch.index.mapper.AbstractGeometryFieldMapper.Names.IGNORE_Z_VALUE;
|
|
|
+import static java.util.Collections.singletonMap;
|
|
|
import static org.hamcrest.Matchers.containsString;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.hasSize;
|
|
@@ -64,7 +58,7 @@ import static org.hamcrest.Matchers.not;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
-public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGeoShapeFieldMapper.Builder> {
|
|
|
+public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase2<LegacyGeoShapeFieldMapper.Builder> {
|
|
|
|
|
|
@Override
|
|
|
protected LegacyGeoShapeFieldMapper.Builder newBuilder() {
|
|
@@ -105,23 +99,26 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected Collection<Class<? extends Plugin>> getPlugins() {
|
|
|
- return pluginList(InternalSettingsPlugin.class, TestGeoShapeFieldMapperPlugin.class);
|
|
|
+ protected Collection<? extends Plugin> getPlugins() {
|
|
|
+ return List.of(new TestGeoShapeFieldMapperPlugin());
|
|
|
}
|
|
|
|
|
|
- public void testDefaultConfiguration() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("strategy", "recursive")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
+ @Override
|
|
|
+ protected void minimalMapping(XContentBuilder b) throws IOException {
|
|
|
+ b.field("type", "geo_shape").field("strategy", "recursive");
|
|
|
+ }
|
|
|
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ @Override
|
|
|
+ protected boolean supportsMeta() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testDefaultConfiguration() throws IOException {
|
|
|
+ XContentBuilder mapping = fieldMapping(this::minimalMapping);
|
|
|
+ DocumentMapper mapper = createDocumentMapper(mapping);
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
- assertEquals(mapping, defaultMapper.mappingSource().toString());
|
|
|
+ assertEquals(Strings.toString(mapping), mapper.mappingSource().toString());
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
|
assertThat(geoShapeFieldMapper.fieldType().tree(),
|
|
@@ -140,82 +137,50 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
* Test that orientation parameter correctly parses
|
|
|
*/
|
|
|
public void testOrientationParsing() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("orientation", "left")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("orientation", "left"))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
ShapeBuilder.Orientation orientation = ((LegacyGeoShapeFieldMapper)fieldMapper).fieldType().orientation();
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.CLOCKWISE));
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.LEFT));
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.CW));
|
|
|
|
|
|
// explicit right orientation test
|
|
|
- mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("orientation", "right")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- defaultMapper = createIndex("test2").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("orientation", "right"))
|
|
|
+ );
|
|
|
+ fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
orientation = ((LegacyGeoShapeFieldMapper)fieldMapper).fieldType().orientation();
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.COUNTER_CLOCKWISE));
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.RIGHT));
|
|
|
assertThat(orientation, equalTo(ShapeBuilder.Orientation.CCW));
|
|
|
- assertFieldWarnings("tree");
|
|
|
+ assertFieldWarnings("tree", "strategy");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Test that coerce parameter correctly parses
|
|
|
*/
|
|
|
public void testCoerceParsing() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("coerce", "true")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("coerce", true))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
boolean coerce = ((LegacyGeoShapeFieldMapper)fieldMapper).coerce().value();
|
|
|
assertThat(coerce, equalTo(true));
|
|
|
|
|
|
// explicit false coerce test
|
|
|
- mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("coerce", "false")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- defaultMapper = createIndex("test2").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("coerce", false))
|
|
|
+ );
|
|
|
+ fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
coerce = ((LegacyGeoShapeFieldMapper)fieldMapper).coerce().value();
|
|
|
assertThat(coerce, equalTo(false));
|
|
|
- assertFieldWarnings("tree");
|
|
|
+ assertFieldWarnings("tree", "strategy");
|
|
|
}
|
|
|
|
|
|
|
|
@@ -223,36 +188,20 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
* Test that accept_z_value parameter correctly parses
|
|
|
*/
|
|
|
public void testIgnoreZValue() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("strategy", "recursive")
|
|
|
- .field(IGNORE_Z_VALUE.getPreferredName(), "true")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("ignore_z_value", true))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
boolean ignoreZValue = ((LegacyGeoShapeFieldMapper)fieldMapper).ignoreZValue().value();
|
|
|
assertThat(ignoreZValue, equalTo(true));
|
|
|
|
|
|
// explicit false accept_z_value test
|
|
|
- mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field(IGNORE_Z_VALUE.getPreferredName(), "false")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- defaultMapper = createIndex("test2").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("ignore_z_value", false))
|
|
|
+ );
|
|
|
+ fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
ignoreZValue = ((LegacyGeoShapeFieldMapper)fieldMapper).ignoreZValue().value();
|
|
|
assertThat(ignoreZValue, equalTo(false));
|
|
|
assertFieldWarnings("strategy", "tree");
|
|
@@ -262,55 +211,33 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
* Test that ignore_malformed parameter correctly parses
|
|
|
*/
|
|
|
public void testIgnoreMalformedParsing() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("ignore_malformed", "true")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("ignore_malformed", true))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
Explicit<Boolean> ignoreMalformed = ((LegacyGeoShapeFieldMapper)fieldMapper).ignoreMalformed();
|
|
|
assertThat(ignoreMalformed.value(), equalTo(true));
|
|
|
|
|
|
// explicit false ignore_malformed test
|
|
|
- mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("ignore_malformed", "false")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- defaultMapper = createIndex("test2").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("ignore_malformed", false))
|
|
|
+ );
|
|
|
+ fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
-
|
|
|
ignoreMalformed = ((LegacyGeoShapeFieldMapper)fieldMapper).ignoreMalformed();
|
|
|
assertThat(ignoreMalformed.explicit(), equalTo(true));
|
|
|
assertThat(ignoreMalformed.value(), equalTo(false));
|
|
|
- assertFieldWarnings("tree");
|
|
|
+ assertFieldWarnings("tree", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testGeohashConfiguration() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "geohash")
|
|
|
- .field("tree_levels", "4")
|
|
|
- .field("distance_error_pct", "0.1")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape").field("tree", "geohash").field("tree_levels", "4").field("distance_error_pct", "0.1")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -319,23 +246,20 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
assertThat(strategy.getDistErrPct(), equalTo(0.1));
|
|
|
assertThat(strategy.getGrid(), instanceOf(GeohashPrefixTree.class));
|
|
|
assertThat(strategy.getGrid().getMaxLevels(), equalTo(4));
|
|
|
- assertFieldWarnings("tree", "tree_levels", "distance_error_pct");
|
|
|
+ assertFieldWarnings("tree", "tree_levels", "distance_error_pct", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testQuadtreeConfiguration() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
.field("tree", "quadtree")
|
|
|
.field("tree_levels", "6")
|
|
|
.field("distance_error_pct", "0.5")
|
|
|
.field("points_only", true)
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -345,7 +269,7 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
assertThat(strategy.getGrid(), instanceOf(QuadPrefixTree.class));
|
|
|
assertThat(strategy.getGrid().getMaxLevels(), equalTo(6));
|
|
|
assertThat(strategy.isPointsOnly(), equalTo(true));
|
|
|
- assertFieldWarnings("tree", "tree_levels", "distance_error_pct", "points_only");
|
|
|
+ assertFieldWarnings("tree", "tree_levels", "distance_error_pct", "points_only", "strategy");
|
|
|
}
|
|
|
|
|
|
private void assertFieldWarnings(String... fieldNames) {
|
|
@@ -358,22 +282,17 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
public void testLevelPrecisionConfiguration() throws IOException {
|
|
|
- DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
|
|
|
-
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
.field("tree", "quadtree")
|
|
|
.field("tree_levels", "6")
|
|
|
.field("precision", "70m")
|
|
|
.field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -386,18 +305,12 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("tree_levels", "26")
|
|
|
- .field("precision", "70m")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape").field("tree", "quadtree").field("tree_levels", "26").field("precision", "70m")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -412,18 +325,16 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
.field("tree", "geohash")
|
|
|
.field("tree_levels", "6")
|
|
|
.field("precision", "70m")
|
|
|
.field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -436,18 +347,16 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
.field("tree", "geohash")
|
|
|
- .field("tree_levels", GeoUtils.geoHashLevelsForPrecision(70d)+1)
|
|
|
+ .field("tree_levels", GeoUtils.geoHashLevelsForPrecision(70d) + 1)
|
|
|
.field("precision", "70m")
|
|
|
.field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -455,22 +364,20 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
|
|
|
assertThat(strategy.getDistErrPct(), equalTo(0.5));
|
|
|
assertThat(strategy.getGrid(), instanceOf(GeohashPrefixTree.class));
|
|
|
- assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoUtils.geoHashLevelsForPrecision(70d)+1));
|
|
|
+ assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoUtils.geoHashLevelsForPrecision(70d) + 1));
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
.field("tree", "quadtree")
|
|
|
- .field("tree_levels", GeoUtils.quadTreeLevelsForPrecision(70d)+1)
|
|
|
+ .field("tree_levels", GeoUtils.quadTreeLevelsForPrecision(70d) + 1)
|
|
|
.field("precision", "70m")
|
|
|
.field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -478,23 +385,16 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
|
|
|
assertThat(strategy.getDistErrPct(), equalTo(0.5));
|
|
|
assertThat(strategy.getGrid(), instanceOf(QuadPrefixTree.class));
|
|
|
- assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoUtils.quadTreeLevelsForPrecision(70d)+1));
|
|
|
+ assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoUtils.quadTreeLevelsForPrecision(70d) + 1));
|
|
|
}
|
|
|
- assertFieldWarnings("tree", "tree_levels", "precision", "distance_error_pct");
|
|
|
+ assertFieldWarnings("tree", "tree_levels", "precision", "distance_error_pct", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testPointsOnlyOption() throws IOException {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "geohash")
|
|
|
- .field("points_only", true)
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "geohash").field("points_only", true))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -502,23 +402,15 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
|
|
|
assertThat(strategy.getGrid(), instanceOf(GeohashPrefixTree.class));
|
|
|
assertThat(strategy.isPointsOnly(), equalTo(true));
|
|
|
- assertFieldWarnings("tree", "points_only");
|
|
|
+ assertFieldWarnings("tree", "points_only", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testLevelDefaults() throws IOException {
|
|
|
- DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("distance_error_pct", "0.5"))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -531,16 +423,10 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "geohash")
|
|
|
- .field("distance_error_pct", "0.5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "geohash").field("distance_error_pct", "0.5"))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -551,47 +437,41 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
/* 50m is default */
|
|
|
assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoUtils.geoHashLevelsForPrecision(50d)));
|
|
|
}
|
|
|
- assertFieldWarnings("tree", "distance_error_pct");
|
|
|
+ assertFieldWarnings("tree", "distance_error_pct", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testGeoShapeMapperMerge() throws Exception {
|
|
|
- String stage1Mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type").startObject("properties")
|
|
|
- .startObject("shape").field("type", "geo_shape").field("tree", "geohash")
|
|
|
- .field("strategy", "recursive")
|
|
|
- .field("precision", "1m").field("tree_levels", 8).field("distance_error_pct", 0.01)
|
|
|
- .field("orientation", "ccw")
|
|
|
- .endObject().endObject().endObject().endObject());
|
|
|
- MapperService mapperService = createIndex("test").mapperService();
|
|
|
- DocumentMapper docMapper = mapperService.merge("type", new CompressedXContent(stage1Mapping),
|
|
|
- MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
-
|
|
|
- Mapper fieldMapper = docMapper.mappers().getMapper("shape");
|
|
|
+ MapperService mapperService = createMapperService(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
+ .field("tree", "geohash")
|
|
|
+ .field("strategy", "recursive")
|
|
|
+ .field("precision", "1m")
|
|
|
+ .field("tree_levels", 8)
|
|
|
+ .field("distance_error_pct", 0.01)
|
|
|
+ .field("orientation", "ccw")
|
|
|
+ )
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapperService.documentMapper().mappers().getMapper("field");
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
|
assertThat(geoShapeFieldMapper.fieldType().orientation(), equalTo(ShapeBuilder.Orientation.CCW));
|
|
|
|
|
|
- String stage2Mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties").startObject("shape").field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("strategy", "term").field("precision", "1km")
|
|
|
- .field("tree_levels", 26).field("distance_error_pct", 26)
|
|
|
- .field("orientation", "cw").endObject().endObject().endObject().endObject());
|
|
|
- try {
|
|
|
- mapperService.merge("type", new CompressedXContent(stage2Mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
- fail();
|
|
|
- } catch (IllegalArgumentException e) {
|
|
|
- assertThat(e.getMessage(), containsString("mapper [shape] has different [strategy]"));
|
|
|
- assertThat(e.getMessage(), containsString("mapper [shape] has different [tree]"));
|
|
|
- assertThat(e.getMessage(), containsString("mapper [shape] has different [tree_levels]"));
|
|
|
- assertThat(e.getMessage(), containsString("mapper [shape] has different [precision]"));
|
|
|
- }
|
|
|
+ Exception e = expectThrows(IllegalArgumentException.class, () -> merge(mapperService, fieldMapping(b -> b.field("type", "geo_shape")
|
|
|
+ .field("tree", "quadtree")
|
|
|
+ .field("strategy", "term").field("precision", "1km")
|
|
|
+ .field("tree_levels", 26).field("distance_error_pct", 26)
|
|
|
+ .field("orientation", "cw"))));
|
|
|
+ assertThat(e.getMessage(), containsString("mapper [field] has different [strategy]"));
|
|
|
+ assertThat(e.getMessage(), containsString("mapper [field] has different [tree]"));
|
|
|
+ assertThat(e.getMessage(), containsString("mapper [field] has different [tree_levels]"));
|
|
|
+ assertThat(e.getMessage(), containsString("mapper [field] has different [precision]"));
|
|
|
|
|
|
// verify nothing changed
|
|
|
- fieldMapper = docMapper.mappers().getMapper("shape");
|
|
|
+ fieldMapper = mapperService.documentMapper().mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
|
PrefixTreeStrategy strategy = geoShapeFieldMapper.fieldType().defaultPrefixTreeStrategy();
|
|
|
-
|
|
|
assertThat(strategy, instanceOf(RecursivePrefixTreeStrategy.class));
|
|
|
assertThat(strategy.getGrid(), instanceOf(GeohashPrefixTree.class));
|
|
|
assertThat(strategy.getDistErrPct(), equalTo(0.01));
|
|
@@ -599,16 +479,13 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
assertThat(geoShapeFieldMapper.fieldType().orientation(), equalTo(ShapeBuilder.Orientation.CCW));
|
|
|
|
|
|
// correct mapping
|
|
|
- stage2Mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties").startObject("shape").field("type", "geo_shape")
|
|
|
- .field("tree", "geohash")
|
|
|
- .field("strategy", "recursive")
|
|
|
- .field("precision", "1m")
|
|
|
- .field("tree_levels", 8).field("distance_error_pct", 0.001)
|
|
|
- .field("orientation", "cw").endObject().endObject().endObject().endObject());
|
|
|
- docMapper = mapperService.merge("type", new CompressedXContent(stage2Mapping), MapperService.MergeReason.MAPPING_UPDATE);
|
|
|
-
|
|
|
- fieldMapper = docMapper.mappers().getMapper("shape");
|
|
|
+ merge(mapperService, fieldMapping(b -> b.field("type", "geo_shape")
|
|
|
+ .field("tree", "geohash")
|
|
|
+ .field("strategy", "recursive")
|
|
|
+ .field("precision", "1m")
|
|
|
+ .field("tree_levels", 8).field("distance_error_pct", 0.001)
|
|
|
+ .field("orientation", "cw")));
|
|
|
+ fieldMapper = mapperService.documentMapper().mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -623,90 +500,45 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
assertFieldWarnings("tree", "strategy", "precision", "tree_levels", "distance_error_pct");
|
|
|
}
|
|
|
|
|
|
- public void testEmptyName() throws Exception {
|
|
|
- // after 5.x
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
|
|
|
-
|
|
|
- IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
|
|
|
- () -> parser.parse("type1", new CompressedXContent(mapping))
|
|
|
- );
|
|
|
- assertThat(e.getMessage(), containsString("fieldName is required"));
|
|
|
- assertFieldWarnings("tree");
|
|
|
- }
|
|
|
-
|
|
|
public void testSerializeDefaults() throws Exception {
|
|
|
- DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
|
|
|
+ ToXContent.Params includeDefaults = new ToXContent.MapParams(singletonMap("include_defaults", "true"));
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- String serialized = toXContentString((LegacyGeoShapeFieldMapper) defaultMapper.mappers().getMapper("location"));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree")));
|
|
|
+ String serialized = Strings.toString(mapper.mappers().getMapper("field"), includeDefaults);
|
|
|
assertTrue(serialized, serialized.contains("\"precision\":\"50.0m\""));
|
|
|
assertTrue(serialized, serialized.contains("\"tree_levels\":21"));
|
|
|
}
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "geohash")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- String serialized = toXContentString((LegacyGeoShapeFieldMapper) defaultMapper.mappers().getMapper("location"));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "geo_shape").field("tree", "geohash")));
|
|
|
+ String serialized = Strings.toString(mapper.mappers().getMapper("field"), includeDefaults);
|
|
|
assertTrue(serialized, serialized.contains("\"precision\":\"50.0m\""));
|
|
|
assertTrue(serialized, serialized.contains("\"tree_levels\":9"));
|
|
|
}
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("tree_levels", "6")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- String serialized = toXContentString((LegacyGeoShapeFieldMapper) defaultMapper.mappers().getMapper("location"));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("tree_levels", "6"))
|
|
|
+ );
|
|
|
+ String serialized = Strings.toString(mapper.mappers().getMapper("field"), includeDefaults);
|
|
|
assertFalse(serialized, serialized.contains("\"precision\":"));
|
|
|
assertTrue(serialized, serialized.contains("\"tree_levels\":6"));
|
|
|
}
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("precision", "6")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- String serialized = toXContentString((LegacyGeoShapeFieldMapper) defaultMapper.mappers().getMapper("location"));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("precision", "6"))
|
|
|
+ );
|
|
|
+ String serialized = Strings.toString(mapper.mappers().getMapper("field"), includeDefaults);
|
|
|
assertTrue(serialized, serialized.contains("\"precision\":\"6.0m\""));
|
|
|
assertFalse(serialized, serialized.contains("\"tree_levels\":"));
|
|
|
}
|
|
|
{
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("precision", "6m")
|
|
|
- .field("tree_levels", "5")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
- DocumentMapper defaultMapper = parser.parse("type1", new CompressedXContent(mapping));
|
|
|
- String serialized = toXContentString((LegacyGeoShapeFieldMapper) defaultMapper.mappers().getMapper("location"));
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("precision", "6m").field("tree_levels", "5"))
|
|
|
+ );
|
|
|
+ String serialized = Strings.toString(mapper.mappers().getMapper("field"), includeDefaults);
|
|
|
assertTrue(serialized, serialized.contains("\"precision\":\"6.0m\""));
|
|
|
assertTrue(serialized, serialized.contains("\"tree_levels\":5"));
|
|
|
}
|
|
|
- assertFieldWarnings("tree", "tree_levels", "precision");
|
|
|
+ assertFieldWarnings("tree", "tree_levels", "precision", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testPointsOnlyDefaultsWithTermStrategy() throws IOException {
|
|
@@ -719,9 +551,10 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
.endObject().endObject()
|
|
|
.endObject().endObject());
|
|
|
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(
|
|
|
+ fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree").field("precision", "10m").field("strategy", "term"))
|
|
|
+ );
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
@@ -732,26 +565,23 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
assertThat(strategy.getGrid().getMaxLevels(), equalTo(23));
|
|
|
assertThat(strategy.isPointsOnly(), equalTo(true));
|
|
|
// term strategy changes the default for points_only, check that we handle it correctly
|
|
|
- assertThat(toXContentString(geoShapeFieldMapper, false), not(containsString("points_only")));
|
|
|
+ assertThat(Strings.toString(geoShapeFieldMapper), not(containsString("points_only")));
|
|
|
assertFieldWarnings("tree", "precision", "strategy");
|
|
|
}
|
|
|
|
|
|
|
|
|
public void testPointsOnlyFalseWithTermStrategy() throws Exception {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .field("precision", "10m")
|
|
|
- .field("strategy", "term")
|
|
|
- .field("points_only", false)
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapperParser parser = createIndex("test").mapperService().documentMapperParser();
|
|
|
-
|
|
|
- ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class,
|
|
|
- () -> parser.parse("type1", new CompressedXContent(mapping))
|
|
|
+ Exception e = expectThrows(
|
|
|
+ MapperParsingException.class,
|
|
|
+ () -> createMapperService(
|
|
|
+ fieldMapping(
|
|
|
+ b -> b.field("type", "geo_shape")
|
|
|
+ .field("tree", "quadtree")
|
|
|
+ .field("precision", "10m")
|
|
|
+ .field("strategy", "term")
|
|
|
+ .field("points_only", false)
|
|
|
+ )
|
|
|
+ )
|
|
|
);
|
|
|
assertThat(e.getMessage(), containsString("points_only cannot be set to false for term strategy"));
|
|
|
assertFieldWarnings("tree", "precision", "strategy", "points_only");
|
|
@@ -760,31 +590,26 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
public void testDisallowExpensiveQueries() throws IOException {
|
|
|
QueryShardContext queryShardContext = mock(QueryShardContext.class);
|
|
|
when(queryShardContext.allowExpensiveQueries()).thenReturn(false);
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type1")
|
|
|
- .startObject("properties").startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .endObject().endObject()
|
|
|
- .endObject().endObject());
|
|
|
-
|
|
|
- DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("type1", new CompressedXContent(mapping));
|
|
|
- Mapper fieldMapper = defaultMapper.mappers().getMapper("location");
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree")));
|
|
|
+ Mapper fieldMapper = mapper.mappers().getMapper("field");
|
|
|
assertThat(fieldMapper, instanceOf(LegacyGeoShapeFieldMapper.class));
|
|
|
LegacyGeoShapeFieldMapper geoShapeFieldMapper = (LegacyGeoShapeFieldMapper) fieldMapper;
|
|
|
|
|
|
-
|
|
|
ElasticsearchException e = expectThrows(ElasticsearchException.class,
|
|
|
() -> geoShapeFieldMapper.fieldType().geometryQueryBuilder().process(
|
|
|
new Point(-10, 10), "location", SpatialStrategy.TERM, ShapeRelation.INTERSECTS, queryShardContext));
|
|
|
assertEquals("[geo-shape] queries on [PrefixTree geo shapes] cannot be executed when " +
|
|
|
"'search.allow_expensive_queries' is set to false.", e.getMessage());
|
|
|
- assertFieldWarnings("tree");
|
|
|
+ assertFieldWarnings("tree", "strategy");
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void testSerialization() throws IOException {
|
|
|
- super.testSerialization();
|
|
|
+ protected void assertParseMinimalWarnings() {
|
|
|
+ assertWarnings("Field parameter [strategy] is deprecated and will be removed in a future version.");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void assertSerializationWarnings() {
|
|
|
assertWarnings("Field parameter [strategy] is deprecated and will be removed in a future version.",
|
|
|
"Field parameter [tree] is deprecated and will be removed in a future version.",
|
|
|
"Field parameter [tree_levels] is deprecated and will be removed in a future version.",
|
|
@@ -794,56 +619,19 @@ public class LegacyGeoShapeFieldMapperTests extends FieldMapperTestCase<LegacyGe
|
|
|
}
|
|
|
|
|
|
public void testGeoShapeArrayParsing() throws Exception {
|
|
|
- String mapping = Strings.toString(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startObject("properties")
|
|
|
- .startObject("location")
|
|
|
- .field("type", "geo_shape")
|
|
|
- .field("tree", "quadtree")
|
|
|
- .endObject()
|
|
|
- .endObject()
|
|
|
- .endObject());
|
|
|
-
|
|
|
- DocumentMapper mapper = createIndex("test").mapperService().documentMapperParser()
|
|
|
- .parse("_doc", new CompressedXContent(mapping));
|
|
|
-
|
|
|
- BytesReference arrayedDoc = BytesReference.bytes(XContentFactory.jsonBuilder()
|
|
|
- .startObject()
|
|
|
- .startArray("shape")
|
|
|
- .startObject()
|
|
|
- .field("type", "Point")
|
|
|
- .startArray("coordinates").value(176.0).value(15.0).endArray()
|
|
|
- .endObject()
|
|
|
- .startObject()
|
|
|
- .field("type", "Point")
|
|
|
- .startArray("coordinates").value(76.0).value(-15.0).endArray()
|
|
|
- .endObject()
|
|
|
- .endArray()
|
|
|
- .endObject()
|
|
|
- );
|
|
|
-
|
|
|
- SourceToParse sourceToParse = new SourceToParse("test", "1", arrayedDoc, XContentType.JSON);
|
|
|
- ParsedDocument document = mapper.parse(sourceToParse);
|
|
|
+ DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "geo_shape").field("tree", "quadtree")));
|
|
|
+ ParsedDocument document = mapper.parse(source(b -> {
|
|
|
+ b.startArray("field");
|
|
|
+ {
|
|
|
+ b.startObject().field("type", "Point").startArray("coordinates").value(176.0).value(15.0).endArray().endObject();
|
|
|
+ b.startObject().field("type", "Point").startArray("coordinates").value(76.0).value(-15.0).endArray().endObject();
|
|
|
+ }
|
|
|
+ b.endArray();
|
|
|
+ }));
|
|
|
assertThat(document.docs(), hasSize(1));
|
|
|
- IndexableField[] fields = document.docs().get(0).getFields("shape.type");
|
|
|
+ IndexableField[] fields = document.docs().get(0).getFields("field");
|
|
|
assertThat(fields.length, equalTo(2));
|
|
|
- assertFieldWarnings("tree");
|
|
|
- }
|
|
|
-
|
|
|
- public String toXContentString(LegacyGeoShapeFieldMapper mapper, boolean includeDefaults) throws IOException {
|
|
|
- XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
|
|
|
- ToXContent.Params params;
|
|
|
- if (includeDefaults) {
|
|
|
- params = new ToXContent.MapParams(Collections.singletonMap("include_defaults", "true"));
|
|
|
- } else {
|
|
|
- params = ToXContent.EMPTY_PARAMS;
|
|
|
- }
|
|
|
- mapper.doXContentBody(builder, includeDefaults, params);
|
|
|
- return Strings.toString(builder.endObject());
|
|
|
- }
|
|
|
-
|
|
|
- public String toXContentString(LegacyGeoShapeFieldMapper mapper) throws IOException {
|
|
|
- return toXContentString(mapper, true);
|
|
|
+ assertFieldWarnings("tree", "strategy");
|
|
|
}
|
|
|
|
|
|
public void testFetchSourceValue() {
|