Skip to content

Commit eb0b2c8

Browse files
authored
Refactor Spatial Field Mappers (#55621)
This commit refactors all spatial Field Mappers to a common AbstractGeometryFieldMapper that implements shared parameter functionality (e.g., ignore_malformed, ignore_z_value) and provides a common framework for overriding type parsing, and building in xpack. Common shape functionality is implemented in a new AbstractShapeGeometryFieldMapper that is reused and overridden in GeoShapeFieldMapper, GeoShapeFieldMapperWithDocValues, LegacyGeoShapeFieldMapper, and ShapeFieldMapper. This abstraction provides a reusable foundation for adding new xpack features; such as coordinate reference system support.
1 parent 85a160f commit eb0b2c8

32 files changed

+546
-621
lines changed

server/src/main/java/org/elasticsearch/common/geo/parsers/GeoJsonParser.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.elasticsearch.common.unit.DistanceUnit;
3030
import org.elasticsearch.common.xcontent.XContentParser;
3131
import org.elasticsearch.common.xcontent.XContentSubParser;
32-
import org.elasticsearch.index.mapper.AbstractGeometryFieldMapper;
32+
import org.elasticsearch.index.mapper.AbstractShapeGeometryFieldMapper;
3333
import org.locationtech.jts.geom.Coordinate;
3434

3535
import java.io.IOException;
@@ -42,21 +42,21 @@
4242
* complies with geojson specification: https://tools.ietf.org/html/rfc7946
4343
*/
4444
abstract class GeoJsonParser {
45-
protected static ShapeBuilder parse(XContentParser parser, AbstractGeometryFieldMapper shapeMapper)
45+
protected static ShapeBuilder parse(XContentParser parser, AbstractShapeGeometryFieldMapper shapeMapper)
4646
throws IOException {
4747
GeoShapeType shapeType = null;
4848
DistanceUnit.Distance radius = null;
4949
CoordinateNode coordinateNode = null;
5050
GeometryCollectionBuilder geometryCollections = null;
5151

5252
Orientation orientation = (shapeMapper == null)
53-
? AbstractGeometryFieldMapper.Defaults.ORIENTATION.value()
53+
? AbstractShapeGeometryFieldMapper.Defaults.ORIENTATION.value()
5454
: shapeMapper.orientation();
5555
Explicit<Boolean> coerce = (shapeMapper == null)
56-
? AbstractGeometryFieldMapper.Defaults.COERCE
56+
? AbstractShapeGeometryFieldMapper.Defaults.COERCE
5757
: shapeMapper.coerce();
5858
Explicit<Boolean> ignoreZValue = (shapeMapper == null)
59-
? AbstractGeometryFieldMapper.Defaults.IGNORE_Z_VALUE
59+
? AbstractShapeGeometryFieldMapper.Defaults.IGNORE_Z_VALUE
6060
: shapeMapper.ignoreZValue();
6161

6262
String malformedException = null;
@@ -208,7 +208,7 @@ private static Coordinate parseCoordinate(XContentParser parser, boolean ignoreZ
208208
* @return Geometry[] geometries of the GeometryCollection
209209
* @throws IOException Thrown if an error occurs while reading from the XContentParser
210210
*/
211-
static GeometryCollectionBuilder parseGeometries(XContentParser parser, AbstractGeometryFieldMapper mapper) throws
211+
static GeometryCollectionBuilder parseGeometries(XContentParser parser, AbstractShapeGeometryFieldMapper mapper) throws
212212
IOException {
213213
if (parser.currentToken() != XContentParser.Token.START_ARRAY) {
214214
throw new ElasticsearchParseException("geometries must be an array of geojson objects");

server/src/main/java/org/elasticsearch/common/geo/parsers/GeoWKTParser.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import org.elasticsearch.common.geo.builders.ShapeBuilder;
3535
import org.elasticsearch.common.logging.Loggers;
3636
import org.elasticsearch.common.xcontent.XContentParser;
37-
import org.elasticsearch.index.mapper.AbstractGeometryFieldMapper;
37+
import org.elasticsearch.index.mapper.AbstractShapeGeometryFieldMapper;
3838
import org.locationtech.jts.geom.Coordinate;
3939

4040
import java.io.IOException;
@@ -63,7 +63,7 @@ public class GeoWKTParser {
6363
// no instance
6464
private GeoWKTParser() {}
6565

66-
public static ShapeBuilder parse(XContentParser parser, final AbstractGeometryFieldMapper shapeMapper)
66+
public static ShapeBuilder parse(XContentParser parser, final AbstractShapeGeometryFieldMapper shapeMapper)
6767
throws IOException, ElasticsearchParseException {
6868
return parseExpectedType(parser, null, shapeMapper);
6969
}
@@ -75,12 +75,12 @@ public static ShapeBuilder parseExpectedType(XContentParser parser, final GeoSha
7575

7676
/** throws an exception if the parsed geometry type does not match the expected shape type */
7777
public static ShapeBuilder parseExpectedType(XContentParser parser, final GeoShapeType shapeType,
78-
final AbstractGeometryFieldMapper shapeMapper)
78+
final AbstractShapeGeometryFieldMapper shapeMapper)
7979
throws IOException, ElasticsearchParseException {
8080
try (StringReader reader = new StringReader(parser.text())) {
81-
Explicit<Boolean> ignoreZValue = (shapeMapper == null) ? AbstractGeometryFieldMapper.Defaults.IGNORE_Z_VALUE :
81+
Explicit<Boolean> ignoreZValue = (shapeMapper == null) ? AbstractShapeGeometryFieldMapper.Defaults.IGNORE_Z_VALUE :
8282
shapeMapper.ignoreZValue();
83-
Explicit<Boolean> coerce = (shapeMapper == null) ? AbstractGeometryFieldMapper.Defaults.COERCE : shapeMapper.coerce();
83+
Explicit<Boolean> coerce = (shapeMapper == null) ? AbstractShapeGeometryFieldMapper.Defaults.COERCE : shapeMapper.coerce();
8484
// setup the tokenizer; configured to read words w/o numbers
8585
StreamTokenizer tokenizer = new StreamTokenizer(reader);
8686
tokenizer.resetSyntax();
@@ -258,7 +258,7 @@ private static PolygonBuilder parsePolygon(StreamTokenizer stream, final boolean
258258
return null;
259259
}
260260
PolygonBuilder builder = new PolygonBuilder(parseLinearRing(stream, ignoreZValue, coerce),
261-
AbstractGeometryFieldMapper.Defaults.ORIENTATION.value());
261+
AbstractShapeGeometryFieldMapper.Defaults.ORIENTATION.value());
262262
while (nextCloserOrComma(stream).equals(COMMA)) {
263263
builder.hole(parseLinearRing(stream, ignoreZValue, coerce));
264264
}

server/src/main/java/org/elasticsearch/common/geo/parsers/ShapeParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.elasticsearch.common.xcontent.XContent;
2727
import org.elasticsearch.common.xcontent.XContentParser;
2828
import org.elasticsearch.common.xcontent.support.MapXContentParser;
29-
import org.elasticsearch.index.mapper.AbstractGeometryFieldMapper;
29+
import org.elasticsearch.index.mapper.AbstractShapeGeometryFieldMapper;
3030

3131
import java.io.IOException;
3232
import java.util.Collections;
@@ -50,7 +50,7 @@ public interface ShapeParser {
5050
* if the parsers current token has been <code>null</code>
5151
* @throws IOException if the input could not be read
5252
*/
53-
static ShapeBuilder parse(XContentParser parser, AbstractGeometryFieldMapper shapeMapper) throws IOException {
53+
static ShapeBuilder parse(XContentParser parser, AbstractShapeGeometryFieldMapper shapeMapper) throws IOException {
5454
if (parser.currentToken() == XContentParser.Token.VALUE_NULL) {
5555
return null;
5656
} if (parser.currentToken() == XContentParser.Token.START_OBJECT) {

0 commit comments

Comments
 (0)