Refactor build params for FieldMapper, adding SourceKeepMode (#112455)

* Refactor build params for FieldMapper

* more mappers and tests

* more mappers

* more mappers

* spotless

* spotless

* stored by default

* Revert "stored by default"

This reverts commit bbd247d64b.

* restore storeIgnored

* sync

* list valid values for SourceKeepMode

* small refactoring

* spotless
This commit is contained in:
Kostas Krikellas 2024-09-06 14:16:17 +03:00 committed by GitHub
parent cd39fc8e55
commit f3bc281978
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
54 changed files with 345 additions and 440 deletions

View file

@ -352,7 +352,7 @@ public class LegacyGeoShapeFieldMapper extends AbstractShapeGeometryFieldMapper<
public LegacyGeoShapeFieldMapper build(MapperBuilderContext context) { public LegacyGeoShapeFieldMapper build(MapperBuilderContext context) {
LegacyGeoShapeParser parser = new LegacyGeoShapeParser(); LegacyGeoShapeParser parser = new LegacyGeoShapeParser();
GeoShapeFieldType ft = buildFieldType(parser, context); GeoShapeFieldType ft = buildFieldType(parser, context);
return new LegacyGeoShapeFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, parser, this); return new LegacyGeoShapeFieldMapper(leafName(), ft, builderParams(this, context), parser, this);
} }
} }
@ -537,20 +537,18 @@ public class LegacyGeoShapeFieldMapper extends AbstractShapeGeometryFieldMapper<
public LegacyGeoShapeFieldMapper( public LegacyGeoShapeFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
LegacyGeoShapeParser parser, LegacyGeoShapeParser parser,
Builder builder Builder builder
) { ) {
super( super(
simpleName, simpleName,
mappedFieldType, mappedFieldType,
builderParams,
builder.ignoreMalformed.get(), builder.ignoreMalformed.get(),
builder.coerce.get(), builder.coerce.get(),
builder.ignoreZValue.get(), builder.ignoreZValue.get(),
builder.orientation.get(), builder.orientation.get(),
multiFields,
copyTo,
parser parser
); );
this.indexCreatedVersion = builder.indexCreatedVersion; this.indexCreatedVersion = builder.indexCreatedVersion;

View file

@ -139,13 +139,11 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
@Override @Override
public MatchOnlyTextFieldMapper build(MapperBuilderContext context) { public MatchOnlyTextFieldMapper build(MapperBuilderContext context) {
MatchOnlyTextFieldType tft = buildFieldType(context); MatchOnlyTextFieldType tft = buildFieldType(context);
MultiFields multiFields = multiFieldsBuilder.build(this, context);
return new MatchOnlyTextFieldMapper( return new MatchOnlyTextFieldMapper(
leafName(), leafName(),
Defaults.FIELD_TYPE, Defaults.FIELD_TYPE,
tft, tft,
multiFields, builderParams(this, context),
copyTo,
context.isSourceSynthetic(), context.isSourceSynthetic(),
this this
); );
@ -382,12 +380,11 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
String simpleName, String simpleName,
FieldType fieldType, FieldType fieldType,
MatchOnlyTextFieldType mappedFieldType, MatchOnlyTextFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean storeSource, boolean storeSource,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
assert mappedFieldType.getTextSearchInfo().isTokenized(); assert mappedFieldType.getTextSearchInfo().isTokenized();
assert mappedFieldType.hasDocValues() == false; assert mappedFieldType.hasDocValues() == false;
this.fieldType = freezeAndDeduplicateFieldType(fieldType); this.fieldType = freezeAndDeduplicateFieldType(fieldType);
@ -442,7 +439,7 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -98,8 +98,7 @@ public class RankFeatureFieldMapper extends FieldMapper {
positiveScoreImpact.getValue(), positiveScoreImpact.getValue(),
nullValue.getValue() nullValue.getValue()
), ),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
positiveScoreImpact.getValue(), positiveScoreImpact.getValue(),
nullValue.getValue() nullValue.getValue()
); );
@ -172,12 +171,11 @@ public class RankFeatureFieldMapper extends FieldMapper {
private RankFeatureFieldMapper( private RankFeatureFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean positiveScoreImpact, boolean positiveScoreImpact,
Float nullValue Float nullValue
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
this.positiveScoreImpact = positiveScoreImpact; this.positiveScoreImpact = positiveScoreImpact;
this.nullValue = nullValue; this.nullValue = nullValue;
} }

View file

@ -66,8 +66,7 @@ public class RankFeaturesFieldMapper extends FieldMapper {
return new RankFeaturesFieldMapper( return new RankFeaturesFieldMapper(
leafName(), leafName(),
new RankFeaturesFieldType(context.buildFullName(leafName()), meta.getValue(), positiveScoreImpact.getValue()), new RankFeaturesFieldType(context.buildFullName(leafName()), meta.getValue(), positiveScoreImpact.getValue()),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
positiveScoreImpact.getValue() positiveScoreImpact.getValue()
); );
} }
@ -122,11 +121,10 @@ public class RankFeaturesFieldMapper extends FieldMapper {
private RankFeaturesFieldMapper( private RankFeaturesFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean positiveScoreImpact boolean positiveScoreImpact
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
this.positiveScoreImpact = positiveScoreImpact; this.positiveScoreImpact = positiveScoreImpact;
} }

View file

@ -197,14 +197,7 @@ public class ScaledFloatFieldMapper extends FieldMapper {
metric.getValue(), metric.getValue(),
indexMode indexMode
); );
return new ScaledFloatFieldMapper( return new ScaledFloatFieldMapper(leafName(), type, builderParams(this, context), context.isSourceSynthetic(), this);
leafName(),
type,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
} }
} }
@ -470,12 +463,11 @@ public class ScaledFloatFieldMapper extends FieldMapper {
private ScaledFloatFieldMapper( private ScaledFloatFieldMapper(
String simpleName, String simpleName,
ScaledFloatFieldType mappedFieldType, ScaledFloatFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean isSourceSynthetic, boolean isSourceSynthetic,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.isSourceSynthetic = isSourceSynthetic; this.isSourceSynthetic = isSourceSynthetic;
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -728,7 +720,7 @@ public class ScaledFloatFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -262,11 +262,10 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
return new SearchAsYouTypeFieldMapper( return new SearchAsYouTypeFieldMapper(
leafName(), leafName(),
ft, ft,
copyTo, builderParams(this, context),
indexAnalyzers, indexAnalyzers,
prefixFieldMapper, prefixFieldMapper,
shingleFieldMappers, shingleFieldMappers,
multiFieldsBuilder.build(this, context),
this this
); );
} }
@ -498,7 +497,7 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
final FieldType fieldType; final FieldType fieldType;
PrefixFieldMapper(FieldType fieldType, PrefixFieldType mappedFieldType) { PrefixFieldMapper(FieldType fieldType, PrefixFieldType mappedFieldType) {
super(mappedFieldType.name(), mappedFieldType, MultiFields.empty(), CopyTo.empty()); super(mappedFieldType.name(), mappedFieldType, BuilderParams.empty());
this.fieldType = Mapper.freezeAndDeduplicateFieldType(fieldType); this.fieldType = Mapper.freezeAndDeduplicateFieldType(fieldType);
} }
@ -537,7 +536,7 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
private final FieldType fieldType; private final FieldType fieldType;
ShingleFieldMapper(FieldType fieldType, ShingleFieldType mappedFieldtype) { ShingleFieldMapper(FieldType fieldType, ShingleFieldType mappedFieldtype) {
super(mappedFieldtype.name(), mappedFieldtype, MultiFields.empty(), CopyTo.empty()); super(mappedFieldtype.name(), mappedFieldtype, BuilderParams.empty());
this.fieldType = freezeAndDeduplicateFieldType(fieldType); this.fieldType = freezeAndDeduplicateFieldType(fieldType);
} }
@ -672,14 +671,13 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
public SearchAsYouTypeFieldMapper( public SearchAsYouTypeFieldMapper(
String simpleName, String simpleName,
SearchAsYouTypeFieldType mappedFieldType, SearchAsYouTypeFieldType mappedFieldType,
CopyTo copyTo, BuilderParams builderParams,
Map<String, NamedAnalyzer> indexAnalyzers, Map<String, NamedAnalyzer> indexAnalyzers,
PrefixFieldMapper prefixField, PrefixFieldMapper prefixField,
ShingleFieldMapper[] shingleFields, ShingleFieldMapper[] shingleFields,
MultiFields multiFields,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
this.prefixField = prefixField; this.prefixField = prefixField;
this.shingleFields = shingleFields; this.shingleFields = shingleFields;
this.maxShingleSize = builder.maxShingleSize.getValue(); this.maxShingleSize = builder.maxShingleSize.getValue();

View file

@ -87,7 +87,7 @@ public class TokenCountFieldMapper extends FieldMapper {
nullValue.getValue(), nullValue.getValue(),
meta.getValue() meta.getValue()
); );
return new TokenCountFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, this); return new TokenCountFieldMapper(leafName(), ft, builderParams(this, context), this);
} }
} }
@ -135,14 +135,8 @@ public class TokenCountFieldMapper extends FieldMapper {
private final boolean enablePositionIncrements; private final boolean enablePositionIncrements;
private final Integer nullValue; private final Integer nullValue;
protected TokenCountFieldMapper( protected TokenCountFieldMapper(String simpleName, MappedFieldType defaultFieldType, BuilderParams builderParams, Builder builder) {
String simpleName, super(simpleName, defaultFieldType, builderParams);
MappedFieldType defaultFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, defaultFieldType, multiFields, copyTo);
this.analyzer = builder.analyzer.getValue(); this.analyzer = builder.analyzer.getValue();
this.enablePositionIncrements = builder.enablePositionIncrements.getValue(); this.enablePositionIncrements = builder.enablePositionIncrements.getValue();
this.nullValue = builder.nullValue.getValue(); this.nullValue = builder.nullValue.getValue();

View file

@ -88,7 +88,7 @@ public final class ParentIdFieldMapper extends FieldMapper {
} }
protected ParentIdFieldMapper(String name, boolean eagerGlobalOrdinals) { protected ParentIdFieldMapper(String name, boolean eagerGlobalOrdinals) {
super(name, new ParentIdFieldType(name, eagerGlobalOrdinals), MultiFields.empty(), CopyTo.empty(), false, null); super(name, new ParentIdFieldType(name, eagerGlobalOrdinals), BuilderParams.empty());
} }
@Override @Override

View file

@ -210,7 +210,7 @@ public final class ParentJoinFieldMapper extends FieldMapper {
boolean eagerGlobalOrdinals, boolean eagerGlobalOrdinals,
List<Relations> relations List<Relations> relations
) { ) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty(), false, null); super(simpleName, mappedFieldType, BuilderParams.empty());
this.parentIdFields = parentIdFields; this.parentIdFields = parentIdFields;
this.eagerGlobalOrdinals = eagerGlobalOrdinals; this.eagerGlobalOrdinals = eagerGlobalOrdinals;
this.relations = relations; this.relations = relations;

