diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java index 43b91fcfca2c1..26fd87ca96778 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java @@ -244,6 +244,11 @@ protected void parseCreateField(ParseContext context, List field throw new UnsupportedOperationException("Parsing is implemented in parse(), this method should NEVER be called"); } + @Override + public final boolean parsesArrayValue() { + return true; + } + @Override public void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { super.doXContentBody(builder, includeDefaults, params); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ArrayValueMapperParser.java b/server/src/main/java/org/elasticsearch/index/mapper/ArrayValueMapperParser.java deleted file mode 100644 index 44eeb917f31b5..0000000000000 --- a/server/src/main/java/org/elasticsearch/index/mapper/ArrayValueMapperParser.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.index.mapper; - -/** - * A marker interface indicating that this mapper can handle array value, and the array - * itself should be passed to it. - * - * - */ -public interface ArrayValueMapperParser { -} diff --git a/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java index a9a9e8fbeeb8f..32f1a4437ce93 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java @@ -85,7 +85,7 @@ * This field can also be extended to add search criteria to suggestions * for query-time filtering and boosting (see {@link ContextMappings} */ -public class CompletionFieldMapper extends FieldMapper implements ArrayValueMapperParser { +public class CompletionFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "completion"; /** @@ -441,6 +441,11 @@ public CompletionFieldType fieldType() { return (CompletionFieldType) super.fieldType(); } + @Override + public boolean parsesArrayValue() { + return true; + } + /** * Parses and indexes inputs * diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 3f86c064ccd34..5688f829dc637 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -541,7 +541,7 @@ private static void parseArray(ParseContext context, ObjectMapper parentMapper, // There is a concrete mapper for this field already. Need to check if the mapper // expects an array, if so we pass the context straight to the mapper and if not // we serialize the array components - if (mapper instanceof ArrayValueMapperParser) { + if (parsesArrayValue(mapper)) { parseObjectOrField(context, mapper); } else { parseNonDynamicArray(context, parentMapper, lastFieldName, arrayFieldName); @@ -562,7 +562,7 @@ private static void parseArray(ParseContext context, ObjectMapper parentMapper, Mapper.BuilderContext builderContext = new Mapper.BuilderContext(context.indexSettings().getSettings(), context.path()); mapper = builder.build(builderContext); assert mapper != null; - if (mapper instanceof ArrayValueMapperParser) { + if (parsesArrayValue(mapper)) { context.addDynamicMapper(mapper); context.path().add(arrayFieldName); parseObjectOrField(context, mapper); @@ -581,6 +581,10 @@ private static void parseArray(ParseContext context, ObjectMapper parentMapper, } } + private static boolean parsesArrayValue(Mapper mapper) { + return mapper instanceof FieldMapper && ((FieldMapper) mapper).parsesArrayValue(); + } + private static void parseNonDynamicArray(ParseContext context, ObjectMapper mapper, final String lastFieldName, String arrayFieldName) throws IOException { XContentParser parser = context.parser(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java index f619be24e4c42..d6b7c15757c4b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java @@ -275,6 +275,16 @@ public CopyTo copyTo() { return copyTo; } + /** + * Whether this mapper can handle an array value during document parsing. If true, + * when an array is encountered during parsing, the document parser will pass the + * whole array to the mapper. If false, the array is split into individual values + * and each value is passed to the mapper for parsing. + */ + public boolean parsesArrayValue() { + return false; + } + /** * Parse the field value using the provided {@link ParseContext}. */ diff --git a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java index 89ebd97151953..56d8f47df3f9b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java @@ -54,7 +54,7 @@ * * Uses lucene 6 LatLonPoint encoding */ -public class GeoPointFieldMapper extends AbstractGeometryFieldMapper implements ArrayValueMapperParser { +public class GeoPointFieldMapper extends AbstractGeometryFieldMapper { public static final String CONTENT_TYPE = "geo_point"; public static class Names extends AbstractGeometryFieldMapper.Names { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java index 9ea3c68f407bf..e4111b28c1953 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java @@ -18,7 +18,6 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.mapper.AbstractGeometryFieldMapper; -import org.elasticsearch.index.mapper.ArrayValueMapperParser; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -40,7 +39,7 @@ * * Uses lucene 8 XYPoint encoding */ -public class PointFieldMapper extends AbstractGeometryFieldMapper implements ArrayValueMapperParser { +public class PointFieldMapper extends AbstractGeometryFieldMapper { public static final String CONTENT_TYPE = "point"; public static class Names extends AbstractGeometryFieldMapper.Names { diff --git a/x-pack/plugin/vectors/src/main/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapper.java b/x-pack/plugin/vectors/src/main/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapper.java index a3e7b23b87199..ef42feefb7c18 100644 --- a/x-pack/plugin/vectors/src/main/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapper.java +++ b/x-pack/plugin/vectors/src/main/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapper.java @@ -19,7 +19,6 @@ import org.elasticsearch.common.xcontent.XContentParser.Token; import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.mapper.ArrayValueMapperParser; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; @@ -42,7 +41,7 @@ /** * A {@link FieldMapper} for indexing a dense vector of floats. */ -public class DenseVectorFieldMapper extends FieldMapper implements ArrayValueMapperParser { +public class DenseVectorFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "dense_vector"; public static short MAX_DIMS_COUNT = 2048; //maximum allowed number of dimensions @@ -180,6 +179,11 @@ public DenseVectorFieldType fieldType() { return (DenseVectorFieldType) super.fieldType(); } + @Override + public boolean parsesArrayValue() { + return true; + } + @Override public void parse(ParseContext context) throws IOException { if (context.externalValueSet()) {