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) {
LegacyGeoShapeParser parser = new LegacyGeoShapeParser();
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(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
LegacyGeoShapeParser parser,
Builder builder
) {
super(
simpleName,
mappedFieldType,
builderParams,
builder.ignoreMalformed.get(),
builder.coerce.get(),
builder.ignoreZValue.get(),
builder.orientation.get(),
multiFields,
copyTo,
parser
);
this.indexCreatedVersion = builder.indexCreatedVersion;

View file

@ -139,13 +139,11 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
@Override
public MatchOnlyTextFieldMapper build(MapperBuilderContext context) {
MatchOnlyTextFieldType tft = buildFieldType(context);
MultiFields multiFields = multiFieldsBuilder.build(this, context);
return new MatchOnlyTextFieldMapper(
leafName(),
Defaults.FIELD_TYPE,
tft,
multiFields,
copyTo,
builderParams(this, context),
context.isSourceSynthetic(),
this
);
@ -382,12 +380,11 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
String simpleName,
FieldType fieldType,
MatchOnlyTextFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean storeSource,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
super(simpleName, mappedFieldType, builderParams);
assert mappedFieldType.getTextSearchInfo().isTokenized();
assert mappedFieldType.hasDocValues() == false;
this.fieldType = freezeAndDeduplicateFieldType(fieldType);
@ -442,7 +439,7 @@ public class MatchOnlyTextFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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(),
nullValue.getValue()
),
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
positiveScoreImpact.getValue(),
nullValue.getValue()
);
@ -172,12 +171,11 @@ public class RankFeatureFieldMapper extends FieldMapper {
private RankFeatureFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean positiveScoreImpact,
Float nullValue
) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
super(simpleName, mappedFieldType, builderParams);
this.positiveScoreImpact = positiveScoreImpact;
this.nullValue = nullValue;
}

View file

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

View file

