Browse Source

Correct type parametrization in geo mappers. (#59583)

Previously the concrete type parameters for the MappedFieldType didn't always
match those for the FieldMapper. This PR updates the mappers so that the type
parameters always match, which makes the design easier to follow.
Julie Tibshirani 5 years ago
parent
commit
fd88ab1341

+ 6 - 5
server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java

@@ -266,8 +266,9 @@ public abstract class AbstractGeometryFieldMapper<Parsed, Processed> extends Fie
     }
 
     @Override
-    public AbstractGeometryFieldType fieldType() {
-        return (AbstractGeometryFieldType)mappedFieldType;
+    @SuppressWarnings("unchecked")
+    public AbstractGeometryFieldType<Parsed, Processed> fieldType() {
+        return (AbstractGeometryFieldType<Parsed, Processed>) mappedFieldType;
     }
 
     @Override
@@ -282,10 +283,10 @@ public abstract class AbstractGeometryFieldMapper<Parsed, Processed> extends Fie
     /** parsing logic for geometry indexing */
     @Override
     public void parse(ParseContext context) throws IOException {
-        AbstractGeometryFieldMapper.AbstractGeometryFieldType mappedFieldType = fieldType();
+        AbstractGeometryFieldType<Parsed, Processed> mappedFieldType = fieldType();
 
-        @SuppressWarnings("unchecked") Indexer<Parsed, Processed> geometryIndexer = mappedFieldType.geometryIndexer();
-        @SuppressWarnings("unchecked") Parser<Parsed> geometryParser = mappedFieldType.geometryParser();
+        Indexer<Parsed, Processed> geometryIndexer = mappedFieldType.geometryIndexer();
+        Parser<Parsed> geometryParser = mappedFieldType.geometryParser();
         try {
             Processed shape = context.parseExternalValue(geometryIndexer.processedClass());
             if (shape == null) {

+ 8 - 7
server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java

@@ -32,6 +32,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
 import org.elasticsearch.index.fielddata.IndexFieldData;
 import org.elasticsearch.index.fielddata.plain.AbstractLatLonPointIndexFieldData;
 import org.elasticsearch.index.query.VectorGeoPointShapeQueryProcessor;
+import org.elasticsearch.index.mapper.GeoPointFieldMapper.ParsedGeoPoint;
 import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
 
 import java.io.IOException;
@@ -45,7 +46,7 @@ import java.util.Map;
  *
  * Uses lucene 6 LatLonPoint encoding
  */
-public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<? extends GeoPoint>, List<? extends GeoPoint>> {
+public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<ParsedGeoPoint>, List<? extends GeoPoint>> {
     public static final String CONTENT_TYPE = "geo_point";
     public static final FieldType FIELD_TYPE = new FieldType();
     static {
@@ -163,7 +164,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<?
         return new ParsedGeoPoint();
     }
 
-    public static class GeoPointFieldType extends AbstractPointGeometryFieldType<List<ParsedGeoPoint>, List<ParsedGeoPoint>> {
+    public static class GeoPointFieldType extends AbstractPointGeometryFieldType<List<ParsedGeoPoint>, List<? extends GeoPoint>> {
         public GeoPointFieldType(String name, boolean indexed, boolean hasDocValues, Map<String, String> meta) {
             super(name, indexed, hasDocValues, meta);
         }
@@ -242,7 +243,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<?
         }
     }
 
-    protected static class GeoPointIndexer implements Indexer<List<ParsedGeoPoint>, List<ParsedGeoPoint>> {
+    protected static class GeoPointIndexer implements Indexer<List<ParsedGeoPoint>, List<? extends GeoPoint>> {
 
         protected final GeoPointFieldType fieldType;
 
@@ -251,7 +252,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<?
         }
 
         @Override
-        public List<ParsedGeoPoint> prepareForIndexing(List<ParsedGeoPoint> geoPoints) {
+        public List<? extends GeoPoint> prepareForIndexing(List<ParsedGeoPoint> geoPoints) {
             if (geoPoints == null || geoPoints.isEmpty()) {
                 return Collections.emptyList();
             }
@@ -259,12 +260,12 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<List<?
         }
 
         @Override
-        public Class<List<ParsedGeoPoint>> processedClass() {
-            return (Class<List<ParsedGeoPoint>>)(Object)List.class;
+        public Class<List<? extends GeoPoint>> processedClass() {
+            return (Class<List<? extends GeoPoint>>)(Object)List.class;
         }
 
         @Override
-        public List<IndexableField> indexShape(ParseContext context, List<ParsedGeoPoint> points) {
+        public List<IndexableField> indexShape(ParseContext context, List<? extends GeoPoint> points) {
             ArrayList<IndexableField> fields = new ArrayList<>(points.size());
             for (GeoPoint point : points) {
                 fields.add(new LatLonPoint(fieldType.name(), point.lat(), point.lon()));

+ 10 - 11
x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java

@@ -17,6 +17,7 @@ import org.elasticsearch.index.mapper.MappedFieldType;
 import org.elasticsearch.index.mapper.ParseContext;
 import org.elasticsearch.xpack.spatial.common.CartesianPoint;
 import org.elasticsearch.xpack.spatial.index.query.ShapeQueryPointProcessor;
+import org.elasticsearch.xpack.spatial.index.mapper.PointFieldMapper.ParsedCartesianPoint;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -29,7 +30,7 @@ import java.util.Map;
  *
  * Uses lucene 8 XYPoint encoding
  */
-public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? extends CartesianPoint>, List<? extends CartesianPoint>> {
+public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<ParsedCartesianPoint>, List<? extends CartesianPoint>> {
     public static final String CONTENT_TYPE = "point";
 
     public static class Builder extends AbstractPointGeometryFieldMapper.Builder<Builder, PointFieldType> {
@@ -95,7 +96,6 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     protected void addStoredFields(ParseContext context, List<? extends CartesianPoint> points) {
         for (CartesianPoint point : points) {
             context.doc().add(new StoredField(fieldType().name(), point.toString()));
@@ -103,7 +103,6 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     protected void addDocValuesFields(String name, List<? extends CartesianPoint> points, List<IndexableField> fields,
                                       ParseContext context) {
         for (CartesianPoint point : points) {
@@ -123,10 +122,10 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
 
     @Override
     public PointFieldType fieldType() {
-        return (PointFieldType)mappedFieldType;
+        return (PointFieldType) mappedFieldType;
     }
 
-    public static class PointFieldType extends AbstractPointGeometryFieldType<List<ParsedCartesianPoint>, List<ParsedCartesianPoint>> {
+    public static class PointFieldType extends AbstractPointGeometryFieldType<List<ParsedCartesianPoint>, List<? extends CartesianPoint>> {
         public PointFieldType(String name, boolean indexed, boolean hasDocValues, Map<String, String> meta) {
             super(name, indexed, hasDocValues, meta);
         }
@@ -190,7 +189,7 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
         }
     }
 
-    protected static class PointIndexer implements Indexer<List<ParsedCartesianPoint>, List<ParsedCartesianPoint>> {
+    protected static class PointIndexer implements Indexer<List<ParsedCartesianPoint>, List<? extends CartesianPoint>> {
         protected final PointFieldType fieldType;
 
         PointIndexer(PointFieldType fieldType) {
@@ -198,7 +197,7 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
         }
 
         @Override
-        public List<ParsedCartesianPoint> prepareForIndexing(List<ParsedCartesianPoint> points) {
+        public List<? extends CartesianPoint> prepareForIndexing(List<ParsedCartesianPoint> points) {
             if (points == null || points.isEmpty()) {
                 return Collections.emptyList();
             }
@@ -207,14 +206,14 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<List<? ex
 
         @Override
         @SuppressWarnings("unchecked")
-        public Class<List<ParsedCartesianPoint>> processedClass() {
-            return (Class<List<ParsedCartesianPoint>>)(Object)List.class;
+        public Class<List<? extends CartesianPoint>> processedClass() {
+            return (Class<List<? extends CartesianPoint>>)(Object)List.class;
         }
 
         @Override
-        public List<IndexableField> indexShape(ParseContext context, List<ParsedCartesianPoint> points) {
+        public List<IndexableField> indexShape(ParseContext context, List<? extends CartesianPoint> points) {
             ArrayList<IndexableField> fields = new ArrayList<>(1);
-            for (ParsedCartesianPoint point : points) {
+            for (CartesianPoint point : points) {
                 fields.add(new XYPointField(fieldType.name(), point.getX(), point.getY()));
             }
             return fields;

+ 1 - 2
x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java

@@ -75,8 +75,7 @@ public class ShapeFieldMapper extends AbstractShapeGeometryFieldMapper<Geometry,
         }
     }
 
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    public static final class ShapeFieldType extends AbstractShapeGeometryFieldType {
+    public static final class ShapeFieldType extends AbstractShapeGeometryFieldType<Geometry, Geometry> {
         public ShapeFieldType(String name, boolean indexed, boolean hasDocValues, Map<String, String> meta) {
             super(name, indexed, hasDocValues, meta);
         }