View file

@ -137,8 +137,6 @@ public class PercolatorFieldMapper extends FieldMapper {
@Override @Override
public PercolatorFieldMapper build(MapperBuilderContext context) { public PercolatorFieldMapper build(MapperBuilderContext context) {
PercolatorFieldType fieldType = new PercolatorFieldType(context.buildFullName(leafName()), meta.getValue()); PercolatorFieldType fieldType = new PercolatorFieldType(context.buildFullName(leafName()), meta.getValue());
// TODO should percolator even allow multifields?
MultiFields multiFields = multiFieldsBuilder.build(this, context);
context = context.createChildContext(leafName(), null); context = context.createChildContext(leafName(), null);
KeywordFieldMapper extractedTermsField = createExtractQueryFieldBuilder( KeywordFieldMapper extractedTermsField = createExtractQueryFieldBuilder(
EXTRACTED_TERMS_FIELD_NAME, EXTRACTED_TERMS_FIELD_NAME,
@ -165,8 +163,7 @@ public class PercolatorFieldMapper extends FieldMapper {
return new PercolatorFieldMapper( return new PercolatorFieldMapper(
leafName(), leafName(),
fieldType, fieldType,
multiFields, builderParams(this, context),
copyTo,
searchExecutionContext, searchExecutionContext,
extractedTermsField, extractedTermsField,
extractionResultField, extractionResultField,
@ -375,8 +372,7 @@ public class PercolatorFieldMapper extends FieldMapper {
PercolatorFieldMapper( PercolatorFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Supplier<SearchExecutionContext> searchExecutionContext, Supplier<SearchExecutionContext> searchExecutionContext,
KeywordFieldMapper queryTermsField, KeywordFieldMapper queryTermsField,
KeywordFieldMapper extractionResultField, KeywordFieldMapper extractionResultField,
@ -387,7 +383,7 @@ public class PercolatorFieldMapper extends FieldMapper {
IndexVersion indexCreatedVersion, IndexVersion indexCreatedVersion,
Supplier<TransportVersion> clusterTransportVersion Supplier<TransportVersion> clusterTransportVersion
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.searchExecutionContext = searchExecutionContext; this.searchExecutionContext = searchExecutionContext;
this.queryTermsField = queryTermsField; this.queryTermsField = queryTermsField;
this.extractionResultField = extractionResultField; this.extractionResultField = extractionResultField;

View file

@ -336,15 +336,7 @@ public class ICUCollationKeywordFieldMapper extends FieldMapper {
ignoreAbove.getValue(), ignoreAbove.getValue(),
meta.getValue() meta.getValue()
); );
return new ICUCollationKeywordFieldMapper( return new ICUCollationKeywordFieldMapper(leafName(), buildFieldType(), ft, builderParams(this, context), collator, this);
leafName(),
buildFieldType(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
collator,
this
);
} }
} }
@ -474,12 +466,11 @@ public class ICUCollationKeywordFieldMapper extends FieldMapper {
String simpleName, String simpleName,
FieldType fieldType, FieldType fieldType,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Collator collator, Collator collator,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
assert collator.isFrozen(); assert collator.isFrozen();
this.fieldType = freezeAndDeduplicateFieldType(fieldType); this.fieldType = freezeAndDeduplicateFieldType(fieldType);
this.params = builder.collatorParams(); this.params = builder.collatorParams();

View file

@ -150,7 +150,6 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
@Override @Override
public AnnotatedTextFieldMapper build(MapperBuilderContext context) { public AnnotatedTextFieldMapper build(MapperBuilderContext context) {
MultiFields multiFields = multiFieldsBuilder.build(this, context);
FieldType fieldType = TextParams.buildFieldType(() -> true, store, indexOptions, norms, termVectors); FieldType fieldType = TextParams.buildFieldType(() -> true, store, indexOptions, norms, termVectors);
if (fieldType.indexOptions() == IndexOptions.NONE) { if (fieldType.indexOptions() == IndexOptions.NONE) {
throw new IllegalArgumentException("[" + CONTENT_TYPE + "] fields must be indexed"); throw new IllegalArgumentException("[" + CONTENT_TYPE + "] fields must be indexed");
@ -162,12 +161,12 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
); );
} }
} }
BuilderParams builderParams = builderParams(this, context);
return new AnnotatedTextFieldMapper( return new AnnotatedTextFieldMapper(
leafName(), leafName(),
fieldType, fieldType,
buildFieldType(fieldType, context, multiFields), buildFieldType(fieldType, context, builderParams.multiFields()),
multiFields, builderParams,
copyTo,
this this
); );
} }
@ -523,11 +522,10 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
String simpleName, String simpleName,
FieldType fieldType, FieldType fieldType,
AnnotatedTextFieldType mappedFieldType, AnnotatedTextFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
assert fieldType.tokenized(); assert fieldType.tokenized();
this.fieldType = freezeAndDeduplicateFieldType(fieldType); this.fieldType = freezeAndDeduplicateFieldType(fieldType);
this.builder = builder; this.builder = builder;
@ -578,7 +576,7 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -57,8 +57,7 @@ public class Murmur3FieldMapper extends FieldMapper {
return new Murmur3FieldMapper( return new Murmur3FieldMapper(
leafName(), leafName(),
new Murmur3FieldType(context.buildFullName(leafName()), stored.getValue(), meta.getValue()), new Murmur3FieldType(context.buildFullName(leafName()), stored.getValue(), meta.getValue()),
multiFieldsBuilder.build(this, context), builderParams(this, context)
copyTo
); );
} }
} }
@ -94,8 +93,8 @@ public class Murmur3FieldMapper extends FieldMapper {
} }
} }
protected Murmur3FieldMapper(String simpleName, MappedFieldType mappedFieldType, MultiFields multiFields, CopyTo copyTo) { protected Murmur3FieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
} }
@Override @Override

View file

