From 4aecd37e571e734f6cecc1e6effe99b2f28d273f Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 6 Jul 2015 23:13:17 -0700 Subject: [PATCH] Mappings: Remove AbstractFieldMapper AbstractFieldMapper is the only direct base class of FieldMapper. This change moves all AbstractFieldMapper functionality into FieldMapper, since there is no need for 2 levels of abstraction. --- .../index/mapper/FieldMapper.java | 712 ++++++++++++++++- .../elasticsearch/index/mapper/Mapper.java | 2 +- .../index/mapper/MetadataFieldMapper.java | 6 +- .../mapper/core/AbstractFieldMapper.java | 744 ------------------ .../index/mapper/core/BinaryFieldMapper.java | 9 +- .../index/mapper/core/BooleanFieldMapper.java | 11 +- .../index/mapper/core/ByteFieldMapper.java | 3 - .../mapper/core/CompletionFieldMapper.java | 8 +- .../index/mapper/core/DateFieldMapper.java | 3 +- .../index/mapper/core/DoubleFieldMapper.java | 4 - .../index/mapper/core/FloatFieldMapper.java | 4 - .../index/mapper/core/IntegerFieldMapper.java | 4 - .../index/mapper/core/LongFieldMapper.java | 4 - .../index/mapper/core/Murmur3FieldMapper.java | 3 - .../index/mapper/core/NumberFieldMapper.java | 8 +- .../index/mapper/core/ShortFieldMapper.java | 4 - .../index/mapper/core/StringFieldMapper.java | 26 +- .../index/mapper/core/TypeParsers.java | 29 +- .../index/mapper/geo/GeoPointFieldMapper.java | 11 +- .../index/mapper/geo/GeoShapeFieldMapper.java | 7 +- .../index/mapper/internal/AllFieldMapper.java | 6 +- .../internal/FieldNamesFieldMapper.java | 6 +- .../index/mapper/internal/IdFieldMapper.java | 5 +- .../mapper/internal/IndexFieldMapper.java | 4 +- .../mapper/internal/ParentFieldMapper.java | 5 +- .../mapper/internal/RoutingFieldMapper.java | 5 +- .../mapper/internal/SizeFieldMapper.java | 6 +- .../mapper/internal/SourceFieldMapper.java | 4 +- .../index/mapper/internal/TTLFieldMapper.java | 7 +- .../mapper/internal/TimestampFieldMapper.java | 5 +- .../mapper/internal/TypeFieldMapper.java | 5 +- .../index/mapper/internal/UidFieldMapper.java | 6 +- .../mapper/internal/VersionFieldMapper.java | 1 - .../index/mapper/ip/IpFieldMapper.java | 3 - .../termvectors/GetTermVectorsTests.java | 4 +- .../termvectors/TermVectorsUnitTests.java | 6 +- .../index/mapper/FieldTypeLookupTests.java | 4 +- .../mapper/externalvalues/ExternalMapper.java | 6 +- .../CompletionPostingsFormatTest.java | 8 +- 39 files changed, 781 insertions(+), 917 deletions(-) delete mode 100644 core/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java diff --git a/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java index 0a95e01bee2..78302804b1d 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java @@ -19,45 +19,725 @@ package org.elasticsearch.index.mapper; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import com.carrotsearch.hppc.cursors.ObjectCursor; +import com.carrotsearch.hppc.cursors.ObjectObjectCursor; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterators; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.index.IndexOptions; +import org.elasticsearch.Version; +import org.elasticsearch.common.Nullable; +import org.elasticsearch.common.collect.ImmutableOpenMap; +import org.elasticsearch.common.lucene.Lucene; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.index.analysis.NamedAnalyzer; +import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.core.TypeParsers; +import org.elasticsearch.index.mapper.internal.AllFieldMapper; +import org.elasticsearch.index.similarity.SimilarityLookupService; +import org.elasticsearch.index.similarity.SimilarityProvider; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; public abstract class FieldMapper extends Mapper { - public FieldMapper(String simpleName) { - super(simpleName); + public abstract static class Builder extends Mapper.Builder { + + protected final MappedFieldType fieldType; + protected final MappedFieldType defaultFieldType; + private final IndexOptions defaultOptions; + protected boolean omitNormsSet = false; + protected String indexName; + protected Boolean includeInAll; + protected boolean indexOptionsSet = false; + protected boolean docValuesSet = false; + @Nullable + protected Settings fieldDataSettings; + protected final MultiFields.Builder multiFieldsBuilder; + protected CopyTo copyTo; + + protected Builder(String name, MappedFieldType fieldType) { + super(name); + this.fieldType = fieldType.clone(); + this.defaultFieldType = fieldType.clone(); + this.defaultOptions = fieldType.indexOptions(); // we have to store it the fieldType is mutable + multiFieldsBuilder = new MultiFields.Builder(); + } + + public MappedFieldType fieldType() { + return fieldType; + } + + public T index(boolean index) { + if (index) { + if (fieldType.indexOptions() == IndexOptions.NONE) { + /* + * the logic here is to reset to the default options only if we are not indexed ie. options are null + * if the fieldType has a non-null option we are all good it might have been set through a different + * call. + */ + final IndexOptions options = getDefaultIndexOption(); + assert options != IndexOptions.NONE : "default IndexOptions is NONE can't enable indexing"; + fieldType.setIndexOptions(options); + } + } else { + fieldType.setIndexOptions(IndexOptions.NONE); + } + return builder; + } + + protected IndexOptions getDefaultIndexOption() { + return defaultOptions; + } + + public T store(boolean store) { + this.fieldType.setStored(store); + return builder; + } + + public T docValues(boolean docValues) { + this.fieldType.setHasDocValues(docValues); + this.docValuesSet = true; + return builder; + } + + public T storeTermVectors(boolean termVectors) { + if (termVectors != this.fieldType.storeTermVectors()) { + this.fieldType.setStoreTermVectors(termVectors); + } // don't set it to false, it is default and might be flipped by a more specific option + return builder; + } + + public T storeTermVectorOffsets(boolean termVectorOffsets) { + if (termVectorOffsets) { + this.fieldType.setStoreTermVectors(termVectorOffsets); + } + this.fieldType.setStoreTermVectorOffsets(termVectorOffsets); + return builder; + } + + public T storeTermVectorPositions(boolean termVectorPositions) { + if (termVectorPositions) { + this.fieldType.setStoreTermVectors(termVectorPositions); + } + this.fieldType.setStoreTermVectorPositions(termVectorPositions); + return builder; + } + + public T storeTermVectorPayloads(boolean termVectorPayloads) { + if (termVectorPayloads) { + this.fieldType.setStoreTermVectors(termVectorPayloads); + } + this.fieldType.setStoreTermVectorPayloads(termVectorPayloads); + return builder; + } + + public T tokenized(boolean tokenized) { + this.fieldType.setTokenized(tokenized); + return builder; + } + + public T boost(float boost) { + this.fieldType.setBoost(boost); + return builder; + } + + public T omitNorms(boolean omitNorms) { + this.fieldType.setOmitNorms(omitNorms); + this.omitNormsSet = true; + return builder; + } + + public T indexOptions(IndexOptions indexOptions) { + this.fieldType.setIndexOptions(indexOptions); + this.indexOptionsSet = true; + return builder; + } + + public T indexName(String indexName) { + this.indexName = indexName; + return builder; + } + + public T indexAnalyzer(NamedAnalyzer indexAnalyzer) { + this.fieldType.setIndexAnalyzer(indexAnalyzer); + return builder; + } + + public T searchAnalyzer(NamedAnalyzer searchAnalyzer) { + this.fieldType.setSearchAnalyzer(searchAnalyzer); + return builder; + } + + public T includeInAll(Boolean includeInAll) { + this.includeInAll = includeInAll; + return builder; + } + + public T similarity(SimilarityProvider similarity) { + this.fieldType.setSimilarity(similarity); + return builder; + } + + public T normsLoading(MappedFieldType.Loading normsLoading) { + this.fieldType.setNormsLoading(normsLoading); + return builder; + } + + public T fieldDataSettings(Settings settings) { + this.fieldDataSettings = settings; + return builder; + } + + public Builder nullValue(Object nullValue) { + this.fieldType.setNullValue(nullValue); + return this; + } + + public T multiFieldPathType(ContentPath.Type pathType) { + multiFieldsBuilder.pathType(pathType); + return builder; + } + + public T addMultiField(Mapper.Builder mapperBuilder) { + multiFieldsBuilder.add(mapperBuilder); + return builder; + } + + public T copyTo(CopyTo copyTo) { + this.copyTo = copyTo; + return builder; + } + + protected MappedFieldType.Names buildNames(BuilderContext context) { + return new MappedFieldType.Names(buildIndexName(context), buildIndexNameClean(context), buildFullName(context)); + } + + protected String buildIndexName(BuilderContext context) { + if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { + return buildFullName(context); + } + String actualIndexName = indexName == null ? name : indexName; + return context.path().pathAsText(actualIndexName); + } + + protected String buildIndexNameClean(BuilderContext context) { + if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { + return buildFullName(context); + } + return indexName == null ? name : indexName; + } + + protected String buildFullName(BuilderContext context) { + return context.path().fullPathAsText(name); + } + + protected void setupFieldType(BuilderContext context) { + fieldType.setNames(buildNames(context)); + if (fieldType.indexAnalyzer() == null && fieldType.tokenized() == false && fieldType.indexOptions() != IndexOptions.NONE) { + fieldType.setIndexAnalyzer(Lucene.KEYWORD_ANALYZER); + fieldType.setSearchAnalyzer(Lucene.KEYWORD_ANALYZER); + } + if (fieldDataSettings != null) { + Settings settings = Settings.builder().put(fieldType.fieldDataType().getSettings()).put(fieldDataSettings).build(); + fieldType.setFieldDataType(new FieldDataType(fieldType.fieldDataType().getType(), settings)); + } + boolean defaultDocValues = false; // pre 2.0 + if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { + defaultDocValues = fieldType.tokenized() == false && fieldType.indexOptions() != IndexOptions.NONE; + } + // backcompat for "fielddata: format: docvalues" for now... + boolean fieldDataDocValues = fieldType.fieldDataType() != null + && FieldDataType.DOC_VALUES_FORMAT_VALUE.equals(fieldType.fieldDataType().getFormat(context.indexSettings())); + if (fieldDataDocValues && docValuesSet && fieldType.hasDocValues() == false) { + // this forces the doc_values setting to be written, so fielddata does not mask the original setting + defaultDocValues = true; + } + defaultFieldType.setHasDocValues(defaultDocValues); + if (docValuesSet == false) { + fieldType.setHasDocValues(defaultDocValues || fieldDataDocValues); + } + } } - public abstract MappedFieldType fieldType(); + protected MappedFieldTypeReference fieldTypeRef; + protected final MappedFieldType defaultFieldType; + protected final MultiFields multiFields; + protected CopyTo copyTo; + protected final boolean indexCreatedBefore2x; + + protected FieldMapper(String simpleName, MappedFieldType fieldType, MappedFieldType defaultFieldType, Settings indexSettings, MultiFields multiFields, CopyTo copyTo) { + super(simpleName); + assert indexSettings != null; + this.indexCreatedBefore2x = Version.indexCreated(indexSettings).before(Version.V_2_0_0); + this.fieldTypeRef = new MappedFieldTypeReference(fieldType); // the reference ctor freezes the field type + defaultFieldType.freeze(); + this.defaultFieldType = defaultFieldType; + this.multiFields = multiFields; + this.copyTo = copyTo; + } + + @Override + public String name() { + return fieldType().names().fullName(); + } + + public MappedFieldType fieldType() { + return fieldTypeRef.get(); + } /** Returns a reference to the MappedFieldType for this mapper. */ - public abstract MappedFieldTypeReference fieldTypeReference(); + public MappedFieldTypeReference fieldTypeReference() { + return fieldTypeRef; + } /** * Updates the reference to this field's MappedFieldType. * Implementations should assert equality of the underlying field type */ - public abstract void setFieldTypeReference(MappedFieldTypeReference ref); + public void setFieldTypeReference(MappedFieldTypeReference ref) { + if (ref.get().equals(fieldType()) == false) { + throw new IllegalStateException("Cannot overwrite field type reference to unequal reference"); + } + ref.incrementAssociatedMappers(); + this.fieldTypeRef = ref; + } /** * List of fields where this field should be copied to */ - public abstract AbstractFieldMapper.CopyTo copyTo(); - - /** - * Fields might not be available before indexing, for example _all, token_count,... - * When get is called and these fields are requested, this case needs special treatment. - * - * @return If the field is available before indexing or not. - * */ - public abstract boolean isGenerated(); + public CopyTo copyTo() { + return copyTo; + } /** * Parse using the provided {@link ParseContext} and return a mapping * update if dynamic mappings modified the mappings, or {@code null} if * mappings were not modified. */ - public abstract Mapper parse(ParseContext context) throws IOException; + public Mapper parse(ParseContext context) throws IOException { + final List fields = new ArrayList<>(2); + try { + parseCreateField(context, fields); + for (Field field : fields) { + if (!customBoost()) { + field.setBoost(fieldType().boost()); + } + context.doc().add(field); + } + } catch (Exception e) { + throw new MapperParsingException("failed to parse [" + fieldType().names().fullName() + "]", e); + } + multiFields.parse(this, context); + return null; + } + + /** + * Parse the field value and populate fields. + */ + protected abstract void parseCreateField(ParseContext context, List fields) throws IOException; + + /** + * Derived classes can override it to specify that boost value is set by derived classes. + */ + protected boolean customBoost() { + return false; + } + + public Iterator iterator() { + if (multiFields == null) { + return Collections.emptyIterator(); + } + return multiFields.iterator(); + } + + @Override + public void merge(Mapper mergeWith, MergeResult mergeResult) throws MergeMappingException { + if (!this.getClass().equals(mergeWith.getClass())) { + String mergedType = mergeWith.getClass().getSimpleName(); + if (mergeWith instanceof FieldMapper) { + mergedType = ((FieldMapper) mergeWith).contentType(); + } + mergeResult.addConflict("mapper [" + fieldType().names().fullName() + "] of different type, current_type [" + contentType() + "], merged_type [" + mergedType + "]"); + // different types, return + return; + } + FieldMapper fieldMergeWith = (FieldMapper) mergeWith; + List subConflicts = new ArrayList<>(); // TODO: just expose list from MergeResult? + fieldType().checkTypeName(fieldMergeWith.fieldType(), subConflicts); + if (subConflicts.isEmpty() == false) { + // return early if field types don't match + assert subConflicts.size() == 1; + mergeResult.addConflict(subConflicts.get(0)); + return; + } + + boolean strict = this.fieldTypeRef.getNumAssociatedMappers() > 1 && mergeResult.updateAllTypes() == false; + fieldType().checkCompatibility(fieldMergeWith.fieldType(), subConflicts, strict); + for (String conflict : subConflicts) { + mergeResult.addConflict(conflict); + } + multiFields.merge(mergeWith, mergeResult); + + if (mergeResult.simulate() == false && mergeResult.hasConflicts() == false) { + // apply changeable values + MappedFieldType fieldType = fieldMergeWith.fieldType().clone(); + fieldType.freeze(); + fieldTypeRef.set(fieldType); + this.copyTo = fieldMergeWith.copyTo; + } + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(simpleName()); + boolean includeDefaults = params.paramAsBoolean("include_defaults", false); + doXContentBody(builder, includeDefaults, params); + return builder.endObject(); + } + + protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { + + builder.field("type", contentType()); + if (indexCreatedBefore2x && (includeDefaults || !simpleName().equals(fieldType().names().originalIndexName()))) { + builder.field("index_name", fieldType().names().originalIndexName()); + } + + if (includeDefaults || fieldType().boost() != 1.0f) { + builder.field("boost", fieldType().boost()); + } + + boolean indexed = fieldType().indexOptions() != IndexOptions.NONE; + boolean defaultIndexed = defaultFieldType.indexOptions() != IndexOptions.NONE; + if (includeDefaults || indexed != defaultIndexed || + fieldType().tokenized() != defaultFieldType.tokenized()) { + builder.field("index", indexTokenizeOptionToString(indexed, fieldType().tokenized())); + } + if (includeDefaults || fieldType().stored() != defaultFieldType.stored()) { + builder.field("store", fieldType().stored()); + } + doXContentDocValues(builder, includeDefaults); + if (includeDefaults || fieldType().storeTermVectors() != defaultFieldType.storeTermVectors()) { + builder.field("term_vector", termVectorOptionsToString(fieldType())); + } + if (includeDefaults || fieldType().omitNorms() != defaultFieldType.omitNorms() || fieldType().normsLoading() != null) { + builder.startObject("norms"); + if (includeDefaults || fieldType().omitNorms() != defaultFieldType.omitNorms()) { + builder.field("enabled", !fieldType().omitNorms()); + } + if (fieldType().normsLoading() != null) { + builder.field(MappedFieldType.Loading.KEY, fieldType().normsLoading()); + } + builder.endObject(); + } + if (indexed && (includeDefaults || fieldType().indexOptions() != defaultFieldType.indexOptions())) { + builder.field("index_options", indexOptionToString(fieldType().indexOptions())); + } + + doXContentAnalyzers(builder, includeDefaults); + + if (fieldType().similarity() != null) { + builder.field("similarity", fieldType().similarity().name()); + } else if (includeDefaults) { + builder.field("similarity", SimilarityLookupService.DEFAULT_SIMILARITY); + } + + if (includeDefaults || hasCustomFieldDataSettings()) { + builder.field("fielddata", fieldType().fieldDataType().getSettings().getAsMap()); + } + multiFields.toXContent(builder, params); + + if (copyTo != null) { + copyTo.toXContent(builder, params); + } + } + + protected void doXContentAnalyzers(XContentBuilder builder, boolean includeDefaults) throws IOException { + if (fieldType().indexAnalyzer() == null) { + if (includeDefaults) { + builder.field("analyzer", "default"); + } + } else if (includeDefaults || fieldType().indexAnalyzer().name().startsWith("_") == false && fieldType().indexAnalyzer().name().equals("default") == false) { + builder.field("analyzer", fieldType().indexAnalyzer().name()); + if (fieldType().searchAnalyzer().name().equals(fieldType().indexAnalyzer().name()) == false) { + builder.field("search_analyzer", fieldType().searchAnalyzer().name()); + } + } + } + + protected void doXContentDocValues(XContentBuilder builder, boolean includeDefaults) throws IOException { + if (includeDefaults || defaultFieldType.hasDocValues() != fieldType().hasDocValues()) { + builder.field("doc_values", fieldType().hasDocValues()); + } + } + + protected static String indexOptionToString(IndexOptions indexOption) { + switch (indexOption) { + case DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS: + return TypeParsers.INDEX_OPTIONS_OFFSETS; + case DOCS_AND_FREQS: + return TypeParsers.INDEX_OPTIONS_FREQS; + case DOCS_AND_FREQS_AND_POSITIONS: + return TypeParsers.INDEX_OPTIONS_POSITIONS; + case DOCS: + return TypeParsers.INDEX_OPTIONS_DOCS; + default: + throw new IllegalArgumentException("Unknown IndexOptions [" + indexOption + "]"); + } + } + + public static String termVectorOptionsToString(FieldType fieldType) { + if (!fieldType.storeTermVectors()) { + return "no"; + } else if (!fieldType.storeTermVectorOffsets() && !fieldType.storeTermVectorPositions()) { + return "yes"; + } else if (fieldType.storeTermVectorOffsets() && !fieldType.storeTermVectorPositions()) { + return "with_offsets"; + } else { + StringBuilder builder = new StringBuilder("with"); + if (fieldType.storeTermVectorPositions()) { + builder.append("_positions"); + } + if (fieldType.storeTermVectorOffsets()) { + builder.append("_offsets"); + } + if (fieldType.storeTermVectorPayloads()) { + builder.append("_payloads"); + } + return builder.toString(); + } + } + + protected static String indexTokenizeOptionToString(boolean indexed, boolean tokenized) { + if (!indexed) { + return "no"; + } else if (tokenized) { + return "analyzed"; + } else { + return "not_analyzed"; + } + } + + protected boolean hasCustomFieldDataSettings() { + return fieldType().fieldDataType() != null && fieldType().fieldDataType().equals(defaultFieldType.fieldDataType()) == false; + } + + protected abstract String contentType(); + + public static class MultiFields { + + public static MultiFields empty() { + return new MultiFields(ContentPath.Type.FULL, ImmutableOpenMap.of()); + } + + public static class Builder { + + private final ImmutableOpenMap.Builder mapperBuilders = ImmutableOpenMap.builder(); + private ContentPath.Type pathType = ContentPath.Type.FULL; + + public Builder pathType(ContentPath.Type pathType) { + this.pathType = pathType; + return this; + } + + public Builder add(Mapper.Builder builder) { + mapperBuilders.put(builder.name(), builder); + return this; + } + + @SuppressWarnings("unchecked") + public MultiFields build(FieldMapper.Builder mainFieldBuilder, BuilderContext context) { + if (pathType == ContentPath.Type.FULL && mapperBuilders.isEmpty()) { + return empty(); + } else if (mapperBuilders.isEmpty()) { + return new MultiFields(pathType, ImmutableOpenMap.of()); + } else { + ContentPath.Type origPathType = context.path().pathType(); + context.path().pathType(pathType); + context.path().add(mainFieldBuilder.name()); + ImmutableOpenMap.Builder mapperBuilders = this.mapperBuilders; + for (ObjectObjectCursor cursor : this.mapperBuilders) { + String key = cursor.key; + Mapper.Builder value = cursor.value; + Mapper mapper = value.build(context); + assert mapper instanceof FieldMapper; + mapperBuilders.put(key, mapper); + } + context.path().remove(); + context.path().pathType(origPathType); + ImmutableOpenMap.Builder mappers = mapperBuilders.cast(); + return new MultiFields(pathType, mappers.build()); + } + } + } + + private final ContentPath.Type pathType; + private volatile ImmutableOpenMap mappers; + + public MultiFields(ContentPath.Type pathType, ImmutableOpenMap mappers) { + this.pathType = pathType; + this.mappers = mappers; + // we disable the all in multi-field mappers + for (ObjectCursor cursor : mappers.values()) { + FieldMapper mapper = cursor.value; + if (mapper instanceof AllFieldMapper.IncludeInAll) { + ((AllFieldMapper.IncludeInAll) mapper).unsetIncludeInAll(); + } + } + } + + public void parse(FieldMapper mainField, ParseContext context) throws IOException { + // TODO: multi fields are really just copy fields, we just need to expose "sub fields" or something that can be part of the mappings + if (mappers.isEmpty()) { + return; + } + + context = context.createMultiFieldContext(); + + ContentPath.Type origPathType = context.path().pathType(); + context.path().pathType(pathType); + + context.path().add(mainField.simpleName()); + for (ObjectCursor cursor : mappers.values()) { + cursor.value.parse(context); + } + context.path().remove(); + context.path().pathType(origPathType); + } + + // No need for locking, because locking is taken care of in ObjectMapper#merge and DocumentMapper#merge + public void merge(Mapper mergeWith, MergeResult mergeResult) throws MergeMappingException { + FieldMapper mergeWithMultiField = (FieldMapper) mergeWith; + + List newFieldMappers = null; + ImmutableOpenMap.Builder newMappersBuilder = null; + + for (ObjectCursor cursor : mergeWithMultiField.multiFields.mappers.values()) { + FieldMapper mergeWithMapper = cursor.value; + Mapper mergeIntoMapper = mappers.get(mergeWithMapper.simpleName()); + if (mergeIntoMapper == null) { + // no mapping, simply add it if not simulating + if (!mergeResult.simulate()) { + // we disable the all in multi-field mappers + if (mergeWithMapper instanceof AllFieldMapper.IncludeInAll) { + ((AllFieldMapper.IncludeInAll) mergeWithMapper).unsetIncludeInAll(); + } + if (newMappersBuilder == null) { + newMappersBuilder = ImmutableOpenMap.builder(mappers); + } + newMappersBuilder.put(mergeWithMapper.simpleName(), mergeWithMapper); + if (mergeWithMapper instanceof FieldMapper) { + if (newFieldMappers == null) { + newFieldMappers = new ArrayList<>(2); + } + newFieldMappers.add(mergeWithMapper); + } + } + } else { + mergeIntoMapper.merge(mergeWithMapper, mergeResult); + } + } + + // first add all field mappers + if (newFieldMappers != null) { + mergeResult.addFieldMappers(newFieldMappers); + } + // now publish mappers + if (newMappersBuilder != null) { + mappers = newMappersBuilder.build(); + } + } + + public Iterator iterator() { + return Iterators.transform(mappers.values().iterator(), new Function, Mapper>() { + @Override + public Mapper apply(@Nullable ObjectCursor cursor) { + return cursor.value; + } + }); + } + + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + if (pathType != ContentPath.Type.FULL) { + builder.field("path", pathType.name().toLowerCase(Locale.ROOT)); + } + if (!mappers.isEmpty()) { + // sort the mappers so we get consistent serialization format + Mapper[] sortedMappers = mappers.values().toArray(Mapper.class); + Arrays.sort(sortedMappers, new Comparator() { + @Override + public int compare(Mapper o1, Mapper o2) { + return o1.name().compareTo(o2.name()); + } + }); + builder.startObject("fields"); + for (Mapper mapper : sortedMappers) { + mapper.toXContent(builder, params); + } + builder.endObject(); + } + return builder; + } + } + + /** + * Represents a list of fields with optional boost factor where the current field should be copied to + */ + public static class CopyTo { + + private final ImmutableList copyToFields; + + private CopyTo(ImmutableList copyToFields) { + this.copyToFields = copyToFields; + } + + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + if (!copyToFields.isEmpty()) { + builder.startArray("copy_to"); + for (String field : copyToFields) { + builder.value(field); + } + builder.endArray(); + } + return builder; + } + + public static class Builder { + private final ImmutableList.Builder copyToBuilders = ImmutableList.builder(); + + public Builder add(String field) { + copyToBuilders.add(field); + return this; + } + + public CopyTo build() { + return new CopyTo(copyToBuilders.build()); + } + } + + public List copyToFields() { + return copyToFields; + } + } + + /** + * Fields might not be available before indexing, for example _all, token_count,... + * When get is called and these fields are requested, this case needs special treatment. + * + * @return If the field is available before indexing or not. + */ + public boolean isGenerated() { + return false; + } } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java b/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java index a183f8a67db..eaeea7ae396 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java @@ -139,7 +139,7 @@ public abstract class Mapper implements ToXContent, Iterable { } /** Returns the simple name, which identifies this mapper against other mappers at the same level in the mappers hierarchy - * TODO: make this protected once Mapper, FieldMapper and AbstractFieldMapper are merged together */ + * TODO: make this protected once Mapper and FieldMapper are merged together */ public final String simpleName() { return simpleName; } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MetadataFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/MetadataFieldMapper.java index d376cef074b..34e35131ba3 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/MetadataFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/MetadataFieldMapper.java @@ -19,9 +19,7 @@ package org.elasticsearch.index.mapper; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.object.RootObjectMapper; import java.io.IOException; @@ -30,9 +28,9 @@ import java.io.IOException; /** * A mapper for a builtin field containing metadata about a document. */ -public abstract class MetadataFieldMapper extends AbstractFieldMapper { +public abstract class MetadataFieldMapper extends FieldMapper { - public abstract static class Builder extends AbstractFieldMapper.Builder { + public abstract static class Builder extends FieldMapper.Builder { public Builder(String name, MappedFieldType fieldType) { super(name, fieldType); } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java deleted file mode 100644 index 8aac83388e3..00000000000 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java +++ /dev/null @@ -1,744 +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.core; - -import com.carrotsearch.hppc.cursors.ObjectCursor; -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterators; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType; -import org.apache.lucene.index.IndexOptions; -import org.elasticsearch.Version; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.collect.ImmutableOpenMap; -import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.analysis.NamedAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; -import org.elasticsearch.index.mapper.ContentPath; -import org.elasticsearch.index.mapper.FieldMapper; -import org.elasticsearch.index.mapper.MappedFieldType; -import org.elasticsearch.index.mapper.MappedFieldTypeReference; -import org.elasticsearch.index.mapper.Mapper; -import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.internal.AllFieldMapper; -import org.elasticsearch.index.similarity.SimilarityLookupService; -import org.elasticsearch.index.similarity.SimilarityProvider; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.TreeMap; - -import static org.elasticsearch.index.mapper.core.TypeParsers.DOC_VALUES; - -public abstract class AbstractFieldMapper extends FieldMapper { - - public static class Defaults { - public static final float BOOST = 1.0f; - public static final ContentPath.Type PATH_TYPE = ContentPath.Type.FULL; - } - - public abstract static class Builder extends Mapper.Builder { - - protected final MappedFieldType fieldType; - protected final MappedFieldType defaultFieldType; - private final IndexOptions defaultOptions; - protected boolean omitNormsSet = false; - protected String indexName; - protected Boolean includeInAll; - protected boolean indexOptionsSet = false; - protected boolean docValuesSet = false; - @Nullable - protected Settings fieldDataSettings; - protected final MultiFields.Builder multiFieldsBuilder; - protected CopyTo copyTo; - - protected Builder(String name, MappedFieldType fieldType) { - super(name); - this.fieldType = fieldType.clone(); - this.defaultFieldType = fieldType.clone(); - this.defaultOptions = fieldType.indexOptions(); // we have to store it the fieldType is mutable - multiFieldsBuilder = new MultiFields.Builder(); - } - - public T index(boolean index) { - if (index) { - if (fieldType.indexOptions() == IndexOptions.NONE) { - /* - * the logic here is to reset to the default options only if we are not indexed ie. options are null - * if the fieldType has a non-null option we are all good it might have been set through a different - * call. - */ - final IndexOptions options = getDefaultIndexOption(); - assert options != IndexOptions.NONE : "default IndexOptions is NONE can't enable indexing"; - fieldType.setIndexOptions(options); - } - } else { - fieldType.setIndexOptions(IndexOptions.NONE); - } - return builder; - } - - protected IndexOptions getDefaultIndexOption() { - return defaultOptions; - } - - public T store(boolean store) { - this.fieldType.setStored(store); - return builder; - } - - public T docValues(boolean docValues) { - this.fieldType.setHasDocValues(docValues); - this.docValuesSet = true; - return builder; - } - - public T storeTermVectors(boolean termVectors) { - if (termVectors != this.fieldType.storeTermVectors()) { - this.fieldType.setStoreTermVectors(termVectors); - } // don't set it to false, it is default and might be flipped by a more specific option - return builder; - } - - public T storeTermVectorOffsets(boolean termVectorOffsets) { - if (termVectorOffsets) { - this.fieldType.setStoreTermVectors(termVectorOffsets); - } - this.fieldType.setStoreTermVectorOffsets(termVectorOffsets); - return builder; - } - - public T storeTermVectorPositions(boolean termVectorPositions) { - if (termVectorPositions) { - this.fieldType.setStoreTermVectors(termVectorPositions); - } - this.fieldType.setStoreTermVectorPositions(termVectorPositions); - return builder; - } - - public T storeTermVectorPayloads(boolean termVectorPayloads) { - if (termVectorPayloads) { - this.fieldType.setStoreTermVectors(termVectorPayloads); - } - this.fieldType.setStoreTermVectorPayloads(termVectorPayloads); - return builder; - } - - public T tokenized(boolean tokenized) { - this.fieldType.setTokenized(tokenized); - return builder; - } - - public T boost(float boost) { - this.fieldType.setBoost(boost); - return builder; - } - - public T omitNorms(boolean omitNorms) { - this.fieldType.setOmitNorms(omitNorms); - this.omitNormsSet = true; - return builder; - } - - public T indexOptions(IndexOptions indexOptions) { - this.fieldType.setIndexOptions(indexOptions); - this.indexOptionsSet = true; - return builder; - } - - public T indexName(String indexName) { - this.indexName = indexName; - return builder; - } - - public T indexAnalyzer(NamedAnalyzer indexAnalyzer) { - this.fieldType.setIndexAnalyzer(indexAnalyzer); - return builder; - } - - public T searchAnalyzer(NamedAnalyzer searchAnalyzer) { - this.fieldType.setSearchAnalyzer(searchAnalyzer); - return builder; - } - - public T includeInAll(Boolean includeInAll) { - this.includeInAll = includeInAll; - return builder; - } - - public T similarity(SimilarityProvider similarity) { - this.fieldType.setSimilarity(similarity); - return builder; - } - - public T normsLoading(MappedFieldType.Loading normsLoading) { - this.fieldType.setNormsLoading(normsLoading); - return builder; - } - - public T fieldDataSettings(Settings settings) { - this.fieldDataSettings = settings; - return builder; - } - - public Builder nullValue(Object nullValue) { - this.fieldType.setNullValue(nullValue); - return this; - } - - public T multiFieldPathType(ContentPath.Type pathType) { - multiFieldsBuilder.pathType(pathType); - return builder; - } - - public T addMultiField(Mapper.Builder mapperBuilder) { - multiFieldsBuilder.add(mapperBuilder); - return builder; - } - - public T copyTo(CopyTo copyTo) { - this.copyTo = copyTo; - return builder; - } - - protected MappedFieldType.Names buildNames(BuilderContext context) { - return new MappedFieldType.Names(buildIndexName(context), buildIndexNameClean(context), buildFullName(context)); - } - - protected String buildIndexName(BuilderContext context) { - if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { - return buildFullName(context); - } - String actualIndexName = indexName == null ? name : indexName; - return context.path().pathAsText(actualIndexName); - } - - protected String buildIndexNameClean(BuilderContext context) { - if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { - return buildFullName(context); - } - return indexName == null ? name : indexName; - } - - protected String buildFullName(BuilderContext context) { - return context.path().fullPathAsText(name); - } - - protected void setupFieldType(BuilderContext context) { - fieldType.setNames(buildNames(context)); - if (fieldType.indexAnalyzer() == null && fieldType.tokenized() == false && fieldType.indexOptions() != IndexOptions.NONE) { - fieldType.setIndexAnalyzer(Lucene.KEYWORD_ANALYZER); - fieldType.setSearchAnalyzer(Lucene.KEYWORD_ANALYZER); - } - if (fieldDataSettings != null) { - Settings settings = Settings.builder().put(fieldType.fieldDataType().getSettings()).put(fieldDataSettings).build(); - fieldType.setFieldDataType(new FieldDataType(fieldType.fieldDataType().getType(), settings)); - } - boolean defaultDocValues = false; // pre 2.0 - if (context.indexCreatedVersion().onOrAfter(Version.V_2_0_0)) { - defaultDocValues = fieldType.tokenized() == false && fieldType.indexOptions() != IndexOptions.NONE; - } - // backcompat for "fielddata: format: docvalues" for now... - boolean fieldDataDocValues = fieldType.fieldDataType() != null - && FieldDataType.DOC_VALUES_FORMAT_VALUE.equals(fieldType.fieldDataType().getFormat(context.indexSettings())); - if (fieldDataDocValues && docValuesSet && fieldType.hasDocValues() == false) { - // this forces the doc_values setting to be written, so fielddata does not mask the original setting - defaultDocValues = true; - } - defaultFieldType.setHasDocValues(defaultDocValues); - if (docValuesSet == false) { - fieldType.setHasDocValues(defaultDocValues || fieldDataDocValues); - } - } - } - - protected MappedFieldTypeReference fieldTypeRef; - protected final MappedFieldType defaultFieldType; - protected final MultiFields multiFields; - protected CopyTo copyTo; - protected final boolean indexCreatedBefore2x; - - protected AbstractFieldMapper(String simpleName, MappedFieldType fieldType, MappedFieldType defaultFieldType, Settings indexSettings, MultiFields multiFields, CopyTo copyTo) { - super(simpleName); - assert indexSettings != null; - this.indexCreatedBefore2x = Version.indexCreated(indexSettings).before(Version.V_2_0_0); - this.fieldTypeRef = new MappedFieldTypeReference(fieldType); // the reference ctor freezes the field type - defaultFieldType.freeze(); - this.defaultFieldType = defaultFieldType; - this.multiFields = multiFields; - this.copyTo = copyTo; - } - - @Override - public String name() { - return fieldType().names().fullName(); - } - - @Override - public MappedFieldType fieldType() { - return fieldTypeRef.get(); - } - - @Override - public MappedFieldTypeReference fieldTypeReference() { - return fieldTypeRef; - } - - @Override - public void setFieldTypeReference(MappedFieldTypeReference ref) { - if (ref.get().equals(fieldType()) == false) { - throw new IllegalStateException("Cannot overwrite field type reference to unequal reference"); - } - ref.incrementAssociatedMappers(); - this.fieldTypeRef = ref; - } - - @Override - public CopyTo copyTo() { - return copyTo; - } - - @Override - public Mapper parse(ParseContext context) throws IOException { - final List fields = new ArrayList<>(2); - try { - parseCreateField(context, fields); - for (Field field : fields) { - if (!customBoost()) { - field.setBoost(fieldType().boost()); - } - context.doc().add(field); - } - } catch (Exception e) { - throw new MapperParsingException("failed to parse [" + fieldType().names().fullName() + "]", e); - } - multiFields.parse(this, context); - return null; - } - - /** - * Parse the field value and populate fields. - */ - protected abstract void parseCreateField(ParseContext context, List fields) throws IOException; - - /** - * Derived classes can override it to specify that boost value is set by derived classes. - */ - protected boolean customBoost() { - return false; - } - - public Iterator iterator() { - if (multiFields == null) { - return Collections.emptyIterator(); - } - return multiFields.iterator(); - } - - @Override - public void merge(Mapper mergeWith, MergeResult mergeResult) throws MergeMappingException { - if (!this.getClass().equals(mergeWith.getClass())) { - String mergedType = mergeWith.getClass().getSimpleName(); - if (mergeWith instanceof AbstractFieldMapper) { - mergedType = ((AbstractFieldMapper) mergeWith).contentType(); - } - mergeResult.addConflict("mapper [" + fieldType().names().fullName() + "] of different type, current_type [" + contentType() + "], merged_type [" + mergedType + "]"); - // different types, return - return; - } - AbstractFieldMapper fieldMergeWith = (AbstractFieldMapper) mergeWith; - List subConflicts = new ArrayList<>(); // TODO: just expose list from MergeResult? - fieldType().checkTypeName(fieldMergeWith.fieldType(), subConflicts); - if (subConflicts.isEmpty() == false) { - // return early if field types don't match - assert subConflicts.size() == 1; - mergeResult.addConflict(subConflicts.get(0)); - return; - } - - boolean strict = this.fieldTypeRef.getNumAssociatedMappers() > 1 && mergeResult.updateAllTypes() == false; - fieldType().checkCompatibility(fieldMergeWith.fieldType(), subConflicts, strict); - for (String conflict : subConflicts) { - mergeResult.addConflict(conflict); - } - multiFields.merge(mergeWith, mergeResult); - - if (mergeResult.simulate() == false && mergeResult.hasConflicts() == false) { - // apply changeable values - MappedFieldType fieldType = fieldMergeWith.fieldType().clone(); - fieldType.freeze(); - fieldTypeRef.set(fieldType); - this.copyTo = fieldMergeWith.copyTo; - } - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(simpleName()); - boolean includeDefaults = params.paramAsBoolean("include_defaults", false); - doXContentBody(builder, includeDefaults, params); - return builder.endObject(); - } - - protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { - - builder.field("type", contentType()); - if (indexCreatedBefore2x && (includeDefaults || !simpleName().equals(fieldType().names().originalIndexName()))) { - builder.field("index_name", fieldType().names().originalIndexName()); - } - - if (includeDefaults || fieldType().boost() != 1.0f) { - builder.field("boost", fieldType().boost()); - } - - boolean indexed = fieldType().indexOptions() != IndexOptions.NONE; - boolean defaultIndexed = defaultFieldType.indexOptions() != IndexOptions.NONE; - if (includeDefaults || indexed != defaultIndexed || - fieldType().tokenized() != defaultFieldType.tokenized()) { - builder.field("index", indexTokenizeOptionToString(indexed, fieldType().tokenized())); - } - if (includeDefaults || fieldType().stored() != defaultFieldType.stored()) { - builder.field("store", fieldType().stored()); - } - doXContentDocValues(builder, includeDefaults); - if (includeDefaults || fieldType().storeTermVectors() != defaultFieldType.storeTermVectors()) { - builder.field("term_vector", termVectorOptionsToString(fieldType())); - } - if (includeDefaults || fieldType().omitNorms() != defaultFieldType.omitNorms() || fieldType().normsLoading() != null) { - builder.startObject("norms"); - if (includeDefaults || fieldType().omitNorms() != defaultFieldType.omitNorms()) { - builder.field("enabled", !fieldType().omitNorms()); - } - if (fieldType().normsLoading() != null) { - builder.field(MappedFieldType.Loading.KEY, fieldType().normsLoading()); - } - builder.endObject(); - } - if (indexed && (includeDefaults || fieldType().indexOptions() != defaultFieldType.indexOptions())) { - builder.field("index_options", indexOptionToString(fieldType().indexOptions())); - } - - doXContentAnalyzers(builder, includeDefaults); - - if (fieldType().similarity() != null) { - builder.field("similarity", fieldType().similarity().name()); - } else if (includeDefaults) { - builder.field("similarity", SimilarityLookupService.DEFAULT_SIMILARITY); - } - - if (includeDefaults || hasCustomFieldDataSettings()) { - builder.field("fielddata", fieldType().fieldDataType().getSettings().getAsMap()); - } - multiFields.toXContent(builder, params); - - if (copyTo != null) { - copyTo.toXContent(builder, params); - } - } - - protected void doXContentAnalyzers(XContentBuilder builder, boolean includeDefaults) throws IOException { - if (fieldType().indexAnalyzer() == null) { - if (includeDefaults) { - builder.field("analyzer", "default"); - } - } else if (includeDefaults || fieldType().indexAnalyzer().name().startsWith("_") == false && fieldType().indexAnalyzer().name().equals("default") == false) { - builder.field("analyzer", fieldType().indexAnalyzer().name()); - if (fieldType().searchAnalyzer().name().equals(fieldType().indexAnalyzer().name()) == false) { - builder.field("search_analyzer", fieldType().searchAnalyzer().name()); - } - } - } - - protected void doXContentDocValues(XContentBuilder builder, boolean includeDefaults) throws IOException { - if (includeDefaults || defaultFieldType.hasDocValues() != fieldType().hasDocValues()) { - builder.field(DOC_VALUES, fieldType().hasDocValues()); - } - } - - protected static String indexOptionToString(IndexOptions indexOption) { - switch (indexOption) { - case DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS: - return TypeParsers.INDEX_OPTIONS_OFFSETS; - case DOCS_AND_FREQS: - return TypeParsers.INDEX_OPTIONS_FREQS; - case DOCS_AND_FREQS_AND_POSITIONS: - return TypeParsers.INDEX_OPTIONS_POSITIONS; - case DOCS: - return TypeParsers.INDEX_OPTIONS_DOCS; - default: - throw new IllegalArgumentException("Unknown IndexOptions [" + indexOption + "]"); - } - } - - public static String termVectorOptionsToString(FieldType fieldType) { - if (!fieldType.storeTermVectors()) { - return "no"; - } else if (!fieldType.storeTermVectorOffsets() && !fieldType.storeTermVectorPositions()) { - return "yes"; - } else if (fieldType.storeTermVectorOffsets() && !fieldType.storeTermVectorPositions()) { - return "with_offsets"; - } else { - StringBuilder builder = new StringBuilder("with"); - if (fieldType.storeTermVectorPositions()) { - builder.append("_positions"); - } - if (fieldType.storeTermVectorOffsets()) { - builder.append("_offsets"); - } - if (fieldType.storeTermVectorPayloads()) { - builder.append("_payloads"); - } - return builder.toString(); - } - } - - protected static String indexTokenizeOptionToString(boolean indexed, boolean tokenized) { - if (!indexed) { - return "no"; - } else if (tokenized) { - return "analyzed"; - } else { - return "not_analyzed"; - } - } - - protected boolean hasCustomFieldDataSettings() { - return fieldType().fieldDataType() != null && fieldType().fieldDataType().equals(defaultFieldType.fieldDataType()) == false; - } - - protected abstract String contentType(); - - public static class MultiFields { - - public static MultiFields empty() { - return new MultiFields(Defaults.PATH_TYPE, ImmutableOpenMap.of()); - } - - public static class Builder { - - private final ImmutableOpenMap.Builder mapperBuilders = ImmutableOpenMap.builder(); - private ContentPath.Type pathType = Defaults.PATH_TYPE; - - public Builder pathType(ContentPath.Type pathType) { - this.pathType = pathType; - return this; - } - - public Builder add(Mapper.Builder builder) { - mapperBuilders.put(builder.name(), builder); - return this; - } - - @SuppressWarnings("unchecked") - public MultiFields build(AbstractFieldMapper.Builder mainFieldBuilder, BuilderContext context) { - if (pathType == Defaults.PATH_TYPE && mapperBuilders.isEmpty()) { - return empty(); - } else if (mapperBuilders.isEmpty()) { - return new MultiFields(pathType, ImmutableOpenMap.of()); - } else { - ContentPath.Type origPathType = context.path().pathType(); - context.path().pathType(pathType); - context.path().add(mainFieldBuilder.name()); - ImmutableOpenMap.Builder mapperBuilders = this.mapperBuilders; - for (ObjectObjectCursor cursor : this.mapperBuilders) { - String key = cursor.key; - Mapper.Builder value = cursor.value; - Mapper mapper = value.build(context); - assert mapper instanceof FieldMapper; - mapperBuilders.put(key, mapper); - } - context.path().remove(); - context.path().pathType(origPathType); - ImmutableOpenMap.Builder mappers = mapperBuilders.cast(); - return new MultiFields(pathType, mappers.build()); - } - } - } - - private final ContentPath.Type pathType; - private volatile ImmutableOpenMap mappers; - - public MultiFields(ContentPath.Type pathType, ImmutableOpenMap mappers) { - this.pathType = pathType; - this.mappers = mappers; - // we disable the all in multi-field mappers - for (ObjectCursor cursor : mappers.values()) { - FieldMapper mapper = cursor.value; - if (mapper instanceof AllFieldMapper.IncludeInAll) { - ((AllFieldMapper.IncludeInAll) mapper).unsetIncludeInAll(); - } - } - } - - public void parse(AbstractFieldMapper mainField, ParseContext context) throws IOException { - // TODO: multi fields are really just copy fields, we just need to expose "sub fields" or something that can be part of the mappings - if (mappers.isEmpty()) { - return; - } - - context = context.createMultiFieldContext(); - - ContentPath.Type origPathType = context.path().pathType(); - context.path().pathType(pathType); - - context.path().add(mainField.simpleName()); - for (ObjectCursor cursor : mappers.values()) { - cursor.value.parse(context); - } - context.path().remove(); - context.path().pathType(origPathType); - } - - // No need for locking, because locking is taken care of in ObjectMapper#merge and DocumentMapper#merge - public void merge(Mapper mergeWith, MergeResult mergeResult) throws MergeMappingException { - AbstractFieldMapper mergeWithMultiField = (AbstractFieldMapper) mergeWith; - - List newFieldMappers = null; - ImmutableOpenMap.Builder newMappersBuilder = null; - - for (ObjectCursor cursor : mergeWithMultiField.multiFields.mappers.values()) { - FieldMapper mergeWithMapper = cursor.value; - Mapper mergeIntoMapper = mappers.get(mergeWithMapper.simpleName()); - if (mergeIntoMapper == null) { - // no mapping, simply add it if not simulating - if (!mergeResult.simulate()) { - // we disable the all in multi-field mappers - if (mergeWithMapper instanceof AllFieldMapper.IncludeInAll) { - ((AllFieldMapper.IncludeInAll) mergeWithMapper).unsetIncludeInAll(); - } - if (newMappersBuilder == null) { - newMappersBuilder = ImmutableOpenMap.builder(mappers); - } - newMappersBuilder.put(mergeWithMapper.simpleName(), mergeWithMapper); - if (mergeWithMapper instanceof AbstractFieldMapper) { - if (newFieldMappers == null) { - newFieldMappers = new ArrayList<>(2); - } - newFieldMappers.add(mergeWithMapper); - } - } - } else { - mergeIntoMapper.merge(mergeWithMapper, mergeResult); - } - } - - // first add all field mappers - if (newFieldMappers != null) { - mergeResult.addFieldMappers(newFieldMappers); - } - // now publish mappers - if (newMappersBuilder != null) { - mappers = newMappersBuilder.build(); - } - } - - public Iterator iterator() { - return Iterators.transform(mappers.values().iterator(), new Function, Mapper>() { - @Override - public Mapper apply(@Nullable ObjectCursor cursor) { - return cursor.value; - } - }); - } - - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - if (pathType != Defaults.PATH_TYPE) { - builder.field("path", pathType.name().toLowerCase(Locale.ROOT)); - } - if (!mappers.isEmpty()) { - // sort the mappers so we get consistent serialization format - Mapper[] sortedMappers = mappers.values().toArray(Mapper.class); - Arrays.sort(sortedMappers, new Comparator() { - @Override - public int compare(Mapper o1, Mapper o2) { - return o1.name().compareTo(o2.name()); - } - }); - builder.startObject("fields"); - for (Mapper mapper : sortedMappers) { - mapper.toXContent(builder, params); - } - builder.endObject(); - } - return builder; - } - } - - /** - * Represents a list of fields with optional boost factor where the current field should be copied to - */ - public static class CopyTo { - - private final ImmutableList copyToFields; - - private CopyTo(ImmutableList copyToFields) { - this.copyToFields = copyToFields; - } - - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - if (!copyToFields.isEmpty()) { - builder.startArray("copy_to"); - for (String field : copyToFields) { - builder.value(field); - } - builder.endArray(); - } - return builder; - } - - public static class Builder { - private final ImmutableList.Builder copyToBuilders = ImmutableList.builder(); - - public Builder add(String field) { - copyToBuilders.add(field); - return this; - } - - public CopyTo build() { - return new CopyTo(copyToBuilders.build()); - } - } - - public List copyToFields() { - return copyToFields; - } - } - - /** - * Returns if this field is only generated when indexing. For example, the field of type token_count - */ - @Override - public boolean isGenerated() { - return false; - } -} diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/BinaryFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/BinaryFieldMapper.java index a3423ee7fc6..8f2fe5cb639 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/BinaryFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/BinaryFieldMapper.java @@ -28,7 +28,6 @@ import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.Version; import org.elasticsearch.common.Base64; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; @@ -36,7 +35,7 @@ import org.elasticsearch.common.compress.CompressorFactory; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.CollectionUtils; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -54,14 +53,14 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parseField; /** * */ -public class BinaryFieldMapper extends AbstractFieldMapper { +public class BinaryFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "binary"; private static final ParseField COMPRESS = new ParseField("compress").withAllDeprecated("no replacement, implemented at the codec level"); private static final ParseField COMPRESS_THRESHOLD = new ParseField("compress_threshold").withAllDeprecated("no replacement"); - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final MappedFieldType FIELD_TYPE = new BinaryFieldType(); static { @@ -70,7 +69,7 @@ public class BinaryFieldMapper extends AbstractFieldMapper { } } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { public Builder(String name) { super(name, Defaults.FIELD_TYPE); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/BooleanFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/BooleanFieldMapper.java index 70c2640a038..cd76fdbb047 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/BooleanFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/BooleanFieldMapper.java @@ -24,18 +24,15 @@ import org.apache.lucene.document.SortedNumericDocValuesField; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.Booleans; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import java.io.IOException; @@ -50,11 +47,11 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parseField; /** * A field mapper for boolean fields. */ -public class BooleanFieldMapper extends AbstractFieldMapper { +public class BooleanFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "boolean"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final MappedFieldType FIELD_TYPE = new BooleanFieldType(); static { @@ -72,7 +69,7 @@ public class BooleanFieldMapper extends AbstractFieldMapper { public final static BytesRef FALSE = new BytesRef("F"); } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { public Builder(String name) { super(name, Defaults.FIELD_TYPE); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java index 060191e4fdd..197bac8843e 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java @@ -38,12 +38,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericIntegerAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java index 0aa5df7a98b..5cf925c9e6b 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/CompletionFieldMapper.java @@ -37,7 +37,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser.NumberType; import org.elasticsearch.common.xcontent.XContentParser.Token; import org.elasticsearch.index.analysis.NamedAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperException; @@ -66,11 +66,11 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parseMultiField; /** * */ -public class CompletionFieldMapper extends AbstractFieldMapper { +public class CompletionFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "completion"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final CompletionFieldType FIELD_TYPE = new CompletionFieldType(); static { @@ -104,7 +104,7 @@ public class CompletionFieldMapper extends AbstractFieldMapper { public static final Set ALLOWED_CONTENT_FIELD_NAMES = Sets.newHashSet(Fields.CONTENT_FIELD_NAME_INPUT, Fields.CONTENT_FIELD_NAME_OUTPUT, Fields.CONTENT_FIELD_NAME_PAYLOAD, Fields.CONTENT_FIELD_NAME_WEIGHT, Fields.CONTEXT); - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { private boolean preserveSeparators = Defaults.DEFAULT_PRESERVE_SEPARATORS; private boolean payloads = Defaults.DEFAULT_HAS_PAYLOADS; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java index c2b6970cc53..c02c7f34bc9 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java @@ -94,7 +94,8 @@ public class DateFieldMapper extends NumberFieldMapper { locale = Locale.ROOT; } - DateFieldType fieldType() { + @Override + public DateFieldType fieldType() { return (DateFieldType)fieldType; } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java index 6c5afb2e793..49db4c984f3 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java @@ -24,7 +24,6 @@ import com.carrotsearch.hppc.DoubleArrayList; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType.NumericType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Terms; import org.apache.lucene.search.NumericRangeQuery; @@ -44,12 +43,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericDoubleAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java index 25f4053b7af..50b44582350 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java @@ -24,7 +24,6 @@ import com.carrotsearch.hppc.FloatArrayList; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType.NumericType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Terms; import org.apache.lucene.search.NumericRangeQuery; @@ -45,12 +44,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericFloatAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java index a3e0718f5ba..eb45f482a79 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java @@ -40,13 +40,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericIntegerAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; -import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java index 26deaa8f79f..cc02f0fd1f0 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java @@ -22,7 +22,6 @@ package org.elasticsearch.index.mapper.core; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType.NumericType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Terms; import org.apache.lucene.search.NumericRangeQuery; @@ -41,12 +40,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericLongAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/Murmur3FieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/Murmur3FieldMapper.java index 30bed42cb4b..cac410ff7d3 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/Murmur3FieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/Murmur3FieldMapper.java @@ -23,17 +23,14 @@ import org.apache.lucene.document.Field; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; import org.elasticsearch.common.Explicit; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.hash.MurmurHash3; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.analysis.NamedAnalyzer; -import org.elasticsearch.index.analysis.NumericDateAnalyzer; import org.elasticsearch.index.analysis.NumericLongAnalyzer; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.similarity.SimilarityProvider; import java.io.IOException; import java.util.List; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java index 7540cf2300b..022ce75c092 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java @@ -36,13 +36,13 @@ import org.apache.lucene.store.ByteArrayDataOutput; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; import org.elasticsearch.common.Explicit; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.util.ByteUtils; import org.elasticsearch.common.util.CollectionUtils; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.analysis.NamedAnalyzer; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -58,9 +58,9 @@ import java.util.List; /** * */ -public abstract class NumberFieldMapper extends AbstractFieldMapper implements AllFieldMapper.IncludeInAll { +public abstract class NumberFieldMapper extends FieldMapper implements AllFieldMapper.IncludeInAll { - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final int PRECISION_STEP_8_BIT = Integer.MAX_VALUE; // 1tpv: 256 terms at most, not useful public static final int PRECISION_STEP_16_BIT = 8; // 2tpv @@ -71,7 +71,7 @@ public abstract class NumberFieldMapper extends AbstractFieldMapper implements A public static final Explicit COERCE = new Explicit<>(true, false); } - public abstract static class Builder extends AbstractFieldMapper.Builder { + public abstract static class Builder extends FieldMapper.Builder { private Boolean ignoreMalformed; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java index 083100ccd6c..649ac2296dd 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java @@ -22,7 +22,6 @@ package org.elasticsearch.index.mapper.core; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType.NumericType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Terms; import org.apache.lucene.search.NumericRangeQuery; @@ -41,12 +40,9 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericIntegerAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java index c1d0147eac8..a255a2f106f 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java @@ -24,14 +24,13 @@ import org.apache.lucene.document.SortedSetDocValuesField; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.search.Query; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.index.analysis.NamedAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -50,14 +49,11 @@ import static org.elasticsearch.index.mapper.MapperBuilders.stringField; import static org.elasticsearch.index.mapper.core.TypeParsers.parseField; import static org.elasticsearch.index.mapper.core.TypeParsers.parseMultiField; -/** - * - */ -public class StringFieldMapper extends AbstractFieldMapper implements AllFieldMapper.IncludeInAll { +public class StringFieldMapper extends FieldMapper implements AllFieldMapper.IncludeInAll { public static final String CONTENT_TYPE = "string"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final MappedFieldType FIELD_TYPE = new StringFieldType(); static { @@ -70,7 +66,7 @@ public class StringFieldMapper extends AbstractFieldMapper implements AllFieldMa public static final int IGNORE_ABOVE = -1; } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { protected String nullValue = Defaults.NULL_VALUE; @@ -119,7 +115,7 @@ public class StringFieldMapper extends AbstractFieldMapper implements AllFieldMa if (fieldType.indexOptions() != IndexOptions.NONE && !fieldType.tokenized()) { defaultFieldType.setOmitNorms(true); defaultFieldType.setIndexOptions(IndexOptions.DOCS); - if (!omitNormsSet && fieldType.boost() == Defaults.BOOST) { + if (!omitNormsSet && fieldType.boost() == 1.0f) { fieldType.setOmitNorms(true); } if (!indexOptionsSet) { @@ -161,14 +157,14 @@ public class StringFieldMapper extends AbstractFieldMapper implements AllFieldMa builder.positionOffsetGap(XContentMapValues.nodeIntegerValue(propNode, -1)); // we need to update to actual analyzers if they are not set in this case... // so we can inject the position offset gap... - if (builder.fieldType.indexAnalyzer() == null) { - builder.fieldType.setIndexAnalyzer(parserContext.analysisService().defaultIndexAnalyzer()); + if (builder.fieldType().indexAnalyzer() == null) { + builder.fieldType().setIndexAnalyzer(parserContext.analysisService().defaultIndexAnalyzer()); } - if (builder.fieldType.searchAnalyzer() == null) { - builder.fieldType.setSearchAnalyzer(parserContext.analysisService().defaultSearchAnalyzer()); + if (builder.fieldType().searchAnalyzer() == null) { + builder.fieldType().setSearchAnalyzer(parserContext.analysisService().defaultSearchAnalyzer()); } - if (builder.fieldType.searchQuoteAnalyzer() == null) { - builder.fieldType.setSearchQuoteAnalyzer(parserContext.analysisService().defaultSearchQuoteAnalyzer()); + if (builder.fieldType().searchQuoteAnalyzer() == null) { + builder.fieldType().setSearchQuoteAnalyzer(parserContext.analysisService().defaultSearchQuoteAnalyzer()); } iterator.remove(); } else if (propName.equals("ignore_above")) { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java b/core/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java index a905687bd78..91c877c0c98 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/core/TypeParsers.java @@ -30,6 +30,7 @@ import org.elasticsearch.common.settings.loader.SettingsLoader; import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.mapper.ContentPath; import org.elasticsearch.index.mapper.DocumentMapperParser; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType.Loading; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -60,8 +61,8 @@ public class TypeParsers { @Override public Mapper.Builder parse(String name, Map node, ParserContext parserContext) throws MapperParsingException { ContentPath.Type pathType = null; - AbstractFieldMapper.Builder mainFieldBuilder = null; - List fields = null; + FieldMapper.Builder mainFieldBuilder = null; + List fields = null; String firstType = null; for (Iterator> iterator = node.entrySet().iterator(); iterator.hasNext();) { @@ -94,13 +95,13 @@ public class TypeParsers { throw new MapperParsingException("no handler for type [" + type + "] declared on field [" + fieldName + "]"); } if (propName.equals(name)) { - mainFieldBuilder = (AbstractFieldMapper.Builder) typeParser.parse(propName, propNode, parserContext); + mainFieldBuilder = (FieldMapper.Builder) typeParser.parse(propName, propNode, parserContext); fieldsIterator.remove(); } else { if (fields == null) { fields = new ArrayList<>(2); } - fields.add((AbstractFieldMapper.Builder) typeParser.parse(propName, propNode, parserContext)); + fields.add((FieldMapper.Builder) typeParser.parse(propName, propNode, parserContext)); fieldsIterator.remove(); } } @@ -121,8 +122,8 @@ public class TypeParsers { mainFieldBuilder = new StringFieldMapper.Builder(name).index(false); } else { Mapper.Builder substitute = typeParser.parse(name, Collections.emptyMap(), parserContext); - if (substitute instanceof AbstractFieldMapper.Builder) { - mainFieldBuilder = ((AbstractFieldMapper.Builder) substitute).index(false); + if (substitute instanceof FieldMapper.Builder) { + mainFieldBuilder = ((FieldMapper.Builder) substitute).index(false); } else { // The first multi isn't a core field type mainFieldBuilder = new StringFieldMapper.Builder(name).index(false); @@ -180,9 +181,9 @@ public class TypeParsers { } } - public static void parseField(AbstractFieldMapper.Builder builder, String name, Map fieldNode, Mapper.TypeParser.ParserContext parserContext) { - NamedAnalyzer indexAnalyzer = builder.fieldType.indexAnalyzer(); - NamedAnalyzer searchAnalyzer = builder.fieldType.searchAnalyzer(); + public static void parseField(FieldMapper.Builder builder, String name, Map fieldNode, Mapper.TypeParser.ParserContext parserContext) { + NamedAnalyzer indexAnalyzer = builder.fieldType().indexAnalyzer(); + NamedAnalyzer searchAnalyzer = builder.fieldType().searchAnalyzer(); for (Iterator> iterator = fieldNode.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); final String propName = Strings.toUnderscoreCase(entry.getKey()); @@ -299,7 +300,7 @@ public class TypeParsers { builder.searchAnalyzer(searchAnalyzer); } - public static boolean parseMultiField(AbstractFieldMapper.Builder builder, String name, Mapper.TypeParser.ParserContext parserContext, String propName, Object propNode) { + public static boolean parseMultiField(FieldMapper.Builder builder, String name, Mapper.TypeParser.ParserContext parserContext, String propName, Object propNode) { if (propName.equals("path") && parserContext.indexVersionCreated().before(Version.V_2_0_0)) { builder.multiFieldPathType(parsePathType(name, propNode.toString())); return true; @@ -367,7 +368,7 @@ public class TypeParsers { return Joda.forPattern(node.toString()); } - public static void parseTermVector(String fieldName, String termVector, AbstractFieldMapper.Builder builder) throws MapperParsingException { + public static void parseTermVector(String fieldName, String termVector, FieldMapper.Builder builder) throws MapperParsingException { termVector = Strings.toUnderscoreCase(termVector); if ("no".equals(termVector)) { builder.storeTermVectors(false); @@ -392,7 +393,7 @@ public class TypeParsers { } } - public static void parseIndex(String fieldName, String index, AbstractFieldMapper.Builder builder) throws MapperParsingException { + public static void parseIndex(String fieldName, String index, FieldMapper.Builder builder) throws MapperParsingException { index = Strings.toUnderscoreCase(index); if ("no".equals(index)) { builder.index(false); @@ -429,8 +430,8 @@ public class TypeParsers { } @SuppressWarnings("unchecked") - public static void parseCopyFields(Object propNode, AbstractFieldMapper.Builder builder) { - AbstractFieldMapper.CopyTo.Builder copyToBuilder = new AbstractFieldMapper.CopyTo.Builder(); + public static void parseCopyFields(Object propNode, FieldMapper.Builder builder) { + FieldMapper.CopyTo.Builder copyToBuilder = new FieldMapper.CopyTo.Builder(); if (isArray(propNode)) { for(Object node : (List) propNode) { copyToBuilder.add(nodeStringValue(node, null)); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java index e37e2c9dde8..dabc109f2e1 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoPointFieldMapper.java @@ -27,7 +27,6 @@ import org.apache.lucene.index.IndexOptions; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.NumericUtils; import org.elasticsearch.Version; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.geo.GeoHashUtils; @@ -39,13 +38,12 @@ import org.elasticsearch.common.util.ByteUtils; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.support.XContentMapValues; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.ContentPath; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.core.DoubleFieldMapper; import org.elasticsearch.index.mapper.core.NumberFieldMapper; import org.elasticsearch.index.mapper.core.NumberFieldMapper.CustomNumericDocValuesField; @@ -76,7 +74,7 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parsePathType; * "lon" : 2.1 * } */ -public class GeoPointFieldMapper extends AbstractFieldMapper implements ArrayValueMapperParser { +public class GeoPointFieldMapper extends FieldMapper implements ArrayValueMapperParser { public static final String CONTENT_TYPE = "geo_point"; @@ -110,7 +108,7 @@ public class GeoPointFieldMapper extends AbstractFieldMapper implements ArrayVal } } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { private ContentPath.Type pathType = Defaults.PATH_TYPE; @@ -129,7 +127,8 @@ public class GeoPointFieldMapper extends AbstractFieldMapper implements ArrayVal this.builder = this; } - GeoPointFieldType fieldType() { + @Override + public GeoPointFieldType fieldType() { return (GeoPointFieldType)fieldType; } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java index d5fa96de7d6..a462140d338 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java @@ -37,12 +37,11 @@ import org.elasticsearch.common.geo.builders.ShapeBuilder.Orientation; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.fielddata.FieldDataType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import java.io.IOException; import java.util.Iterator; @@ -69,7 +68,7 @@ import static org.elasticsearch.index.mapper.MapperBuilders.geoShapeField; * ] * } */ -public class GeoShapeFieldMapper extends AbstractFieldMapper { +public class GeoShapeFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "geo_shape"; @@ -107,7 +106,7 @@ public class GeoShapeFieldMapper extends AbstractFieldMapper { } } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { public Builder(String name) { super(name, Defaults.FIELD_TYPE); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java index 20fe1113351..1ceee372a51 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java @@ -25,7 +25,6 @@ import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; import org.elasticsearch.Version; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.lucene.Lucene; @@ -39,9 +38,8 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.similarity.SimilarityLookupService; @@ -72,7 +70,7 @@ public class AllFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_all"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = AllFieldMapper.NAME; public static final String INDEX_NAME = AllFieldMapper.NAME; public static final EnabledAttributeMapper ENABLED = EnabledAttributeMapper.UNSET_ENABLED; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java index d34fa8bb98d..26414c4aaca 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java @@ -24,7 +24,6 @@ import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; import org.elasticsearch.Version; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; @@ -33,9 +32,8 @@ import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import java.io.IOException; import java.util.ArrayList; @@ -59,7 +57,7 @@ public class FieldNamesFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_field_names"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = FieldNamesFieldMapper.NAME; public static final boolean ENABLED = true; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/IdFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/IdFieldMapper.java index 8a02627f336..463d2bdd2b4 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/IdFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/IdFieldMapper.java @@ -46,10 +46,9 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.Uid; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.query.QueryParseContext; import java.io.IOException; @@ -69,7 +68,7 @@ public class IdFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_id"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = IdFieldMapper.NAME; public static final MappedFieldType FIELD_TYPE = new IdFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/IndexFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/IndexFieldMapper.java index 1edfdb89e9d..abf93b6ae3c 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/IndexFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/IndexFieldMapper.java @@ -31,7 +31,6 @@ import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -39,7 +38,6 @@ import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.query.QueryParseContext; import java.io.IOException; @@ -59,7 +57,7 @@ public class IndexFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_index"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = IndexFieldMapper.NAME; public static final MappedFieldType FIELD_TYPE = new IndexFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/ParentFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/ParentFieldMapper.java index 32541099b2c..ad6a45ab594 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/ParentFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/ParentFieldMapper.java @@ -40,10 +40,9 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.Uid; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.query.QueryParseContext; import java.io.IOException; @@ -64,7 +63,7 @@ public class ParentFieldMapper extends MetadataFieldMapper { public static final String NAME = "_parent"; public static final String CONTENT_TYPE = "_parent"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = ParentFieldMapper.NAME; public static final MappedFieldType FIELD_TYPE = new ParentFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/RoutingFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/RoutingFieldMapper.java index 747b8fd128a..261a368ac45 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/RoutingFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/RoutingFieldMapper.java @@ -33,9 +33,8 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import java.io.IOException; import java.util.Iterator; @@ -53,7 +52,7 @@ public class RoutingFieldMapper extends MetadataFieldMapper { public static final String NAME = "_routing"; public static final String CONTENT_TYPE = "_routing"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = "_routing"; public static final MappedFieldType FIELD_TYPE = new RoutingFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/SizeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/SizeFieldMapper.java index cbd5d3e5f8d..1bf0e2df209 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/SizeFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/SizeFieldMapper.java @@ -24,19 +24,15 @@ import org.elasticsearch.Version; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericIntegerAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.core.IntegerFieldMapper; -import org.elasticsearch.index.mapper.core.NumberFieldMapper; import java.io.IOException; import java.util.Iterator; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/SourceFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/SourceFieldMapper.java index 2f374e6b4f1..37e17008f13 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/SourceFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/SourceFieldMapper.java @@ -42,7 +42,6 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.support.XContentMapValues; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -50,7 +49,6 @@ import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import java.io.BufferedInputStream; import java.io.IOException; @@ -72,7 +70,7 @@ public class SourceFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_source"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = SourceFieldMapper.NAME; public static final boolean ENABLED = true; public static final long COMPRESS_THRESHOLD = -1; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/TTLFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/TTLFieldMapper.java index 3dfaf8c500d..96ed142029c 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/TTLFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/TTLFieldMapper.java @@ -21,7 +21,6 @@ package org.elasticsearch.index.mapper.internal; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexOptions; -import org.elasticsearch.common.Explicit; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; @@ -29,20 +28,16 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.AlreadyExpiredException; -import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.analysis.NumericLongAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.SourceToParse; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.core.LongFieldMapper; -import org.elasticsearch.index.mapper.core.NumberFieldMapper; import org.elasticsearch.search.internal.SearchContext; import java.io.IOException; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/TimestampFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/TimestampFieldMapper.java index 6029ce38288..ea25981f70e 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/TimestampFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/TimestampFieldMapper.java @@ -24,14 +24,12 @@ import org.apache.lucene.document.NumericDocValuesField; import org.apache.lucene.index.IndexOptions; import org.elasticsearch.Version; import org.elasticsearch.action.TimestampParsingException; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.joda.FormatDateTimeFormatter; import org.elasticsearch.common.joda.Joda; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.analysis.NumericDateAnalyzer; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; @@ -106,7 +104,8 @@ public class TimestampFieldMapper extends MetadataFieldMapper { } } - DateFieldMapper.DateFieldType fieldType() { + @Override + public DateFieldMapper.DateFieldType fieldType() { return (DateFieldMapper.DateFieldType)fieldType; } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java index 84d9ee4b1ab..f5d4817ca1c 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java @@ -40,10 +40,9 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; -import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.MetadataFieldMapper; +import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.Uid; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.query.QueryParseContext; import java.io.IOException; @@ -61,7 +60,7 @@ public class TypeFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_type"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = TypeFieldMapper.NAME; public static final MappedFieldType FIELD_TYPE = new TypeFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/UidFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/UidFieldMapper.java index d187698301d..75d01407a64 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/UidFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/UidFieldMapper.java @@ -26,7 +26,6 @@ import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.Term; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; -import org.elasticsearch.common.Nullable; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -36,11 +35,10 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; +import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.ParseContext.Document; -import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.Uid; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import java.io.IOException; import java.util.List; @@ -57,7 +55,7 @@ public class UidFieldMapper extends MetadataFieldMapper { public static final String CONTENT_TYPE = "_uid"; - public static class Defaults extends AbstractFieldMapper.Defaults { + public static class Defaults { public static final String NAME = UidFieldMapper.NAME; public static final MappedFieldType FIELD_TYPE = new UidFieldType(); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/VersionFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/VersionFieldMapper.java index 56c70dc9318..043890f8d88 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/VersionFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/VersionFieldMapper.java @@ -35,7 +35,6 @@ import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.ParseContext.Document; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import java.io.IOException; import java.util.Iterator; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java index 47089252e6d..4cda12fb874 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java @@ -23,7 +23,6 @@ import com.google.common.net.InetAddresses; import org.apache.lucene.analysis.NumericTokenStream; import org.apache.lucene.document.Field; -import org.apache.lucene.document.FieldType.NumericType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.Query; @@ -45,8 +44,6 @@ import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.MergeMappingException; -import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.core.LongFieldMapper; import org.elasticsearch.index.mapper.core.LongFieldMapper.CustomLongNumericField; diff --git a/core/src/test/java/org/elasticsearch/action/termvectors/GetTermVectorsTests.java b/core/src/test/java/org/elasticsearch/action/termvectors/GetTermVectorsTests.java index 12467ecef59..a78c8b6e7a1 100644 --- a/core/src/test/java/org/elasticsearch/action/termvectors/GetTermVectorsTests.java +++ b/core/src/test/java/org/elasticsearch/action/termvectors/GetTermVectorsTests.java @@ -37,7 +37,7 @@ import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.engine.VersionConflictEngineException; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; +import org.elasticsearch.index.mapper.FieldMapper; import org.hamcrest.Matcher; import org.junit.Test; @@ -273,7 +273,7 @@ public class GetTermVectorsTests extends AbstractTermVectorsTests { ft.setStoreTermVectorPayloads(storePayloads); ft.setStoreTermVectorPositions(storePositions); - String optionString = AbstractFieldMapper.termVectorOptionsToString(ft); + String optionString = FieldMapper.termVectorOptionsToString(ft); XContentBuilder mapping = jsonBuilder().startObject().startObject("type1") .startObject("properties") .startObject("field") diff --git a/core/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java b/core/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java index a981aaff1e0..f9c4d2f39f0 100644 --- a/core/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java +++ b/core/src/test/java/org/elasticsearch/action/termvectors/TermVectorsUnitTests.java @@ -37,8 +37,8 @@ import org.elasticsearch.common.io.stream.OutputStreamStreamOutput; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MapperParsingException; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.core.TypeParsers; import org.elasticsearch.index.mapper.internal.AllFieldMapper; import org.elasticsearch.rest.action.termvectors.RestTermVectorsAction; @@ -266,7 +266,7 @@ public class TermVectorsUnitTests extends ElasticsearchTestCase { ft.setStoreTermVectorPayloads(true); ft.setStoreTermVectors(true); ft.setStoreTermVectorPositions(true); - String ftOpts = AbstractFieldMapper.termVectorOptionsToString(ft); + String ftOpts = FieldMapper.termVectorOptionsToString(ft); assertThat("with_positions_payloads", equalTo(ftOpts)); AllFieldMapper.Builder builder = new AllFieldMapper.Builder(null); boolean exceptiontrown = false; @@ -285,7 +285,7 @@ public class TermVectorsUnitTests extends ElasticsearchTestCase { ft.setStoreTermVectorPayloads(true); ft.setStoreTermVectors(true); ft.setStoreTermVectorPositions(false); - String ftOpts = AbstractFieldMapper.termVectorOptionsToString(ft); + String ftOpts = FieldMapper.termVectorOptionsToString(ft); assertThat(ftOpts, equalTo("with_offsets")); } diff --git a/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeLookupTests.java b/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeLookupTests.java index 443937feb30..a3b3ea12af2 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeLookupTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/FieldTypeLookupTests.java @@ -24,8 +24,6 @@ import com.google.common.collect.Lists; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.fielddata.FieldDataType; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.test.ElasticsearchTestCase; import java.io.IOException; @@ -176,7 +174,7 @@ public class FieldTypeLookupTests extends ElasticsearchTestCase { } // this sucks how much must be overridden just do get a dummy field mapper... - static class FakeFieldMapper extends AbstractFieldMapper { + static class FakeFieldMapper extends FieldMapper { static Settings dummySettings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT.id).build(); public FakeFieldMapper(String fullName, String indexName) { super(fullName, makeFieldType(fullName, indexName), makeFieldType(fullName, indexName), dummySettings, null, null); diff --git a/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/ExternalMapper.java b/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/ExternalMapper.java index 9c423ac0476..0024a63a4b5 100755 --- a/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/ExternalMapper.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/ExternalMapper.java @@ -28,7 +28,6 @@ import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.geo.builders.ShapeBuilder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.ContentPath; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; @@ -37,7 +36,6 @@ import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MergeMappingException; import org.elasticsearch.index.mapper.MergeResult; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.core.BinaryFieldMapper; import org.elasticsearch.index.mapper.core.BooleanFieldMapper; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; @@ -60,7 +58,7 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parseMultiField; * .point GeoPoint type * .shape GeoShape type */ -public class ExternalMapper extends AbstractFieldMapper { +public class ExternalMapper extends FieldMapper { public static class Names { public static final String FIELD_BIN = "bin"; @@ -69,7 +67,7 @@ public class ExternalMapper extends AbstractFieldMapper { public static final String FIELD_SHAPE = "shape"; } - public static class Builder extends AbstractFieldMapper.Builder { + public static class Builder extends FieldMapper.Builder { private BinaryFieldMapper.Builder binBuilder = new BinaryFieldMapper.Builder(Names.FIELD_BIN); private BooleanFieldMapper.Builder boolBuilder = new BooleanFieldMapper.Builder(Names.FIELD_BOOL); diff --git a/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionPostingsFormatTest.java b/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionPostingsFormatTest.java index bdf3e2f541a..1cd9745c49d 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionPostingsFormatTest.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionPostingsFormatTest.java @@ -24,7 +24,6 @@ import com.google.common.collect.Lists; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.FieldsConsumer; -import org.apache.lucene.codecs.FilterCodec; import org.apache.lucene.codecs.PostingsFormat; import org.apache.lucene.codecs.lucene50.Lucene50Codec; import org.apache.lucene.document.Document; @@ -52,13 +51,10 @@ import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.LineFileDocs; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.analysis.NamedAnalyzer; -import org.elasticsearch.index.codec.postingsformat.Elasticsearch090PostingsFormat; -import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType.Names; -import org.elasticsearch.index.mapper.core.AbstractFieldMapper; import org.elasticsearch.index.mapper.core.CompletionFieldMapper; import org.elasticsearch.search.suggest.SuggestUtils; import org.elasticsearch.search.suggest.completion.Completion090PostingsFormat.LookupFactory; @@ -249,7 +245,7 @@ public class CompletionPostingsFormatTest extends ElasticsearchTestCase { AnalyzingCompletionLookupProvider currentProvider = new AnalyzingCompletionLookupProvider(preserveSeparators, false, preservePositionIncrements, usePayloads); CompletionFieldMapper.CompletionFieldType fieldType = FIELD_TYPE.clone(); fieldType.setProvider(currentProvider); - final CompletionFieldMapper mapper = new CompletionFieldMapper("foo", fieldType, Integer.MAX_VALUE, indexSettings, AbstractFieldMapper.MultiFields.empty(), null); + final CompletionFieldMapper mapper = new CompletionFieldMapper("foo", fieldType, Integer.MAX_VALUE, indexSettings, FieldMapper.MultiFields.empty(), null); Lookup buildAnalyzingLookup = buildAnalyzingLookup(mapper, titles, titles, weights); Field field = buildAnalyzingLookup.getClass().getDeclaredField("maxAnalyzedPathsForOneInput"); field.setAccessible(true);