@ -197,14 +197,7 @@ public class ScaledFloatFieldMapper extends FieldMapper {
metric.getValue(),
indexMode
);
return new ScaledFloatFieldMapper(
leafName(),
type,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
return new ScaledFloatFieldMapper(leafName(), type, builderParams(this, context), context.isSourceSynthetic(), this);
}
}
@ -470,12 +463,11 @@ public class ScaledFloatFieldMapper extends FieldMapper {
private ScaledFloatFieldMapper(
String simpleName,
ScaledFloatFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean isSourceSynthetic,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, builderParams);
this.isSourceSynthetic = isSourceSynthetic;
this.indexed = builder.indexed.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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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(
leafName(),
ft,
copyTo,
builderParams(this, context),
indexAnalyzers,
prefixFieldMapper,
shingleFieldMappers,
multiFieldsBuilder.build(this, context),
this
);
}
@ -498,7 +497,7 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
final FieldType fieldType;
PrefixFieldMapper(FieldType fieldType, PrefixFieldType mappedFieldType) {
super(mappedFieldType.name(), mappedFieldType, MultiFields.empty(), CopyTo.empty());
super(mappedFieldType.name(), mappedFieldType, BuilderParams.empty());
this.fieldType = Mapper.freezeAndDeduplicateFieldType(fieldType);
}
@ -537,7 +536,7 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
private final FieldType fieldType;
ShingleFieldMapper(FieldType fieldType, ShingleFieldType mappedFieldtype) {
super(mappedFieldtype.name(), mappedFieldtype, MultiFields.empty(), CopyTo.empty());
super(mappedFieldtype.name(), mappedFieldtype, BuilderParams.empty());
this.fieldType = freezeAndDeduplicateFieldType(fieldType);
}
@ -672,14 +671,13 @@ public class SearchAsYouTypeFieldMapper extends FieldMapper {
public SearchAsYouTypeFieldMapper(
String simpleName,
SearchAsYouTypeFieldType mappedFieldType,
CopyTo copyTo,
BuilderParams builderParams,
Map<String, NamedAnalyzer> indexAnalyzers,
PrefixFieldMapper prefixField,
ShingleFieldMapper[] shingleFields,
MultiFields multiFields,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
super(simpleName, mappedFieldType, builderParams);
this.prefixField = prefixField;
this.shingleFields = shingleFields;
this.maxShingleSize = builder.maxShingleSize.getValue();

View file

@ -87,7 +87,7 @@ public class TokenCountFieldMapper extends FieldMapper {
nullValue.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 Integer nullValue;
protected TokenCountFieldMapper(
String simpleName,
MappedFieldType defaultFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, defaultFieldType, multiFields, copyTo);
protected TokenCountFieldMapper(String simpleName, MappedFieldType defaultFieldType, BuilderParams builderParams, Builder builder) {
super(simpleName, defaultFieldType, builderParams);
this.analyzer = builder.analyzer.getValue();
this.enablePositionIncrements = builder.enablePositionIncrements.getValue();
this.nullValue = builder.nullValue.getValue();

View file

@ -88,7 +88,7 @@ public final class ParentIdFieldMapper extends FieldMapper {
}
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

View file

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

View file

@ -137,8 +137,6 @@ public class PercolatorFieldMapper extends FieldMapper {
@Override
public PercolatorFieldMapper build(MapperBuilderContext context) {
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);
KeywordFieldMapper extractedTermsField = createExtractQueryFieldBuilder(
EXTRACTED_TERMS_FIELD_NAME,
@ -165,8 +163,7 @@ public class PercolatorFieldMapper extends FieldMapper {
return new PercolatorFieldMapper(
leafName(),
fieldType,
multiFields,
copyTo,
builderParams(this, context),
searchExecutionContext,
extractedTermsField,
extractionResultField,
@ -375,8 +372,7 @@ public class PercolatorFieldMapper extends FieldMapper {
PercolatorFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Supplier<SearchExecutionContext> searchExecutionContext,
KeywordFieldMapper queryTermsField,
KeywordFieldMapper extractionResultField,
@ -387,7 +383,7 @@ public class PercolatorFieldMapper extends FieldMapper {
IndexVersion indexCreatedVersion,
Supplier<TransportVersion> clusterTransportVersion
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, builderParams);
this.searchExecutionContext = searchExecutionContext;
this.queryTermsField = queryTermsField;
this.extractionResultField = extractionResultField;

View file

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

View file

@ -150,7 +150,6 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
@Override
public AnnotatedTextFieldMapper build(MapperBuilderContext context) {
MultiFields multiFields = multiFieldsBuilder.build(this, context);
FieldType fieldType = TextParams.buildFieldType(() -> true, store, indexOptions, norms, termVectors);
if (fieldType.indexOptions() == IndexOptions.NONE) {
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(
leafName(),
fieldType,
buildFieldType(fieldType, context, multiFields),
multiFields,
copyTo,
buildFieldType(fieldType, context, builderParams.multiFields()),
builderParams,
this
);
}
@ -523,11 +522,10 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
String simpleName,
FieldType fieldType,
AnnotatedTextFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, builderParams);
assert fieldType.tokenized();
this.fieldType = freezeAndDeduplicateFieldType(fieldType);
this.builder = builder;
@ -578,7 +576,7 @@ public class AnnotatedTextFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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(
leafName(),
new Murmur3FieldType(context.buildFullName(leafName()), stored.getValue(), meta.getValue()),
multiFieldsBuilder.build(this, context),
copyTo
builderParams(this, context)
);
}
}
@ -94,8 +93,8 @@ public class Murmur3FieldMapper extends FieldMapper {
}
}
protected Murmur3FieldMapper(String simpleName, MappedFieldType mappedFieldType, MultiFields multiFields, CopyTo copyTo) {
super(simpleName, mappedFieldType, multiFields, copyTo);
protected Murmur3FieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, builderParams);
}
@Override

View file

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

View file

@ -40,29 +40,16 @@ public abstract class AbstractPointGeometryFieldMapper<T> extends AbstractGeomet
protected AbstractPointGeometryFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
BuilderParams builderParams,
Explicit<Boolean> ignoreMalformed,
Explicit<Boolean> ignoreZValue,
T nullValue,
CopyTo copyTo,
Parser<T> parser
) {
super(simpleName, mappedFieldType, ignoreMalformed, ignoreZValue, multiFields, copyTo, parser);
super(simpleName, mappedFieldType, builderParams, ignoreMalformed, ignoreZValue, parser);
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() {
return nullValue;
}

View file

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

View file

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

View file

@ -72,8 +72,7 @@ public class BinaryFieldMapper extends FieldMapper {
return new BinaryFieldMapper(
leafName(),
new BinaryFieldType(context.buildFullName(leafName()), stored.getValue(), hasDocValues.getValue(), meta.getValue()),
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
this
);
}
@ -142,14 +141,8 @@ public class BinaryFieldMapper extends FieldMapper {
private final boolean hasDocValues;
private final boolean isSyntheticSourceEnabledViaIndexMode;
protected BinaryFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
protected BinaryFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
super(simpleName, mappedFieldType, builderParams);
this.stored = builder.stored.getValue();
this.hasDocValues = builder.hasDocValues.getValue();
this.isSyntheticSourceEnabledViaIndexMode = builder.isSyntheticSourceEnabledViaIndexMode;
@ -207,7 +200,7 @@ public class BinaryFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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();
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();
@ -133,7 +136,16 @@ public class BooleanFieldMapper extends FieldMapper {
@Override
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
@ -151,14 +163,9 @@ public class BooleanFieldMapper extends FieldMapper {
meta.getValue(),
dimension.getValue()
);
return new BooleanFieldMapper(
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.getValue();
return new BooleanFieldMapper(leafName(), ft, builderParams(this, context), context.isSourceSynthetic(), this);
}
private FieldValues<Boolean> scriptValues() {
@ -427,12 +434,11 @@ public class BooleanFieldMapper extends FieldMapper {
protected BooleanFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean storeMalformedFields,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.getValue());
super(simpleName, mappedFieldType, builderParams);
this.nullValue = builder.nullValue.getValue();
this.stored = builder.stored.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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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());
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() {
@ -346,14 +346,8 @@ public class CompletionFieldMapper extends FieldMapper {
private final NamedAnalyzer indexAnalyzer;
public CompletionFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
public CompletionFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
super(simpleName, mappedFieldType, builderParams);
this.builder = builder;
this.maxInputLength = builder.maxInputLength.getValue();
this.indexAnalyzer = builder.buildAnalyzer();
@ -443,7 +437,7 @@ public class CompletionFieldMapper extends FieldMapper {
context.addToFieldNames(fieldType().name());
for (CompletionInputMetadata metadata : inputMap.values()) {
multiFields.parse(
multiFields().parse(
this,
context,
() -> 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(
m -> m.onScriptError,
m -> m.builderParams.onScriptError(),
script
);

View file

@ -247,7 +247,10 @@ public final class DateFieldMapper extends FieldMapper {
private final Parameter<Boolean> ignoreMalformed;
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 IndexVersion indexCreatedVersion;
@ -316,7 +319,17 @@ public final class DateFieldMapper extends FieldMapper {
@Override
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) {
@ -364,12 +377,12 @@ public final class DateFieldMapper extends FieldMapper {
&& ignoreMalformed.isConfigured() == false) {
ignoreMalformed.setValue(false);
}
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.get();
return new DateFieldMapper(
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
nullTimestamp,
resolution,
context.isSourceSynthetic(),
@ -874,14 +887,13 @@ public final class DateFieldMapper extends FieldMapper {
private DateFieldMapper(
String leafName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Long nullValue,
Resolution resolution,
boolean isSourceSynthetic,
Builder builder
) {
super(leafName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.get());
super(leafName, mappedFieldType, builderParams);
this.store = builder.store.getValue();
this.indexed = builder.index.getValue();
this.hasDocValues = builder.docValues.getValue();
@ -998,7 +1010,7 @@ public final class DateFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (hasScript) {
if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING;
}
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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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();
}
},
FieldMapper.MultiFields.empty(),
FieldMapper.CopyTo.empty()
FieldMapper.BuilderParams.empty()
) {
@Override

View file

@ -45,6 +45,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
@ -75,46 +76,42 @@ public abstract class FieldMapper extends Mapper {
@SuppressWarnings("rawtypes")
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 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 onScriptError the behaviour for when the defined script fails at runtime
*/
protected FieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
protected record BuilderParams(
MultiFields multiFields,
CopyTo copyTo,
Optional<SourceKeepMode> sourceKeepMode,
boolean hasScript,
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);
this.mappedFieldType = mappedFieldType;
this.builderParams = params;
// could be blank but not empty on indices created < 8.6.0
assert mappedFieldType.name().isEmpty() == false;
this.mappedFieldType = mappedFieldType;
this.multiFields = multiFields;
this.copyTo = Objects.requireNonNull(copyTo);
this.hasScript = hasScript;
this.onScriptError = onScriptError;
assert params.copyTo != null;
}
@Override
@ -135,11 +132,15 @@ public abstract class FieldMapper extends Mapper {
* List of fields where this field should be copied to
*/
public CopyTo copyTo() {
return copyTo;
return builderParams.copyTo;
}
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 {
try {
if (hasScript) {
if (builderParams.hasScript) {
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
// of the mappings
if (multiFields.mappers.length != 0) {
if (builderParams.multiFields.mappers.length != 0) {
doParseMultiFields(context);
}
}
private void doParseMultiFields(DocumentParserContext context) throws IOException {
context.path().add(leafName());
for (FieldMapper mapper : multiFields.mappers) {
for (FieldMapper mapper : builderParams.multiFields.mappers) {
mapper.parse(context);
}
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
*/
public final boolean hasScript() {
return hasScript;
return builderParams.hasScript;
}
/**
@ -276,7 +277,7 @@ public abstract class FieldMapper extends Mapper {
try {
indexScriptValues(searchLookup, readerContext, doc, documentParserContext);
} catch (Exception e) {
if (onScriptError == OnScriptError.CONTINUE) {
if (builderParams.onScriptError == OnScriptError.CONTINUE) {
documentParserContext.addIgnoredField(fullPath());
} else {
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() {
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 {
builder.field("type", contentType());
getMergeBuilder().toXContent(builder, params);
multiFields.toXContent(builder, params);
copyTo.toXContent(builder);
builderParams.multiFields.toXContent(builder, params);
builderParams.copyTo.toXContent(builder);
if (builderParams.sourceKeepMode.isPresent()) {
builderParams.sourceKeepMode.get().toXContent(builder);
}
}
protected abstract String contentType();
@Override
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() {
@ -487,7 +491,7 @@ public abstract class FieldMapper extends Mapper {
// If mapper supports synthetic source natively, it overrides this method,
// so we won't see those here.
if (syntheticSourceMode() == SyntheticSourceMode.FALLBACK) {
if (copyTo.copyToFields().isEmpty() != true) {
if (builderParams.copyTo.copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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 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
@ -1304,21 +1311,26 @@ public abstract class FieldMapper extends Mapper {
for (Parameter<?> param : getParameters()) {
param.init(initializer);
}
for (FieldMapper subField : initializer.multiFields.mappers) {
for (FieldMapper subField : initializer.builderParams.multiFields.mappers) {
multiFieldsBuilder.add(subField);
}
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) {
for (Parameter<?> param : getParameters()) {
param.merge(in, conflicts);
}
MapperMergeContext childContext = mapperMergeContext.createChildContext(in.leafName(), null);
for (FieldMapper newSubField : in.multiFields.mappers) {
for (FieldMapper newSubField : in.builderParams.multiFields.mappers) {
multiFieldsBuilder.update(newSubField, childContext);
}
this.copyTo = in.copyTo;
this.copyTo = in.builderParams.copyTo;
this.sourceKeepMode = in.builderParams.sourceKeepMode;
validate();
}
@ -1413,6 +1425,11 @@ public abstract class FieldMapper extends Mapper {
iterator.remove();
continue;
}
case SYNTHETIC_SOURCE_KEEP_PARAM -> {
sourceKeepMode = Optional.of(SourceKeepMode.from(XContentMapValues.nodeStringValue(propNode)));
iterator.remove();
continue;
}
}
Parameter<?> parameter = deprecatedParamsMap.get(propName);
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> stored = Parameter.storeParam(m -> builder(m).stored.get(), false);
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();
private final ScriptCompiler scriptCompiler;
@ -152,7 +155,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
ignoreZValue,
nullValue,
script,
onScriptError,
onScriptErrorParam,
meta,
dimension,
metric };
@ -217,10 +220,9 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
metric.get(),
indexMode
);
if (this.script.get() == null) {
return new GeoPointFieldMapper(leafName(), ft, multiFieldsBuilder.build(this, context), copyTo, geoParser, this);
}
return new GeoPointFieldMapper(leafName(), ft, geoParser, this);
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.get();
return new GeoPointFieldMapper(leafName(), ft, builderParams(this, context), geoParser, this);
}
}
@ -248,32 +250,20 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper<GeoPoi
public GeoPointFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Parser<GeoPoint> parser,
Builder builder
) {
super(
simpleName,
mappedFieldType,
multiFields,
builderParams,
builder.ignoreMalformed.get(),
builder.ignoreZValue.get(),
builder.nullValue.get(),
copyTo,
parser
);
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.indexCreatedVersion = builder.indexCreatedVersion;
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)
// 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()));
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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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();
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<Boolean> dimension;
@ -162,7 +165,16 @@ public class IpFieldMapper extends FieldMapper {
@Override
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
@ -170,6 +182,8 @@ public class IpFieldMapper extends FieldMapper {
if (inheritDimensionParameterFromParentObject(context)) {
dimension.setValue(true);
}
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.getValue();
return new IpFieldMapper(
leafName(),
new IpFieldType(
@ -182,8 +196,7 @@ public class IpFieldMapper extends FieldMapper {
meta.getValue(),
dimension.getValue()
),
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
context.isSourceSynthetic(),
this
);
@ -494,12 +507,11 @@ public class IpFieldMapper extends FieldMapper {
private IpFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean storeIgnored,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.get());
super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformedByDefault = builder.ignoreMalformedByDefault;
this.indexed = builder.indexed.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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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<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 IndexAnalyzers indexAnalyzers;
@ -351,12 +354,13 @@ public final class KeywordFieldMapper extends FieldMapper {
// deduplicate in the common default case to save some memory
fieldtype = Defaults.FIELD_TYPE;
}
super.hasScript = script.get() != null;
super.onScriptError = onScriptError.getValue();
return new KeywordFieldMapper(
leafName(),
fieldtype,
buildFieldType(context, fieldtype),
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
context.isSourceSynthetic(),
this
);
@ -865,12 +869,11 @@ public final class KeywordFieldMapper extends FieldMapper {
String simpleName,
FieldType fieldType,
KeywordFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean isSyntheticSource,
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;
this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue();
@ -1048,7 +1051,7 @@ public final class KeywordFieldMapper extends FieldMapper {
if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING;
}
if (copyTo.copyToFields().isEmpty() != true) {
if (builderParams.copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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.IndexVersions;
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.Objects;
import java.util.concurrent.ConcurrentHashMap;
@ -39,6 +42,9 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
}
static SourceKeepMode from(String input) {
if (input == null) {
input = "null";
}
if (input.equals(NONE.name)) {
return NONE;
}
@ -48,7 +54,15 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
if (input.equals(ARRAYS.name)) {
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
@ -56,6 +70,10 @@ public abstract class Mapper implements ToXContentFragment, Iterable<Mapper> {
return name;
}
public void toXContent(XContentBuilder builder) throws IOException {
builder.field(SYNTHETIC_SOURCE_KEEP_PARAM, name);
}
private final String name;
}

View file

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

View file

@ -100,7 +100,10 @@ public class NumberFieldMapper extends FieldMapper {
private final Parameter<Number> nullValue;
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.
@ -253,7 +256,7 @@ public class NumberFieldMapper extends FieldMapper {
coerce,
nullValue,
script,
onScriptError,
onScriptErrorParam,
meta,
dimension,
metric };
@ -266,14 +269,9 @@ public class NumberFieldMapper extends FieldMapper {
}
MappedFieldType ft = new NumberFieldType(context.buildFullName(leafName()), this);
return new NumberFieldMapper(
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.getValue();
return new NumberFieldMapper(leafName(), ft, builderParams(this, context), context.isSourceSynthetic(), this);
}
}
@ -1841,12 +1839,11 @@ public class NumberFieldMapper extends FieldMapper {
private NumberFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean storeMalformedFields,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, builder.script.get() != null, builder.onScriptError.getValue());
super(simpleName, mappedFieldType, builderParams);
this.type = builder.type;
this.indexed = builder.indexed.getValue();
this.hasDocValues = builder.hasDocValues.getValue();
@ -2000,7 +1997,7 @@ public class NumberFieldMapper extends FieldMapper {
if (hasScript()) {
return SourceLoader.SyntheticFieldLoader.NOTHING;
}
if (copyTo.copyToFields().isEmpty() != true) {
if (builderParams.copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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
public PlaceHolderFieldMapper build(MapperBuilderContext context) {
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(
String simpleName,
PlaceHolderFieldType fieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Map<String, Object> unknownParams
) {
super(simpleName, fieldType, multiFields, copyTo);
super(simpleName, fieldType, builderParams);
this.unknownParams.putAll(unknownParams);
}

View file

@ -167,7 +167,7 @@ public class RangeFieldMapper extends FieldMapper {
@Override
public RangeFieldMapper build(MapperBuilderContext 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(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
RangeType type,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, builderParams);
this.type = type;
this.index = builder.index.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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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
public TextFieldMapper build(MapperBuilderContext context) {
MultiFields multiFields = multiFieldsBuilder.build(this, context);
FieldType fieldType = TextParams.buildFieldType(
index,
store,
@ -472,15 +471,16 @@ public final class TextFieldMapper extends FieldMapper {
indexCreatedVersion.isLegacyIndexVersion() ? () -> false : norms,
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 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)) {
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,
SubFieldInfo prefixFieldInfo,
SubFieldInfo phraseFieldInfo,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
super(simpleName, mappedFieldType, builderParams);
assert mappedFieldType.getTextSearchInfo().isTokenized();
assert mappedFieldType.hasDocValues() == false;
if (fieldType.indexOptions() == IndexOptions.NONE && fieldType().fielddata()) {
@ -1428,8 +1427,11 @@ public final class TextFieldMapper extends FieldMapper {
final Builder b = (Builder) getMergeBuilder();
b.index.toXContent(builder, includeDefaults);
b.store.toXContent(builder, includeDefaults);
this.multiFields.toXContent(builder, params);
this.copyTo.toXContent(builder);
multiFields().toXContent(builder, params);
copyTo().toXContent(builder);
if (sourceKeepMode().isPresent()) {
sourceKeepMode().get().toXContent(builder);
}
b.meta.toXContent(builder, includeDefaults);
b.indexOptions.toXContent(builder, includeDefaults);
b.termVectors.toXContent(builder, includeDefaults);
@ -1453,7 +1455,7 @@ public final class TextFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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(),
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 Builder builder;
private FlattenedFieldMapper(String leafName, MappedFieldType mappedFieldType, Builder builder) {
super(leafName, mappedFieldType, MultiFields.empty(), CopyTo.empty());
private FlattenedFieldMapper(String leafName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
super(leafName, mappedFieldType, builderParams);
this.builder = builder;
this.fieldParser = new FlattenedFieldParser(
mappedFieldType.name(),

View file

@ -297,10 +297,9 @@ public class DenseVectorFieldMapper extends FieldMapper {
indexOptions.getValue(),
meta.getValue()
),
builderParams(this, context),
indexOptions.getValue(),
indexVersionCreated,
multiFieldsBuilder.build(this, context),
copyTo
indexVersionCreated
);
}
}
@ -1963,12 +1962,11 @@ public class DenseVectorFieldMapper extends FieldMapper {
private DenseVectorFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
BuilderParams params,
IndexOptions indexOptions,
IndexVersion indexCreatedVersion,
MultiFields multiFields,
CopyTo copyTo
IndexVersion indexCreatedVersion
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, params);
this.indexOptions = indexOptions;
this.indexCreatedVersion = indexCreatedVersion;
}
@ -2015,10 +2013,9 @@ public class DenseVectorFieldMapper extends FieldMapper {
Mapper update = new DenseVectorFieldMapper(
leafName(),
updatedDenseVectorFieldType,
builderParams,
indexOptions,
indexCreatedVersion,
multiFields(),
copyTo
indexCreatedVersion
);
context.addDynamicMapper(update);
return;
@ -2162,7 +2159,7 @@ public class DenseVectorFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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(
leafName(),
new SparseVectorFieldType(context.buildFullName(leafName()), meta.getValue()),
multiFieldsBuilder.build(this, context),
copyTo
builderParams(this, context)
);
}
}
@ -131,8 +130,8 @@ public class SparseVectorFieldMapper extends FieldMapper {
}
}
private SparseVectorFieldMapper(String simpleName, MappedFieldType mappedFieldType, MultiFields multiFields, CopyTo copyTo) {
super(simpleName, mappedFieldType, multiFields, copyTo, false, null);
private SparseVectorFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, builderParams);
}
@Override

View file

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

View file

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

View file

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

View file

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

View file

@ -176,7 +176,7 @@ public class ParametrizedMapperTests extends MapperServiceTestCase {
@Override
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 restrictedEnumField;
protected TestMapper(
String simpleName,
String fullName,
MultiFields multiFields,
CopyTo copyTo,
ParametrizedMapperTests.Builder builder
) {
super(simpleName, new KeywordFieldMapper.KeywordFieldType(fullName), multiFields, copyTo);
protected TestMapper(String simpleName, String fullName, BuilderParams builderParams, ParametrizedMapperTests.Builder builder) {
super(simpleName, new KeywordFieldMapper.KeywordFieldType(fullName), builderParams);
this.fixed = builder.fixed.getValue();
this.fixed2 = builder.fixed2.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));
}
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() {
String mapping = """
{"type":"test_mapper","fixed":null,"required":"value"}""";

View file

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

View file

@ -75,7 +75,7 @@ public abstract class NumberFieldMapperTests extends MapperTestCase {
minimalMapping(b);
b.field("script", "test");
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(
leafName(),
new HistogramFieldType(context.buildFullName(leafName()), meta.getValue()),
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
this
);
}
@ -113,14 +112,8 @@ public class HistogramFieldMapper extends FieldMapper {
private final Explicit<Boolean> ignoreMalformed;
private final boolean ignoreMalformedByDefault;
public HistogramFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
public HistogramFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams, Builder builder) {
super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformed = builder.ignoreMalformed.getValue();
this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue().value();
}
@ -513,7 +506,7 @@ public class HistogramFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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,
meta.getValue()
),
copyTo
builderParams(this, context)
);
}
}
private SemanticTextFieldMapper(String simpleName, MappedFieldType mappedFieldType, CopyTo copyTo) {
super(simpleName, mappedFieldType, MultiFields.empty(), copyTo);
private SemanticTextFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, builderParams);
}
@Override

View file

@ -267,7 +267,7 @@ public class AggregateDoubleMetricFieldMapper extends FieldMapper {
metricFieldType.setMetricFields(metricFields);
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,
MappedFieldType mappedFieldType,
EnumMap<Metric, NumberFieldMapper> metricFieldMappers,
BuilderParams builderParams,
Builder builder
) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty());
super(simpleName, mappedFieldType, builderParams);
this.ignoreMalformed = builder.ignoreMalformed.getValue();
this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue();
this.metrics = builder.metrics.getValue();

View file

@ -111,7 +111,8 @@ public class ConstantKeywordFieldMapper extends FieldMapper {
}
return new ConstantKeywordFieldMapper(
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) {
super(simpleName, mappedFieldType, MultiFields.empty(), CopyTo.empty());
ConstantKeywordFieldMapper(String simpleName, MappedFieldType mappedFieldType, BuilderParams builderParams) {
super(simpleName, mappedFieldType, builderParams);
}
@Override
@ -321,7 +322,7 @@ public class ConstantKeywordFieldMapper extends FieldMapper {
if (fieldType().value == null) {
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);
// the mapper is already part of the mapping, we're just updating it with the new value
assert dynamicMapperAdded;

View file

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

View file

@ -210,14 +210,7 @@ public class UnsignedLongFieldMapper extends FieldMapper {
metric.getValue(),
indexMode
);
return new UnsignedLongFieldMapper(
leafName(),
fieldType,
multiFieldsBuilder.build(this, context),
copyTo,
context.isSourceSynthetic(),
this
);
return new UnsignedLongFieldMapper(leafName(), fieldType, builderParams(this, context), context.isSourceSynthetic(), this);
}
}
@ -577,12 +570,11 @@ public class UnsignedLongFieldMapper extends FieldMapper {
private UnsignedLongFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
boolean isSourceSynthetic,
Builder builder
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
super(simpleName, mappedFieldType, builderParams);
this.isSourceSynthetic = isSourceSynthetic;
this.indexed = builder.indexed.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"
);
}
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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
public VersionStringFieldMapper build(MapperBuilderContext context) {
FieldType fieldtype = new FieldType(Defaults.FIELD_TYPE);
return new VersionStringFieldMapper(
leafName(),
fieldtype,
buildFieldType(context, fieldtype),
multiFieldsBuilder.build(this, context),
copyTo
);
return new VersionStringFieldMapper(leafName(), fieldtype, buildFieldType(context, fieldtype), builderParams(this, context));
}
@Override
@ -361,14 +355,8 @@ public class VersionStringFieldMapper extends FieldMapper {
private final FieldType fieldType;
private VersionStringFieldMapper(
String simpleName,
FieldType fieldType,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo
) {
super(simpleName, mappedFieldType, multiFields, copyTo);
private VersionStringFieldMapper(String simpleName, FieldType fieldType, MappedFieldType mappedFieldType, BuilderParams buildParams) {
super(simpleName, mappedFieldType, buildParams);
this.fieldType = freezeAndDeduplicateFieldType(fieldType);
}
@ -453,7 +441,7 @@ public class VersionStringFieldMapper extends FieldMapper {
@Override
public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
if (copyTo.copyToFields().isEmpty() != true) {
if (copyTo().copyToFields().isEmpty() != true) {
throw new IllegalArgumentException(
"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<Orientation>> orientation = orientationParam(m -> builder(m).orientation.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();
private final ScriptCompiler scriptCompiler;
private final IndexVersion version;
@ -152,7 +152,7 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
coerce,
orientation,
script,
onScriptError,
onScriptErrorParam,
meta };
}
@ -194,29 +194,17 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
geoFormatterFactory,
meta.get()
);
if (script.get() == null) {
return new GeoShapeWithDocValuesFieldMapper(
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
new GeoShapeIndexer(orientation.get().value(), ft.name()),
parser,
this
);
}
hasScript = script.get() != null;
onScriptError = onScriptErrorParam.get();
return new GeoShapeWithDocValuesFieldMapper(
leafName(),
ft,
multiFieldsBuilder.build(this, context),
copyTo,
builderParams(this, context),
new GeoShapeIndexer(orientation.get().value(), ft.name()),
parser,
onScriptError.get(),
this
);
}
}
public static final class GeoShapeWithDocValuesFieldType extends AbstractShapeGeometryFieldType<Geometry> implements GeoShapeQueryable {
@ -365,8 +353,7 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
public GeoShapeWithDocValuesFieldMapper(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
GeoShapeIndexer indexer,
GeoShapeParser parser,
Builder builder
@ -374,33 +361,17 @@ public class GeoShapeWithDocValuesFieldMapper extends AbstractShapeGeometryField
super(
simpleName,
mappedFieldType,
builderParams,
builder.ignoreMalformed.get(),
builder.coerce.get(),
builder.ignoreZValue.get(),
builder.orientation.get(),
multiFields,
copyTo,
parser
);
this.builder = builder;
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
protected void index(DocumentParserContext context, Geometry geometry) {
// TODO: Make common with the index method ShapeFieldMapper

View file

@ -116,7 +116,7 @@ public class PointFieldMapper extends AbstractPointGeometryFieldMapper<Cartesian
nullValue.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(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
CartesianPointParser parser,
Builder builder
) {
super(
simpleName,
mappedFieldType,
multiFields,
builderParams,
builder.ignoreMalformed.get(),
builder.ignoreZValue.get(),
builder.nullValue.get(),
copyTo,
parser
);
this.builder = builder;

View file

@ -122,7 +122,7 @@ public class ShapeFieldMapper extends AbstractShapeGeometryFieldMapper<Geometry>
parser,
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(
String simpleName,
MappedFieldType mappedFieldType,
MultiFields multiFields,
CopyTo copyTo,
BuilderParams builderParams,
Parser<Geometry> parser,
Builder builder
) {
super(
simpleName,
mappedFieldType,
builderParams,
builder.ignoreMalformed.get(),
builder.coerce.get(),
builder.ignoreZValue.get(),
builder.orientation.get(),
multiFields,
copyTo,
parser
);
this.builder = builder;

View file

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