@ -201,32 +201,17 @@ public abstract class AbstractGeometryFieldMapper<T> extends FieldMapper {
protected AbstractGeometryFieldMapper( protected AbstractGeometryFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
BuilderParams builderParams,
Explicit<Boolean> ignoreMalformed, Explicit<Boolean> ignoreMalformed,
Explicit<Boolean> ignoreZValue, Explicit<Boolean> ignoreZValue,
MultiFields multiFields,
CopyTo copyTo,
Parser<T> parser Parser<T> parser
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformed = ignoreMalformed; this.ignoreMalformed = ignoreMalformed;
this.ignoreZValue = ignoreZValue; this.ignoreZValue = ignoreZValue;
this.parser = parser; this.parser = parser;
} }
protected AbstractGeometryFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Parser<T> parser,
OnScriptError onScriptError
) {
super(simpleName, mappedFieldType, multiFields, copyTo, true, onScriptError);
this.ignoreMalformed = Explicit.EXPLICIT_FALSE;
this.ignoreZValue = Explicit.EXPLICIT_FALSE;
this.parser = parser;
}
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public AbstractGeometryFieldType<T> fieldType() { public AbstractGeometryFieldType<T> fieldType() {
@ -252,7 +237,7 @@ public abstract class AbstractGeometryFieldMapper<T> extends FieldMapper {
@Override @Override
public final void parse(DocumentParserContext context) throws IOException { public final void parse(DocumentParserContext context) throws IOException {
if (hasScript) { if (builderParams.hasScript()) {
throw new DocumentParsingException( throw new DocumentParsingException(
context.parser().getTokenLocation(), context.parser().getTokenLocation(),
"failed to parse field [" + fieldType().name() + "] of type + " + contentType() + "]", "failed to parse field [" + fieldType().name() + "] of type + " + contentType() + "]",

View file

@ -40,29 +40,16 @@ public abstract class AbstractPointGeometryFieldMapper<T> extends AbstractGeomet
protected AbstractPointGeometryFieldMapper( protected AbstractPointGeometryFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
Explicit<Boolean> ignoreMalformed, Explicit<Boolean> ignoreMalformed,
Explicit<Boolean> ignoreZValue, Explicit<Boolean> ignoreZValue,
T nullValue, T nullValue,
CopyTo copyTo,
Parser<T> parser Parser<T> parser
) { ) {
super(simpleName, mappedFieldType, ignoreMalformed, ignoreZValue, multiFields, copyTo, parser); super(simpleName, mappedFieldType, builderParams, ignoreMalformed, ignoreZValue, parser);
this.nullValue = nullValue; this.nullValue = nullValue;
} }
protected AbstractPointGeometryFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Parser<T> parser,
OnScriptError onScriptError
) {
super(simpleName, mappedFieldType, multiFields, copyTo, parser, onScriptError);
this.nullValue = null;
}
public T getNullValue() { public T getNullValue() {
return nullValue; return nullValue;
} }

View file

@ -244,7 +244,7 @@ public abstract class AbstractScriptFieldType<LeafFactory> extends MappedFieldTy
).setSerializerCheck((id, ic, v) -> ic); ).setSerializerCheck((id, ic, v) -> ic);
private final FieldMapper.Parameter<OnScriptError> onScriptError = FieldMapper.Parameter.onScriptErrorParam( private final FieldMapper.Parameter<OnScriptError> onScriptError = FieldMapper.Parameter.onScriptErrorParam(
m -> m.onScriptError, m -> m.builderParams.onScriptError(),
script script
); );

View file

@ -76,30 +76,14 @@ public abstract class AbstractShapeGeometryFieldMapper<T> extends AbstractGeomet
protected AbstractShapeGeometryFieldMapper( protected AbstractShapeGeometryFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
BuilderParams builderParams,
Explicit<Boolean> ignoreMalformed, Explicit<Boolean> ignoreMalformed,
Explicit<Boolean> coerce, Explicit<Boolean> coerce,
Explicit<Boolean> ignoreZValue, Explicit<Boolean> ignoreZValue,
Explicit<Orientation> orientation, Explicit<Orientation> orientation,
MultiFields multiFields,
CopyTo copyTo,
Parser<T> parser Parser<T> parser
) { ) {
super(simpleName, mappedFieldType, ignoreMalformed, ignoreZValue, multiFields, copyTo, parser); super(simpleName, mappedFieldType, builderParams, ignoreMalformed, ignoreZValue, parser);
this.coerce = coerce;
this.orientation = orientation;
}
protected AbstractShapeGeometryFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
Explicit<Boolean> coerce,
Explicit<Orientation> orientation,
CopyTo copyTo,
Parser<T> parser,
OnScriptError onScriptError
) {
super(simpleName, mappedFieldType, multiFields, copyTo, parser, onScriptError);
this.coerce = coerce; this.coerce = coerce;
this.orientation = orientation; this.orientation = orientation;
} }

View file

@ -72,8 +72,7 @@ public class BinaryFieldMapper extends FieldMapper {
return new BinaryFieldMapper( return new BinaryFieldMapper(
leafName(), leafName(),
new BinaryFieldType(context.buildFullName(leafName()), stored.getValue(), hasDocValues.getValue(), meta.getValue()), new BinaryFieldType(context.buildFullName(leafName()), stored.getValue(), hasDocValues.getValue(), meta.getValue()),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
this this
); );
} }
@ -142,14 +141,8 @@ public class BinaryFieldMapper extends FieldMapper {
private final boolean hasDocValues; private final boolean hasDocValues;
private final boolean isSyntheticSourceEnabledViaIndexMode; private final boolean isSyntheticSourceEnabledViaIndexMode;
protected BinaryFieldMapper( protected BinaryFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
String simpleName, super(simpleName, mappedFieldType, builderParams);
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
this.stored = builder.stored.getValue(); this.stored = builder.stored.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
this.isSyntheticSourceEnabledViaIndexMode = builder.isSyntheticSourceEnabledViaIndexMode; this.isSyntheticSourceEnabledViaIndexMode = builder.isSyntheticSourceEnabledViaIndexMode;
@ -207,7 +200,7 @@ public class BinaryFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -89,7 +89,10 @@ public class BooleanFieldMapper extends FieldMapper {
).acceptsNull(); ).acceptsNull();
private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script); private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script);
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> toType(m).onScriptError, script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(
m -> toType(m).builderParams.onScriptError(),
script
);
private final Parameter<Map<String, String>> meta = Parameter.metaParam(); private final Parameter<Map<String, String>> meta = Parameter.metaParam();
@ -133,7 +136,16 @@ public class BooleanFieldMapper extends FieldMapper {
@Override @Override
protected Parameter<?>[] getParameters() { protected Parameter<?>[] getParameters() {
return new Parameter<?>[] { meta, docValues, indexed, nullValue, stored, script, onScriptError, ignoreMalformed, dimension }; return new Parameter<?>[] {
meta,
docValues,
indexed,
nullValue,
stored,
script,
onScriptErrorParam,
ignoreMalformed,
dimension };
} }
@Override @Override
@ -151,14 +163,9 @@ public class BooleanFieldMapper extends FieldMapper {
meta.getValue(), meta.getValue(),
dimension.getValue() dimension.getValue()
); );
return new BooleanFieldMapper( hasScript = script.get() != null;
leafName(), onScriptError = onScriptErrorParam.getValue();
ft, return new BooleanFieldMapper(leafName(), ft, builderParams(this, context), context.isSourceSynthetic(), this);
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
} }
private FieldValues<Boolean> scriptValues() { private FieldValues<Boolean> scriptValues() {
@ -427,12 +434,11 @@ public class BooleanFieldMapper extends FieldMapper {
protected BooleanFieldMapper( protected BooleanFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean storeMalformedFields, boolean storeMalformedFields,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.getValue()); super(simpleName, mappedFieldType, builderParams);
this.nullValue = builder.nullValue.getValue(); this.nullValue = builder.nullValue.getValue();
this.stored = builder.stored.getValue(); this.stored = builder.stored.getValue();
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
@ -561,7 +567,7 @@ public class BooleanFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -207,7 +207,7 @@ public class CompletionFieldMapper extends FieldMapper {
CompletionFieldType ft = new CompletionFieldType(context.buildFullName(leafName()), completionAnalyzer, meta.getValue()); CompletionFieldType ft = new CompletionFieldType(context.buildFullName(leafName()), completionAnalyzer, meta.getValue());
ft.setContextMappings(contexts.getValue()); ft.setContextMappings(contexts.getValue());
return new CompletionFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, this); return new CompletionFieldMapper(leafName(), ft, builderParams(this, context), this);
} }
private void checkCompletionContextsLimit() { private void checkCompletionContextsLimit() {
@ -346,14 +346,8 @@ public class CompletionFieldMapper extends FieldMapper {
private final NamedAnalyzer indexAnalyzer; private final NamedAnalyzer indexAnalyzer;
public CompletionFieldMapper( public CompletionFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
String simpleName, super(simpleName, mappedFieldType, builderParams);
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
this.builder = builder; this.builder = builder;
this.maxInputLength = builder.maxInputLength.getValue(); this.maxInputLength = builder.maxInputLength.getValue();
this.indexAnalyzer = builder.buildAnalyzer(); this.indexAnalyzer = builder.buildAnalyzer();
@ -443,7 +437,7 @@ public class CompletionFieldMapper extends FieldMapper {
context.addToFieldNames(fieldType().name()); context.addToFieldNames(fieldType().name());
for (CompletionInputMetadata metadata : inputMap.values()) { for (CompletionInputMetadata metadata : inputMap.values()) {
multiFields.parse( multiFields().parse(
this, this,
context, context,
() -> context.switchParser(new MultiFieldParser(metadata, fieldType().name(), context.parser().getTokenLocation())) () -> context.switchParser(new MultiFieldParser(metadata, fieldType().name(), context.parser().getTokenLocation()))

View file

@ -48,7 +48,7 @@ public class CompositeRuntimeField implements RuntimeField {
}); });
private final FieldMapper.Parameter<OnScriptError> onScriptError = FieldMapper.Parameter.onScriptErrorParam( private final FieldMapper.Parameter<OnScriptError> onScriptError = FieldMapper.Parameter.onScriptErrorParam(
m -> m.onScriptError, m -> m.builderParams.onScriptError(),
script script
); );

View file

@ -247,7 +247,10 @@ public final class DateFieldMapper extends FieldMapper {
private final Parameter<Boolean> ignoreMalformed; private final Parameter<Boolean> ignoreMalformed;
private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script); private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script);
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> toType(m).onScriptError, script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(
m -> toType(m).builderParams.onScriptError(),
script
);
private final Resolution resolution; private final Resolution resolution;
private final IndexVersion indexCreatedVersion; private final IndexVersion indexCreatedVersion;
@ -316,7 +319,17 @@ public final class DateFieldMapper extends FieldMapper {
@Override @Override
protected Parameter<?>[] getParameters() { protected Parameter<?>[] getParameters() {
return new Parameter<?>[] { index, docValues, store, format, locale, nullValue, ignoreMalformed, script, onScriptError, meta }; return new Parameter<?>[] {
index,
docValues,
store,
format,
locale,
nullValue,
ignoreMalformed,
script,
onScriptErrorParam,
meta };
} }
private Long parseNullValue(DateFieldType fieldType) { private Long parseNullValue(DateFieldType fieldType) {
@ -364,12 +377,12 @@ public final class DateFieldMapper extends FieldMapper {
&& ignoreMalformed.isConfigured() == false) { && ignoreMalformed.isConfigured() == false) {
ignoreMalformed.setValue(false); ignoreMalformed.setValue(false);
} }
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.get();
return new DateFieldMapper( return new DateFieldMapper(
leafName(), leafName(),
ft, ft,
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
nullTimestamp, nullTimestamp,
resolution, resolution,
context.isSourceSynthetic(), context.isSourceSynthetic(),
@ -874,14 +887,13 @@ public final class DateFieldMapper extends FieldMapper {
private DateFieldMapper( private DateFieldMapper(
String leafName, String leafName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Long nullValue, Long nullValue,
Resolution resolution, Resolution resolution,
boolean isSourceSynthetic, boolean isSourceSynthetic,
Builder builder Builder builder
) { ) {
super(leafName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.get()); super(leafName, mappedFieldType, builderParams);
this.store = builder.store.getValue(); this.store = builder.store.getValue();
this.indexed = builder.index.getValue(); this.indexed = builder.index.getValue();
this.hasDocValues = builder.docValues.getValue(); this.hasDocValues = builder.docValues.getValue();
@ -998,7 +1010,7 @@ public final class DateFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (hasScript) { if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING; return SourceLoader.SyntheticFieldLoader.NOTHING;
} }
if (hasDocValues == false) { if (hasDocValues == false) {
@ -1010,7 +1022,7 @@ public final class DateFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -925,8 +925,7 @@ public final class DocumentParser {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
}, },
FieldMapper.MultiFields.empty(), FieldMapper.BuilderParams.empty()
FieldMapper.CopyTo.empty()
) { ) {
@Override @Override

View file

@ -45,6 +45,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@ -75,46 +76,42 @@ public abstract class FieldMapper extends Mapper {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
static final Parameter<?>[] EMPTY_PARAMETERS = new Parameter[0]; static final Parameter<?>[] EMPTY_PARAMETERS = new Parameter[0];
protected final MappedFieldType mappedFieldType;
protected final MultiFields multiFields;
protected final CopyTo copyTo;
protected final boolean hasScript;
protected final OnScriptError onScriptError;
/** /**
* @param simpleName the leaf name of the mapper
* @param mappedFieldType the MappedFieldType associated with this mapper
* @param multiFields sub fields of this mapper
* @param copyTo copyTo fields of this mapper
*/
protected FieldMapper(String simpleName, MappedFieldType mappedFieldType, MultiFields multiFields, CopyTo copyTo) {
this(simpleName, mappedFieldType, multiFields, copyTo, false, null);
}
/**
* @param simpleName the leaf name of the mapper
* @param mappedFieldType the MappedFieldType associated with this mapper
* @param multiFields sub fields of this mapper * @param multiFields sub fields of this mapper
* @param copyTo copyTo fields of this mapper * @param copyTo copyTo fields of this mapper
* @param sourceKeepMode mode for storing the field source in synthetic source mode
* @param hasScript whether a script is defined for the field * @param hasScript whether a script is defined for the field
* @param onScriptError the behaviour for when the defined script fails at runtime * @param onScriptError the behaviour for when the defined script fails at runtime
*/ */
protected FieldMapper( protected record BuilderParams(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields, MultiFields multiFields,
CopyTo copyTo, CopyTo copyTo,
Optional<SourceKeepMode> sourceKeepMode,
boolean hasScript, boolean hasScript,
OnScriptError onScriptError OnScriptError onScriptError
) { ) {
public static BuilderParams empty() {
return empty;
}
private static final BuilderParams empty = new BuilderParams(MultiFields.empty(), CopyTo.empty(), Optional.empty(), false, null);
}
protected final MappedFieldType mappedFieldType;
protected final BuilderParams builderParams;
/**
* @param simpleName the leaf name of the mapper
* @param params initialization params for this field mapper
*/
protected FieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams params) {
super(simpleName); super(simpleName);
this.mappedFieldType = mappedFieldType;
this.builderParams = params;
// could be blank but not empty on indices created < 8.6.0 // could be blank but not empty on indices created < 8.6.0
assert mappedFieldType.name().isEmpty() == false; assert mappedFieldType.name().isEmpty() == false;
this.mappedFieldType = mappedFieldType; assert params.copyTo != null;
this.multiFields = multiFields;
this.copyTo = Objects.requireNonNull(copyTo);
this.hasScript = hasScript;
this.onScriptError = onScriptError;
} }
@Override @Override
@ -135,11 +132,15 @@ public abstract class FieldMapper extends Mapper {
* List of fields where this field should be copied to * List of fields where this field should be copied to
*/ */
public CopyTo copyTo() { public CopyTo copyTo() {
return copyTo; return builderParams.copyTo;
} }
public MultiFields multiFields() { public MultiFields multiFields() {
return multiFields; return builderParams.multiFields;
}
public Optional<SourceKeepMode> sourceKeepMode() {
return builderParams.sourceKeepMode;
} }
/** /**
@ -178,7 +179,7 @@ public abstract class FieldMapper extends Mapper {
*/ */
public void parse(DocumentParserContext context) throws IOException { public void parse(DocumentParserContext context) throws IOException {
try { try {
if (hasScript) { if (builderParams.hasScript) {
throwIndexingWithScriptParam(); throwIndexingWithScriptParam();
} }
@ -188,14 +189,14 @@ public abstract class FieldMapper extends Mapper {
} }
// TODO: multi fields are really just copy fields, we just need to expose "sub fields" or something that can be part // TODO: multi fields are really just copy fields, we just need to expose "sub fields" or something that can be part
// of the mappings // of the mappings
if (multiFields.mappers.length != 0) { if (builderParams.multiFields.mappers.length != 0) {
doParseMultiFields(context); doParseMultiFields(context);
} }
} }
private void doParseMultiFields(DocumentParserContext context) throws IOException { private void doParseMultiFields(DocumentParserContext context) throws IOException {
context.path().add(leafName()); context.path().add(leafName());
for (FieldMapper mapper : multiFields.mappers) { for (FieldMapper mapper : builderParams.multiFields.mappers) {
mapper.parse(context); mapper.parse(context);
} }
context.path().remove(); context.path().remove();
@ -255,7 +256,7 @@ public abstract class FieldMapper extends Mapper {
* @return whether this field mapper uses a script to generate its values * @return whether this field mapper uses a script to generate its values
*/ */
public final boolean hasScript() { public final boolean hasScript() {
return hasScript; return builderParams.hasScript;
} }
/** /**
@ -276,7 +277,7 @@ public abstract class FieldMapper extends Mapper {
try { try {
indexScriptValues(searchLookup, readerContext, doc, documentParserContext); indexScriptValues(searchLookup, readerContext, doc, documentParserContext);
} catch (Exception e) { } catch (Exception e) {
if (onScriptError == OnScriptError.CONTINUE) { if (builderParams.onScriptError == OnScriptError.CONTINUE) {
documentParserContext.addIgnoredField(fullPath()); documentParserContext.addIgnoredField(fullPath());
} else { } else {
throw new DocumentParsingException(XContentLocation.UNKNOWN, "Error executing script on field [" + fullPath() + "]", e); throw new DocumentParsingException(XContentLocation.UNKNOWN, "Error executing script on field [" + fullPath() + "]", e);
@ -308,7 +309,7 @@ public abstract class FieldMapper extends Mapper {
} }
protected Iterator<Mapper> multiFieldsIterator() { protected Iterator<Mapper> multiFieldsIterator() {
return Iterators.forArray(multiFields.mappers); return Iterators.forArray(builderParams.multiFields.mappers);
} }
/** /**
@ -424,15 +425,18 @@ public abstract class FieldMapper extends Mapper {
protected void doXContentBody(XContentBuilder builder, Params params) throws IOException { protected void doXContentBody(XContentBuilder builder, Params params) throws IOException {
builder.field("type", contentType()); builder.field("type", contentType());
getMergeBuilder().toXContent(builder, params); getMergeBuilder().toXContent(builder, params);
multiFields.toXContent(builder, params); builderParams.multiFields.toXContent(builder, params);
copyTo.toXContent(builder); builderParams.copyTo.toXContent(builder);
if (builderParams.sourceKeepMode.isPresent()) {
builderParams.sourceKeepMode.get().toXContent(builder);
}
} }
protected abstract String contentType(); protected abstract String contentType();
@Override @Override
public int getTotalFieldsCount() { public int getTotalFieldsCount() {
return 1 + Stream.of(multiFields.mappers).mapToInt(FieldMapper::getTotalFieldsCount).sum(); return 1 + Stream.of(builderParams.multiFields.mappers).mapToInt(FieldMapper::getTotalFieldsCount).sum();
} }
public Map<String, NamedAnalyzer> indexAnalyzers() { public Map<String, NamedAnalyzer> indexAnalyzers() {
@ -487,7 +491,7 @@ public abstract class FieldMapper extends Mapper {
// If mapper supports synthetic source natively, it overrides this method, // If mapper supports synthetic source natively, it overrides this method,
// so we won't see those here. // so we won't see those here.
if (syntheticSourceMode() == SyntheticSourceMode.FALLBACK) { if (syntheticSourceMode() == SyntheticSourceMode.FALLBACK) {
if (copyTo.copyToFields().isEmpty() != true) { if (builderParams.copyTo.copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );
@ -1289,6 +1293,9 @@ public abstract class FieldMapper extends Mapper {
protected final MultiFields.Builder multiFieldsBuilder = new MultiFields.Builder(); protected final MultiFields.Builder multiFieldsBuilder = new MultiFields.Builder();
protected CopyTo copyTo = CopyTo.EMPTY; protected CopyTo copyTo = CopyTo.EMPTY;
protected Optional<SourceKeepMode> sourceKeepMode = Optional.empty();
protected boolean hasScript = false;
protected OnScriptError onScriptError = null;
/** /**
* Creates a new Builder with a field name * Creates a new Builder with a field name
@ -1304,21 +1311,26 @@ public abstract class FieldMapper extends Mapper {
for (Parameter<?> param : getParameters()) { for (Parameter<?> param : getParameters()) {
param.init(initializer); param.init(initializer);
} }
for (FieldMapper subField : initializer.multiFields.mappers) { for (FieldMapper subField : initializer.builderParams.multiFields.mappers) {
multiFieldsBuilder.add(subField); multiFieldsBuilder.add(subField);
} }
return this; return this;
} }
protected BuilderParams builderParams(Mapper.Builder mainFieldBuilder, MapperBuilderContext context) {
return new BuilderParams(multiFieldsBuilder.build(mainFieldBuilder, context), copyTo, sourceKeepMode, hasScript, onScriptError);
}
protected void merge(FieldMapper in, Conflicts conflicts, MapperMergeContext mapperMergeContext) { protected void merge(FieldMapper in, Conflicts conflicts, MapperMergeContext mapperMergeContext) {
for (Parameter<?> param : getParameters()) { for (Parameter<?> param : getParameters()) {
param.merge(in, conflicts); param.merge(in, conflicts);
} }
MapperMergeContext childContext = mapperMergeContext.createChildContext(in.leafName(), null); MapperMergeContext childContext = mapperMergeContext.createChildContext(in.leafName(), null);
for (FieldMapper newSubField : in.multiFields.mappers) { for (FieldMapper newSubField : in.builderParams.multiFields.mappers) {
multiFieldsBuilder.update(newSubField, childContext); multiFieldsBuilder.update(newSubField, childContext);
} }
this.copyTo = in.copyTo; this.copyTo = in.builderParams.copyTo;
this.sourceKeepMode = in.builderParams.sourceKeepMode;
validate(); validate();
} }
@ -1413,6 +1425,11 @@ public abstract class FieldMapper extends Mapper {
iterator.remove(); iterator.remove();
continue; continue;
} }
case SYNTHETIC_SOURCE_KEEP_PARAM -> {
sourceKeepMode = Optional.of(SourceKeepMode.from(XContentMapValues.nodeStringValue(propNode)));
iterator.remove();
continue;
}
} }
Parameter<?> parameter = deprecatedParamsMap.get(propName); Parameter<?> parameter = deprecatedParamsMap.get(propName);
if (parameter != null) { if (parameter != null) {

View file

@ -87,7 +87,10 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
final Parameter<Boolean> hasDocValues = Parameter.docValuesParam(m -> builder(m).hasDocValues.get(), true); final Parameter<Boolean> hasDocValues = Parameter.docValuesParam(m -> builder(m).hasDocValues.get(), true);
final Parameter<Boolean> stored = Parameter.storeParam(m -> builder(m).stored.get(), false); final Parameter<Boolean> stored = Parameter.storeParam(m -> builder(m).stored.get(), false);
private final Parameter<Script> script = Parameter.scriptParam(m -> builder(m).script.get()); private final Parameter<Script> script = Parameter.scriptParam(m -> builder(m).script.get());
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> builder(m).onScriptError.get(), script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(
m -> builder(m).onScriptErrorParam.get(),
script
);
final Parameter<Map<String, String>> meta = Parameter.metaParam(); final Parameter<Map<String, String>> meta = Parameter.metaParam();
private final ScriptCompiler scriptCompiler; private final ScriptCompiler scriptCompiler;
@ -152,7 +155,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
ignoreZValue, ignoreZValue,
nullValue, nullValue,
script, script,
onScriptError, onScriptErrorParam,
meta, meta,
dimension, dimension,
metric }; metric };
@ -217,10 +220,9 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
metric.get(), metric.get(),
indexMode indexMode
); );
if (this.script.get() == null) { hasScript = script.get() != null;
return new GeoPointFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, geoParser, this); onScriptError = onScriptErrorParam.get();
} return new GeoPointFieldMapper(leafName(), ft, builderParams(this, context), geoParser, this);
return new GeoPointFieldMapper(leafName(), ft, geoParser, this);
} }
} }
@ -248,32 +250,20 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
public GeoPointFieldMapper( public GeoPointFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Parser<GeoPoint> parser, Parser<GeoPoint> parser,
Builder builder Builder builder
) { ) {
super( super(
simpleName, simpleName,
mappedFieldType, mappedFieldType,
multiFields, builderParams,
builder.ignoreMalformed.get(), builder.ignoreMalformed.get(),
builder.ignoreZValue.get(), builder.ignoreZValue.get(),
builder.nullValue.get(), builder.nullValue.get(),
copyTo,
parser parser
); );
this.builder = builder; this.builder = builder;
this.scriptValues = null;
this.indexCreatedVersion = builder.indexCreatedVersion;
this.metricType = builder.metric.get();
this.indexMode = builder.indexMode;
this.indexed = builder.indexed.get();
}
public GeoPointFieldMapper(String simpleName, MappedFieldType mappedFieldType, Parser<GeoPoint> parser, Builder builder) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty(), parser, builder.onScriptError.get());
this.builder = builder;
this.scriptValues = builder.scriptValues(); this.scriptValues = builder.scriptValues();
this.indexCreatedVersion = builder.indexCreatedVersion; this.indexCreatedVersion = builder.indexCreatedVersion;
this.metricType = builder.metric.get(); this.metricType = builder.metric.get();
@ -308,7 +298,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
// TODO phase out geohash (which is currently used in the CompletionSuggester) // TODO phase out geohash (which is currently used in the CompletionSuggester)
// we only expose the geohash value and disallow advancing tokens, hence we can reuse the same parser throughout multiple sub-fields // we only expose the geohash value and disallow advancing tokens, hence we can reuse the same parser throughout multiple sub-fields
DocumentParserContext parserContext = context.switchParser(new GeoHashMultiFieldParser(context.parser(), geometry.geohash())); DocumentParserContext parserContext = context.switchParser(new GeoHashMultiFieldParser(context.parser(), geometry.geohash()));
multiFields.parse(this, context, () -> parserContext); multiFields().parse(this, context, () -> parserContext);
} }
/** /**
@ -635,7 +625,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -81,7 +81,10 @@ public class IpFieldMapper extends FieldMapper {
.acceptsNull(); .acceptsNull();
private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script); private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script);
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> toType(m).onScriptError, script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(
m -> toType(m).builderParams.onScriptError(),
script
);
private final Parameter<Map<String, String>> meta = Parameter.metaParam(); private final Parameter<Map<String, String>> meta = Parameter.metaParam();
private final Parameter<Boolean> dimension; private final Parameter<Boolean> dimension;
@ -162,7 +165,16 @@ public class IpFieldMapper extends FieldMapper {
@Override @Override
protected Parameter<?>[] getParameters() { protected Parameter<?>[] getParameters() {
return new Parameter<?>[] { indexed, hasDocValues, stored, ignoreMalformed, nullValue, script, onScriptError, meta, dimension }; return new Parameter<?>[] {
indexed,
hasDocValues,
stored,
ignoreMalformed,
nullValue,
script,
onScriptErrorParam,
meta,
dimension };
} }
@Override @Override
@ -170,6 +182,8 @@ public class IpFieldMapper extends FieldMapper {
if (inheritDimensionParameterFromParentObject(context)) { if (inheritDimensionParameterFromParentObject(context)) {
dimension.setValue(true); dimension.setValue(true);
} }
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.getValue();
return new IpFieldMapper( return new IpFieldMapper(
leafName(), leafName(),
new IpFieldType( new IpFieldType(
@ -182,8 +196,7 @@ public class IpFieldMapper extends FieldMapper {
meta.getValue(), meta.getValue(),
dimension.getValue() dimension.getValue()
), ),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
context.isSourceSynthetic(), context.isSourceSynthetic(),
this this
); );
@ -494,12 +507,11 @@ public class IpFieldMapper extends FieldMapper {
private IpFieldMapper( private IpFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean storeIgnored, boolean storeIgnored,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.get()); super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformedByDefault = builder.ignoreMalformedByDefault; this.ignoreMalformedByDefault = builder.ignoreMalformedByDefault;
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -621,7 +633,7 @@ public class IpFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -182,7 +182,10 @@ public final class KeywordFieldMapper extends FieldMapper {
private final Parameter<Map<String, String>> meta = Parameter.metaParam(); private final Parameter<Map<String, String>> meta = Parameter.metaParam();
private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script); private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script);
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> toType(m).onScriptError, script); private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(
m -> toType(m).builderParams.onScriptError(),
script
);
private final Parameter<Boolean> dimension; private final Parameter<Boolean> dimension;
private final IndexAnalyzers indexAnalyzers; private final IndexAnalyzers indexAnalyzers;
@ -351,12 +354,13 @@ public final class KeywordFieldMapper extends FieldMapper {
// deduplicate in the common default case to save some memory // deduplicate in the common default case to save some memory
fieldtype = Defaults.FIELD_TYPE; fieldtype = Defaults.FIELD_TYPE;
} }
super.hasScript = script.get() != null;
super.onScriptError = onScriptError.getValue();
return new KeywordFieldMapper( return new KeywordFieldMapper(
leafName(), leafName(),
fieldtype, fieldtype,
buildFieldType(context, fieldtype), buildFieldType(context, fieldtype),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
context.isSourceSynthetic(), context.isSourceSynthetic(),
this this
); );
@ -865,12 +869,11 @@ public final class KeywordFieldMapper extends FieldMapper {
String simpleName, String simpleName,
FieldType fieldType, FieldType fieldType,
KeywordFieldType mappedFieldType, KeywordFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean isSyntheticSource, boolean isSyntheticSource,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.getValue()); super(simpleName, mappedFieldType, builderParams);
assert fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) <= 0; assert fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) <= 0;
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -1048,7 +1051,7 @@ public final class KeywordFieldMapper extends FieldMapper {
if (hasScript()) { if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING; return SourceLoader.SyntheticFieldLoader.NOTHING;
} }
if (copyTo.copyToFields().isEmpty() != true) { if (builderParams.copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -16,7 +16,10 @@ import org.elasticsearch.features.NodeFeature;
import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.index.IndexVersions; import org.elasticsearch.index.IndexVersions;
import org.elasticsearch.xcontent.ToXContentFragment; import org.elasticsearch.xcontent.ToXContentFragment;
import org.elasticsearch.xcontent.XContentBuilder;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -39,6 +42,9 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
} }
static SourceKeepMode from(String input) { static SourceKeepMode from(String input) {
if (input == null) {
input = "null";
}
if (input.equals(NONE.name)) { if (input.equals(NONE.name)) {
return NONE; return NONE;
} }
@ -48,7 +54,15 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
if (input.equals(ARRAYS.name)) { if (input.equals(ARRAYS.name)) {
return ARRAYS; return ARRAYS;
} }
throw new IllegalArgumentException("Unknown " + SYNTHETIC_SOURCE_KEEP_PARAM + " value [" + input + "]"); throw new IllegalArgumentException(
"Unknown "
+ SYNTHETIC_SOURCE_KEEP_PARAM
+ " value ["
+ input
+ "], accepted values are ["
+ String.join(",", Arrays.stream(SourceKeepMode.values()).map(SourceKeepMode::toString).toList())
+ "]"
);
} }
@Override @Override
@ -56,6 +70,10 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
return name; return name;
} }
public void toXContent(XContentBuilder builder) throws IOException {
builder.field(SYNTHETIC_SOURCE_KEEP_PARAM, name);
}
private final String name; private final String name;
} }

View file

@ -174,7 +174,7 @@ public abstract class MetadataFieldMapper extends FieldMapper {
} }
protected MetadataFieldMapper(MappedFieldType mappedFieldType) { protected MetadataFieldMapper(MappedFieldType mappedFieldType) {
super(mappedFieldType.name(), mappedFieldType, MultiFields.empty(), CopyTo.empty(), false, null); super(mappedFieldType.name(), mappedFieldType, BuilderParams.empty());
} }
@Override @Override

View file

@ -100,7 +100,10 @@ public class NumberFieldMapper extends FieldMapper {
private final Parameter<Number> nullValue; private final Parameter<Number> nullValue;
private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script); private final Parameter<Script> script = Parameter.scriptParam(m -> toType(m).script);
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> toType(m).onScriptError, script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(
m -> toType(m).builderParams.onScriptError(),
script
);
/** /**
* Parameter that marks this field as a time series dimension. * Parameter that marks this field as a time series dimension.
@ -253,7 +256,7 @@ public class NumberFieldMapper extends FieldMapper {
coerce, coerce,
nullValue, nullValue,
script, script,
onScriptError, onScriptErrorParam,
meta, meta,
dimension, dimension,
metric }; metric };
@ -266,14 +269,9 @@ public class NumberFieldMapper extends FieldMapper {
} }
MappedFieldType ft = new NumberFieldType(context.buildFullName(leafName()), this); MappedFieldType ft = new NumberFieldType(context.buildFullName(leafName()), this);
return new NumberFieldMapper( hasScript = script.get() != null;
leafName(), onScriptError = onScriptErrorParam.getValue();
ft, return new NumberFieldMapper(leafName(), ft, builderParams(this, context), context.isSourceSynthetic(), this);
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
} }
} }
@ -1841,12 +1839,11 @@ public class NumberFieldMapper extends FieldMapper {
private NumberFieldMapper( private NumberFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean storeMalformedFields, boolean storeMalformedFields,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.getValue()); super(simpleName, mappedFieldType, builderParams);
this.type = builder.type; this.type = builder.type;
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -2000,7 +1997,7 @@ public class NumberFieldMapper extends FieldMapper {
if (hasScript()) { if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING; return SourceLoader.SyntheticFieldLoader.NOTHING;
} }
if (copyTo.copyToFields().isEmpty() != true) { if (builderParams.copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -91,7 +91,7 @@ public class PlaceHolderFieldMapper extends FieldMapper {
@Override @Override
public PlaceHolderFieldMapper build(MapperBuilderContext context) { public PlaceHolderFieldMapper build(MapperBuilderContext context) {
PlaceHolderFieldType mappedFieldType = new PlaceHolderFieldType(context.buildFullName(leafName()), type, Map.of()); PlaceHolderFieldType mappedFieldType = new PlaceHolderFieldType(context.buildFullName(leafName()), type, Map.of());
return new PlaceHolderFieldMapper(leafName(), mappedFieldType, multiFieldsBuilder.build(this, context), copyTo, unknownParams); return new PlaceHolderFieldMapper(leafName(), mappedFieldType, builderParams(this, context), unknownParams);
} }
} }
@ -262,11 +262,10 @@ public class PlaceHolderFieldMapper extends FieldMapper {
public PlaceHolderFieldMapper( public PlaceHolderFieldMapper(
String simpleName, String simpleName,
PlaceHolderFieldType fieldType, PlaceHolderFieldType fieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Map<String, Object> unknownParams Map<String, Object> unknownParams
) { ) {
super(simpleName, fieldType, multiFields, copyTo); super(simpleName, fieldType, builderParams);
this.unknownParams.putAll(unknownParams); this.unknownParams.putAll(unknownParams);
} }

View file

@ -167,7 +167,7 @@ public class RangeFieldMapper extends FieldMapper {
@Override @Override
public RangeFieldMapper build(MapperBuilderContext context) { public RangeFieldMapper build(MapperBuilderContext context) {
RangeFieldType ft = setupFieldType(context); RangeFieldType ft = setupFieldType(context);
return new RangeFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, type, this); return new RangeFieldMapper(leafName(), ft, builderParams(this, context), type, this);
} }
} }
@ -342,12 +342,11 @@ public class RangeFieldMapper extends FieldMapper {
private RangeFieldMapper( private RangeFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
RangeType type, RangeType type,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.type = type; this.type = type;
this.index = builder.index.getValue(); this.index = builder.index.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -478,7 +477,7 @@ public class RangeFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -463,7 +463,6 @@ public final class TextFieldMapper extends FieldMapper {
@Override @Override
public TextFieldMapper build(MapperBuilderContext context) { public TextFieldMapper build(MapperBuilderContext context) {
MultiFields multiFields = multiFieldsBuilder.build(this, context);
FieldType fieldType = TextParams.buildFieldType( FieldType fieldType = TextParams.buildFieldType(
index, index,
store, store,
@ -472,15 +471,16 @@ public final class TextFieldMapper extends FieldMapper {
indexCreatedVersion.isLegacyIndexVersion() ? () -> false : norms, indexCreatedVersion.isLegacyIndexVersion() ? () -> false : norms,
termVectors termVectors
); );
TextFieldType tft = buildFieldType(fieldType, multiFields, context, indexCreatedVersion); BuilderParams builderParams = builderParams(this, context);
TextFieldType tft = buildFieldType(fieldType, builderParams.multiFields(), context, indexCreatedVersion);
SubFieldInfo phraseFieldInfo = buildPhraseInfo(fieldType, tft); SubFieldInfo phraseFieldInfo = buildPhraseInfo(fieldType, tft);
SubFieldInfo prefixFieldInfo = buildPrefixInfo(context, fieldType, tft); SubFieldInfo prefixFieldInfo = buildPrefixInfo(context, fieldType, tft);
for (Mapper mapper : multiFields) { for (Mapper mapper : builderParams.multiFields()) {
if (mapper.fullPath().endsWith(FAST_PHRASE_SUFFIX) || mapper.fullPath().endsWith(FAST_PREFIX_SUFFIX)) { if (mapper.fullPath().endsWith(FAST_PHRASE_SUFFIX) || mapper.fullPath().endsWith(FAST_PREFIX_SUFFIX)) {
throw new MapperParsingException("Cannot use reserved field name [" + mapper.fullPath() + "]"); throw new MapperParsingException("Cannot use reserved field name [" + mapper.fullPath() + "]");
} }
} }
return new TextFieldMapper(leafName(), fieldType, tft, prefixFieldInfo, phraseFieldInfo, multiFields, copyTo, this); return new TextFieldMapper(leafName(), fieldType, tft, prefixFieldInfo, phraseFieldInfo, builderParams, this);
} }
} }
@ -1215,11 +1215,10 @@ public final class TextFieldMapper extends FieldMapper {
TextFieldType mappedFieldType, TextFieldType mappedFieldType,
SubFieldInfo prefixFieldInfo, SubFieldInfo prefixFieldInfo,
SubFieldInfo phraseFieldInfo, SubFieldInfo phraseFieldInfo,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
assert mappedFieldType.getTextSearchInfo().isTokenized(); assert mappedFieldType.getTextSearchInfo().isTokenized();
assert mappedFieldType.hasDocValues() == false; assert mappedFieldType.hasDocValues() == false;
if (fieldType.indexOptions() == IndexOptions.NONE && fieldType().fielddata()) { if (fieldType.indexOptions() == IndexOptions.NONE && fieldType().fielddata()) {
@ -1428,8 +1427,11 @@ public final class TextFieldMapper extends FieldMapper {
final Builder b = (Builder) getMergeBuilder(); final Builder b = (Builder) getMergeBuilder();
b.index.toXContent(builder, includeDefaults); b.index.toXContent(builder, includeDefaults);
b.store.toXContent(builder, includeDefaults); b.store.toXContent(builder, includeDefaults);
this.multiFields.toXContent(builder, params); multiFields().toXContent(builder, params);
this.copyTo.toXContent(builder); copyTo().toXContent(builder);
if (sourceKeepMode().isPresent()) {
sourceKeepMode().get().toXContent(builder);
}
b.meta.toXContent(builder, includeDefaults); b.meta.toXContent(builder, includeDefaults);
b.indexOptions.toXContent(builder, includeDefaults); b.indexOptions.toXContent(builder, includeDefaults);
b.termVectors.toXContent(builder, includeDefaults); b.termVectors.toXContent(builder, includeDefaults);
@ -1453,7 +1455,7 @@ public final class TextFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -216,7 +216,7 @@ public final class FlattenedFieldMapper extends FieldMapper {
eagerGlobalOrdinals.get(), eagerGlobalOrdinals.get(),
dimensions.get() dimensions.get()
); );
return new FlattenedFieldMapper(leafName(), ft, this); return new FlattenedFieldMapper(leafName(), ft, builderParams(this, context), this);
} }
} }
@ -737,8 +737,8 @@ public final class FlattenedFieldMapper extends FieldMapper {
private final FlattenedFieldParser fieldParser; private final FlattenedFieldParser fieldParser;
private final Builder builder; private final Builder builder;
private FlattenedFieldMapper(String leafName, MappedFieldType mappedFieldType, Builder builder) { private FlattenedFieldMapper(String leafName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
super(leafName, mappedFieldType, MultiFields.empty(), CopyTo.empty()); super(leafName, mappedFieldType, builderParams);
this.builder = builder; this.builder = builder;
this.fieldParser = new FlattenedFieldParser( this.fieldParser = new FlattenedFieldParser(
mappedFieldType.name(), mappedFieldType.name(),

View file

@ -297,10 +297,9 @@ public class DenseVectorFieldMapper extends FieldMapper {
indexOptions.getValue(), indexOptions.getValue(),
meta.getValue() meta.getValue()
), ),
builderParams(this, context),
indexOptions.getValue(), indexOptions.getValue(),
indexVersionCreated, indexVersionCreated
multiFieldsBuilder.build(this, context),
copyTo
); );
} }
} }
@ -1963,12 +1962,11 @@ public class DenseVectorFieldMapper extends FieldMapper {
private DenseVectorFieldMapper( private DenseVectorFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
BuilderParams params,
IndexOptions indexOptions, IndexOptions indexOptions,
IndexVersion indexCreatedVersion, IndexVersion indexCreatedVersion
MultiFields multiFields,
CopyTo copyTo
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, params);
this.indexOptions = indexOptions; this.indexOptions = indexOptions;
this.indexCreatedVersion = indexCreatedVersion; this.indexCreatedVersion = indexCreatedVersion;
} }
@ -2015,10 +2013,9 @@ public class DenseVectorFieldMapper extends FieldMapper {
Mapper update = new DenseVectorFieldMapper( Mapper update = new DenseVectorFieldMapper(
leafName(), leafName(),
updatedDenseVectorFieldType, updatedDenseVectorFieldType,
builderParams,
indexOptions, indexOptions,
indexCreatedVersion, indexCreatedVersion
multiFields(),
copyTo
); );
context.addDynamicMapper(update); context.addDynamicMapper(update);
return; return;
@ -2162,7 +2159,7 @@ public class DenseVectorFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -69,8 +69,7 @@ public class SparseVectorFieldMapper extends FieldMapper {
return new SparseVectorFieldMapper( return new SparseVectorFieldMapper(
leafName(), leafName(),
new SparseVectorFieldType(context.buildFullName(leafName()), meta.getValue()), new SparseVectorFieldType(context.buildFullName(leafName()), meta.getValue()),
multiFieldsBuilder.build(this, context), builderParams(this, context)
copyTo
); );
} }
} }
@ -131,8 +130,8 @@ public class SparseVectorFieldMapper extends FieldMapper {
} }
} }
private SparseVectorFieldMapper(String simpleName, MappedFieldType mappedFieldType, MultiFields multiFields, CopyTo copyTo) { private SparseVectorFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null); super(simpleName, mappedFieldType, builderParams);
} }
@Override @Override

View file

@ -96,7 +96,7 @@ public class MappingLookupInferenceFieldMapperTests extends MapperServiceTestCas
public static final String CONTENT_TYPE = "test_inference_field"; public static final String CONTENT_TYPE = "test_inference_field";
TestInferenceFieldMapper(String simpleName) { TestInferenceFieldMapper(String simpleName) {
super(simpleName, new TestInferenceFieldMapperFieldType(simpleName), MultiFields.empty(), CopyTo.empty()); super(simpleName, new TestInferenceFieldMapperFieldType(simpleName), BuilderParams.empty());
} }
@Override @Override

View file

@ -257,7 +257,7 @@ public class MappingLookupTests extends ESTestCase {
final String indexedValue; final String indexedValue;
FakeFieldMapper(FakeFieldType fieldType, String indexedValue) { FakeFieldMapper(FakeFieldType fieldType, String indexedValue) {
super(fieldType.name(), fieldType, MultiFields.empty(), CopyTo.empty()); super(fieldType.name(), fieldType, BuilderParams.empty());
this.indexedValue = indexedValue; this.indexedValue = indexedValue;
} }

View file

@ -69,7 +69,7 @@ public class NonDynamicFieldMapperTests extends NonDynamicFieldMapperTestCase {
} }
private NonDynamicFieldMapper(String simpleName, MappedFieldType mappedFieldType) { private NonDynamicFieldMapper(String simpleName, MappedFieldType mappedFieldType) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty()); super(simpleName, mappedFieldType, BuilderParams.empty());
} }
@Override @Override

View file

@ -187,7 +187,7 @@ public final class ObjectMapperMergeTests extends ESTestCase {
final TextFieldMapper textFieldMapper = (TextFieldMapper) metrics.getMapper("host.name"); final TextFieldMapper textFieldMapper = (TextFieldMapper) metrics.getMapper("host.name");
assertEquals("foo.metrics.host.name", textFieldMapper.fullPath()); assertEquals("foo.metrics.host.name", textFieldMapper.fullPath());
assertEquals("host.name", textFieldMapper.leafName()); assertEquals("host.name", textFieldMapper.leafName());
FieldMapper fieldMapper = textFieldMapper.multiFields.iterator().next(); FieldMapper fieldMapper = textFieldMapper.multiFields().iterator().next();
assertEquals("foo.metrics.host.name.keyword", fieldMapper.fullPath()); assertEquals("foo.metrics.host.name.keyword", fieldMapper.fullPath());
assertEquals("keyword", fieldMapper.leafName()); assertEquals("keyword", fieldMapper.leafName());
} }
@ -361,7 +361,7 @@ public final class ObjectMapperMergeTests extends ESTestCase {
); );
assertEquals("host.name", textKeywordMultiField.leafName()); assertEquals("host.name", textKeywordMultiField.leafName());
assertEquals("foo.metrics.host.name", textKeywordMultiField.fullPath()); assertEquals("foo.metrics.host.name", textKeywordMultiField.fullPath());
FieldMapper fieldMapper = textKeywordMultiField.multiFields.iterator().next(); FieldMapper fieldMapper = textKeywordMultiField.multiFields().iterator().next();
assertEquals("keyword", fieldMapper.leafName()); assertEquals("keyword", fieldMapper.leafName());
assertEquals("foo.metrics.host.name.keyword", fieldMapper.fullPath()); assertEquals("foo.metrics.host.name.keyword", fieldMapper.fullPath());
return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS).add( return new ObjectMapper.Builder("foo", ObjectMapper.Defaults.SUBOBJECTS).add(

View file

@ -176,7 +176,7 @@ public class ParametrizedMapperTests extends MapperServiceTestCase {
@Override @Override
public FieldMapper build(MapperBuilderContext context) { public FieldMapper build(MapperBuilderContext context) {
return new TestMapper(leafName(), context.buildFullName(leafName()), multiFieldsBuilder.build(this, context), copyTo, this); return new TestMapper(leafName(), context.buildFullName(leafName()), builderParams(this, context), this);
} }
} }
@ -205,14 +205,8 @@ public class ParametrizedMapperTests extends MapperServiceTestCase {
private final DummyEnumType enumField; private final DummyEnumType enumField;
private final DummyEnumType restrictedEnumField; private final DummyEnumType restrictedEnumField;
protected TestMapper( protected TestMapper(String simpleName, String fullName, BuilderParams builderParams, ParametrizedMapperTests.Builder builder) {
String simpleName, super(simpleName, new KeywordFieldMapper.KeywordFieldType(fullName), builderParams);
String fullName,
MultiFields multiFields,
CopyTo copyTo,
ParametrizedMapperTests.Builder builder
) {
super(simpleName, new KeywordFieldMapper.KeywordFieldType(fullName), multiFields, copyTo);
this.fixed = builder.fixed.getValue(); this.fixed = builder.fixed.getValue();
this.fixed2 = builder.fixed2.getValue(); this.fixed2 = builder.fixed2.getValue();
this.variable = builder.variable.getValue(); this.variable = builder.variable.getValue();
@ -433,6 +427,28 @@ public class ParametrizedMapperTests extends MapperServiceTestCase {
{"field":{"type":"test_mapper","variable":"updated","required":"value"}}""", Strings.toString(noCopyTo)); {"field":{"type":"test_mapper","variable":"updated","required":"value"}}""", Strings.toString(noCopyTo));
} }
public void testStoredSource() {
String mapping = """
{"type":"test_mapper","variable":"foo","required":"value","synthetic_source_keep":"none"}""";
TestMapper mapper = fromMapping(mapping);
assertEquals("{\"field\":" + mapping + "}", Strings.toString(mapper));
mapping = """
{"type":"test_mapper","variable":"foo","required":"value","synthetic_source_keep":"arrays"}""";
mapper = fromMapping(mapping);
assertEquals("{\"field\":" + mapping + "}", Strings.toString(mapper));
mapping = """
{"type":"test_mapper","variable":"foo","required":"value","synthetic_source_keep":"all"}""";
mapper = fromMapping(mapping);
assertEquals("{\"field\":" + mapping + "}", Strings.toString(mapper));
String mappingThrows = """
{"type":"test_mapper","variable":"foo","required":"value","synthetic_source_keep":"no-such-value"}""";
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> fromMapping(mappingThrows));
assertEquals("Unknown synthetic_source_keep value [no-such-value], accepted values are [none,arrays,all]", e.getMessage());
}
public void testNullables() { public void testNullables() {
String mapping = """ String mapping = """
{"type":"test_mapper","fixed":null,"required":"value"}"""; {"type":"test_mapper","fixed":null,"required":"value"}""";

View file

@ -21,15 +21,15 @@ public class MockFieldMapper extends FieldMapper {
} }
public MockFieldMapper(MappedFieldType fieldType) { public MockFieldMapper(MappedFieldType fieldType) {
this(findSimpleName(fieldType.name()), fieldType, MultiFields.empty(), CopyTo.empty()); this(findSimpleName(fieldType.name()), fieldType, BuilderParams.empty());
} }
public MockFieldMapper(MappedFieldType fieldType, String simpleName) { public MockFieldMapper(MappedFieldType fieldType, String simpleName) {
super(simpleName, fieldType, MultiFields.empty(), CopyTo.empty(), false, null); super(simpleName, fieldType, BuilderParams.empty());
} }
public MockFieldMapper(String fullName, MappedFieldType fieldType, MultiFields multifields, CopyTo copyTo) { public MockFieldMapper(String fullName, MappedFieldType fieldType, BuilderParams params) {
super(findSimpleName(fullName), fieldType, multifields, copyTo, false, null); super(findSimpleName(fullName), fieldType, params);
} }
@Override @Override
@ -91,8 +91,7 @@ public class MockFieldMapper extends FieldMapper {
@Override @Override
public MockFieldMapper build(MapperBuilderContext context) { public MockFieldMapper build(MapperBuilderContext context) {
MultiFields multiFields = multiFieldsBuilder.build(this, context); return new MockFieldMapper(leafName(), fieldType, builderParams(this, context));
return new MockFieldMapper(leafName(), fieldType, multiFields, copyTo);
} }
} }
} }

View file

@ -75,7 +75,7 @@ public abstract class NumberFieldMapperTests extends MapperTestCase {
minimalMapping(b); minimalMapping(b);
b.field("script", "test"); b.field("script", "test");
b.field("on_script_error", "continue"); b.field("on_script_error", "continue");
}, m -> assertThat((m).onScriptError, is(OnScriptError.CONTINUE))); }, m -> assertThat((m).builderParams.onScriptError(), is(OnScriptError.CONTINUE)));
} }
} }

View file

@ -98,8 +98,7 @@ public class HistogramFieldMapper extends FieldMapper {
return new HistogramFieldMapper( return new HistogramFieldMapper(
leafName(), leafName(),
new HistogramFieldType(context.buildFullName(leafName()), meta.getValue()), new HistogramFieldType(context.buildFullName(leafName()), meta.getValue()),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
this this
); );
} }
@ -113,14 +112,8 @@ public class HistogramFieldMapper extends FieldMapper {
private final Explicit<Boolean> ignoreMalformed; private final Explicit<Boolean> ignoreMalformed;
private final boolean ignoreMalformedByDefault; private final boolean ignoreMalformedByDefault;
public HistogramFieldMapper( public HistogramFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
String simpleName, super(simpleName, mappedFieldType, builderParams);
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
this.ignoreMalformed = builder.ignoreMalformed.getValue(); this.ignoreMalformed = builder.ignoreMalformed.getValue();
this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue().value(); this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue().value();
} }
@ -513,7 +506,7 @@ public class HistogramFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [histogram] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [histogram] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -170,13 +170,13 @@ public class SemanticTextFieldMapper extends FieldMapper implements InferenceFie
indexVersionCreated, indexVersionCreated,
meta.getValue() meta.getValue()
), ),
copyTo builderParams(this, context)
); );
} }
} }
private SemanticTextFieldMapper(String simpleName, MappedFieldType mappedFieldType, CopyTo copyTo) { private SemanticTextFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, MultiFields.empty(), copyTo); super(simpleName, mappedFieldType, builderParams);
} }
@Override @Override

View file

@ -267,7 +267,7 @@ public class AggregateDoubleMetricFieldMapper extends FieldMapper {
metricFieldType.setMetricFields(metricFields); metricFieldType.setMetricFields(metricFields);
metricFieldType.setDefaultMetric(defaultMetric.getValue()); metricFieldType.setDefaultMetric(defaultMetric.getValue());
return new AggregateDoubleMetricFieldMapper(leafName(), metricFieldType, metricMappers, this); return new AggregateDoubleMetricFieldMapper(leafName(), metricFieldType, metricMappers, builderParams(this, context), this);
} }
} }
@ -543,9 +543,10 @@ public class AggregateDoubleMetricFieldMapper extends FieldMapper {
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
EnumMap<Metric, NumberFieldMapper> metricFieldMappers, EnumMap<Metric, NumberFieldMapper> metricFieldMappers,
BuilderParams builderParams,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty()); super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformed = builder.ignoreMalformed.getValue(); this.ignoreMalformed = builder.ignoreMalformed.getValue();
this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue(); this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue();
this.metrics = builder.metrics.getValue(); this.metrics = builder.metrics.getValue();

View file

@ -111,7 +111,8 @@ public class ConstantKeywordFieldMapper extends FieldMapper {
} }
return new ConstantKeywordFieldMapper( return new ConstantKeywordFieldMapper(
leafName(), leafName(),
new ConstantKeywordFieldType(context.buildFullName(leafName()), value.getValue(), meta.getValue()) new ConstantKeywordFieldType(context.buildFullName(leafName()), value.getValue(), meta.getValue()),
builderParams(this, context)
); );
} }
} }
@ -301,8 +302,8 @@ public class ConstantKeywordFieldMapper extends FieldMapper {
} }
ConstantKeywordFieldMapper(String simpleName, MappedFieldType mappedFieldType) { ConstantKeywordFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty()); super(simpleName, mappedFieldType, builderParams);
} }
@Override @Override
@ -321,7 +322,7 @@ public class ConstantKeywordFieldMapper extends FieldMapper {
if (fieldType().value == null) { if (fieldType().value == null) {
ConstantKeywordFieldType newFieldType = new ConstantKeywordFieldType(fieldType().name(), value, fieldType().meta()); ConstantKeywordFieldType newFieldType = new ConstantKeywordFieldType(fieldType().name(), value, fieldType().meta());
Mapper update = new ConstantKeywordFieldMapper(leafName(), newFieldType); Mapper update = new ConstantKeywordFieldMapper(leafName(), newFieldType, builderParams);
boolean dynamicMapperAdded = context.addDynamicMapper(update); boolean dynamicMapperAdded = context.addDynamicMapper(update);
// the mapper is already part of the mapping, we're just updating it with the new value // the mapper is already part of the mapping, we're just updating it with the new value
assert dynamicMapperAdded; assert dynamicMapperAdded;

View file

@ -307,8 +307,7 @@ public class CountedKeywordFieldMapper extends FieldMapper {
meta.getValue(), meta.getValue(),
countFieldMapper.fieldType() countFieldMapper.fieldType()
), ),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
countFieldMapper countFieldMapper
); );
} }
@ -323,11 +322,10 @@ public class CountedKeywordFieldMapper extends FieldMapper {
String simpleName, String simpleName,
FieldType fieldType, FieldType fieldType,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
BinaryFieldMapper countFieldMapper BinaryFieldMapper countFieldMapper
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.fieldType = fieldType; this.fieldType = fieldType;
this.countFieldMapper = countFieldMapper; this.countFieldMapper = countFieldMapper;
} }

View file

@ -210,14 +210,7 @@ public class UnsignedLongFieldMapper extends FieldMapper {
metric.getValue(), metric.getValue(),
indexMode indexMode
); );
return new UnsignedLongFieldMapper( return new UnsignedLongFieldMapper(leafName(), fieldType, builderParams(this, context), context.isSourceSynthetic(), this);
leafName(),
fieldType,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
} }
} }
@ -577,12 +570,11 @@ public class UnsignedLongFieldMapper extends FieldMapper {
private UnsignedLongFieldMapper( private UnsignedLongFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
boolean isSourceSynthetic, boolean isSourceSynthetic,
Builder builder Builder builder
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.isSourceSynthetic = isSourceSynthetic; this.isSourceSynthetic = isSourceSynthetic;
this.indexed = builder.indexed.getValue(); this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue(); this.hasDocValues = builder.hasDocValues.getValue();
@ -776,7 +768,7 @@ public class UnsignedLongFieldMapper extends FieldMapper {
+ "] doesn't support synthetic source because it doesn't have doc values" + "] doesn't support synthetic source because it doesn't have doc values"
); );
} }
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -119,13 +119,7 @@ public class VersionStringFieldMapper extends FieldMapper {
@Override @Override
public VersionStringFieldMapper build(MapperBuilderContext context) { public VersionStringFieldMapper build(MapperBuilderContext context) {
FieldType fieldtype = new FieldType(Defaults.FIELD_TYPE); FieldType fieldtype = new FieldType(Defaults.FIELD_TYPE);
return new VersionStringFieldMapper( return new VersionStringFieldMapper(leafName(), fieldtype, buildFieldType(context, fieldtype), builderParams(this, context));
leafName(),
fieldtype,
buildFieldType(context, fieldtype),
multiFieldsBuilder.build(this, context),
copyTo
);
} }
@Override @Override
@ -361,14 +355,8 @@ public class VersionStringFieldMapper extends FieldMapper {
private final FieldType fieldType; private final FieldType fieldType;
private VersionStringFieldMapper( private VersionStringFieldMapper(String simpleName, FieldType fieldType, MappedFieldType mappedFieldType, BuilderParams buildParams) {
String simpleName, super(simpleName, mappedFieldType, buildParams);
FieldType fieldType,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
this.fieldType = freezeAndDeduplicateFieldType(fieldType); this.fieldType = freezeAndDeduplicateFieldType(fieldType);
} }
@ -453,7 +441,7 @@ public class VersionStringFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );

View file

@ -111,7 +111,7 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
final Parameter<Explicit<Boolean>> coerce; final Parameter<Explicit<Boolean>> coerce;
final Parameter<Explicit<Orientation>> orientation = orientationParam(m -> builder(m).orientation.get()); final Parameter<Explicit<Orientation>> orientation = orientationParam(m -> builder(m).orientation.get());
private final Parameter<Script> script = Parameter.scriptParam(m -> builder(m).script.get()); private final Parameter<Script> script = Parameter.scriptParam(m -> builder(m).script.get());
private final Parameter<OnScriptError> onScriptError = Parameter.onScriptErrorParam(m -> builder(m).onScriptError.get(), script); private final Parameter<OnScriptError> onScriptErrorParam = Parameter.onScriptErrorParam(m -> builder(m).onScriptError, script);
final Parameter<Map<String, String>> meta = Parameter.metaParam(); final Parameter<Map<String, String>> meta = Parameter.metaParam();
private final ScriptCompiler scriptCompiler; private final ScriptCompiler scriptCompiler;
private final IndexVersion version; private final IndexVersion version;
@ -152,7 +152,7 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
coerce, coerce,
orientation, orientation,
script, script,
onScriptError, onScriptErrorParam,
meta }; meta };
} }
@ -194,29 +194,17 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
geoFormatterFactory, geoFormatterFactory,
meta.get() meta.get()
); );
if (script.get() == null) { hasScript = script.get() != null;
return new GeoShapeWithDocValuesFieldMapper( onScriptError = onScriptErrorParam.get();
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
new GeoShapeIndexer(orientation.get().value(), ft.name()),
parser,
this
);
}
return new GeoShapeWithDocValuesFieldMapper( return new GeoShapeWithDocValuesFieldMapper(
leafName(), leafName(),
ft, ft,
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
new GeoShapeIndexer(orientation.get().value(), ft.name()), new GeoShapeIndexer(orientation.get().value(), ft.name()),
parser, parser,
onScriptError.get(),
this this
); );
} }
} }
public static final class GeoShapeWithDocValuesFieldType extends AbstractShapeGeometryFieldType<Geometry> implements GeoShapeQueryable { public static final class GeoShapeWithDocValuesFieldType extends AbstractShapeGeometryFieldType<Geometry> implements GeoShapeQueryable {
@ -365,8 +353,7 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
public GeoShapeWithDocValuesFieldMapper( public GeoShapeWithDocValuesFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
GeoShapeIndexer indexer, GeoShapeIndexer indexer,
GeoShapeParser parser, GeoShapeParser parser,
Builder builder Builder builder
@ -374,33 +361,17 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
super( super(
simpleName, simpleName,
mappedFieldType, mappedFieldType,
builderParams,
builder.ignoreMalformed.get(), builder.ignoreMalformed.get(),
builder.coerce.get(), builder.coerce.get(),
builder.ignoreZValue.get(), builder.ignoreZValue.get(),
builder.orientation.get(), builder.orientation.get(),
multiFields,
copyTo,
parser parser
); );
this.builder = builder; this.builder = builder;
this.indexer = indexer; this.indexer = indexer;
} }
protected GeoShapeWithDocValuesFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
GeoShapeIndexer indexer,
Parser<Geometry> parser,
OnScriptError onScriptError,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, builder.coerce.get(), builder.orientation.get(), copyTo, parser, onScriptError);
this.builder = builder;
this.indexer = indexer;
}
@Override @Override
protected void index(DocumentParserContext context, Geometry geometry) { protected void index(DocumentParserContext context, Geometry geometry) {
// TODO: Make common with the index method ShapeFieldMapper // TODO: Make common with the index method ShapeFieldMapper

View file

@ -116,7 +116,7 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<Cartesian
nullValue.get(), nullValue.get(),
meta.get() meta.get()
); );
return new PointFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, parser, this); return new PointFieldMapper(leafName(), ft, builderParams(this, context), parser, this);
} }
} }
@ -128,19 +128,17 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<Cartesian
public PointFieldMapper( public PointFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
CartesianPointParser parser, CartesianPointParser parser,
Builder builder Builder builder
) { ) {
super( super(
simpleName, simpleName,
mappedFieldType, mappedFieldType,
multiFields, builderParams,
builder.ignoreMalformed.get(), builder.ignoreMalformed.get(),
builder.ignoreZValue.get(), builder.ignoreZValue.get(),
builder.nullValue.get(), builder.nullValue.get(),
copyTo,
parser parser
); );
this.builder = builder; this.builder = builder;

View file

@ -122,7 +122,7 @@ public class ShapeFieldMapper extends AbstractShapeGeometryFieldMapper<Geometry>
parser, parser,
meta.get() meta.get()
); );
return new ShapeFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, parser, this); return new ShapeFieldMapper(leafName(), ft, builderParams(this, context), parser, this);
} }
} }
@ -192,20 +192,18 @@ public class ShapeFieldMapper extends AbstractShapeGeometryFieldMapper<Geometry>
public ShapeFieldMapper( public ShapeFieldMapper(
String simpleName, String simpleName,
MappedFieldType mappedFieldType, MappedFieldType mappedFieldType,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
Parser<Geometry> parser, Parser<Geometry> parser,
Builder builder Builder builder
) { ) {
super( super(
simpleName, simpleName,
mappedFieldType, mappedFieldType,
builderParams,
builder.ignoreMalformed.get(), builder.ignoreMalformed.get(),
builder.coerce.get(), builder.coerce.get(),
builder.ignoreZValue.get(), builder.ignoreZValue.get(),
builder.orientation.get(), builder.orientation.get(),
multiFields,
copyTo,
parser parser
); );
this.builder = builder; this.builder = builder;

View file

@ -246,8 +246,7 @@ public class WildcardFieldMapper extends FieldMapper {
), ),
ignoreAbove.get(), ignoreAbove.get(),
context.isSourceSynthetic(), context.isSourceSynthetic(),
multiFieldsBuilder.build(this, context), builderParams(this, context),
copyTo,
nullValue.get(), nullValue.get(),
indexVersionCreated indexVersionCreated
); );
@ -902,12 +901,11 @@ public class WildcardFieldMapper extends FieldMapper {
WildcardFieldType mappedFieldType, WildcardFieldType mappedFieldType,
int ignoreAbove, int ignoreAbove,
boolean storeIgnored, boolean storeIgnored,
MultiFields multiFields, BuilderParams builderParams,
CopyTo copyTo,
String nullValue, String nullValue,
IndexVersion indexVersionCreated IndexVersion indexVersionCreated
) { ) {
super(simpleName, mappedFieldType, multiFields, copyTo); super(simpleName, mappedFieldType, builderParams);
this.nullValue = nullValue; this.nullValue = nullValue;
this.ignoreAbove = ignoreAbove; this.ignoreAbove = ignoreAbove;
this.storeIgnored = storeIgnored; this.storeIgnored = storeIgnored;
@ -996,7 +994,7 @@ public class WildcardFieldMapper extends FieldMapper {
@Override @Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() { public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) { if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to" "field [" + fullPath() + "] of type [" + typeName() + "] doesn't support synthetic source because it declares copy_to"
); );