Skip to content

Commit 6a88d84

Browse files
authored
Add multiple validators to Parameters (#77073) (#77091)
This PR implements support for multiple validators to a FieldMapper.Parameter. The Parameter#setValidator method was replaced by Parameter#addValidator that can be called multipled times to add validation to a parameter. All validators of a parameter will be executed in the same order as they have been added and if any of them fails all validation will failed.
1 parent 9fbc109 commit 6a88d84

File tree

14 files changed

+44
-34
lines changed

14 files changed

+44
-34
lines changed

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static class Builder extends FieldMapper.Builder {
7272

7373
private final Parameter<Double> scalingFactor = new Parameter<>("scaling_factor", false, () -> null,
7474
(n, c, o) -> XContentMapValues.nodeDoubleValue(o), m -> toType(m).scalingFactor)
75-
.setValidator(v -> {
75+
.addValidator(v -> {
7676
if (v == null) {
7777
throw new IllegalArgumentException("Field [scaling_factor] is required");
7878
}

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/SearchAsYouTypeFieldMapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public static class Builder extends FieldMapper.Builder {
9797
// `doc_values=false`, even though it cannot be set; and so we need to continue
9898
// serializing it forever because of mapper assertions in mixed clusters.
9999
private final Parameter<Boolean> docValues = Parameter.docValuesParam(m -> false, false)
100-
.setValidator(v -> {
100+
.addValidator(v -> {
101101
if (v) {
102102
throw new MapperParsingException("Cannot set [doc_values] on field of type [search_as_you_type]");
103103
}
@@ -106,7 +106,7 @@ public static class Builder extends FieldMapper.Builder {
106106

107107
private final Parameter<Integer> maxShingleSize = Parameter.intParam("max_shingle_size", false,
108108
m -> builder(m).maxShingleSize.get(), Defaults.MAX_SHINGLE_SIZE)
109-
.setValidator(v -> {
109+
.addValidator(v -> {
110110
if (v < MAX_SHINGLE_SIZE_LOWER_BOUND || v > MAX_SHINGLE_SIZE_UPPER_BOUND) {
111111
throw new MapperParsingException("[max_shingle_size] must be at least [" + MAX_SHINGLE_SIZE_LOWER_BOUND
112112
+ "] and at most " + "[" + MAX_SHINGLE_SIZE_UPPER_BOUND + "], got [" + v + "]");

plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public static class Builder extends FieldMapper.Builder {
214214

215215
final Parameter<Integer> ignoreAbove
216216
= Parameter.intParam("ignore_above", true, m -> toType(m).ignoreAbove, Integer.MAX_VALUE)
217-
.setValidator(v -> {
217+
.addValidator(v -> {
218218
if (v < 0) {
219219
throw new IllegalArgumentException("[ignore_above] must be positive, got [" + v + "]");
220220
}

server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public static class Builder extends FieldMapper.Builder {
134134
private final Parameter<Integer> maxInputLength = Parameter.intParam("max_input_length", true,
135135
m -> builder(m).maxInputLength.get(), Defaults.DEFAULT_MAX_INPUT_LENGTH)
136136
.addDeprecatedName("max_input_len")
137-
.setValidator(Builder::validateInputLength)
137+
.addValidator(Builder::validateInputLength)
138138
.alwaysSerialize();
139139
private final Parameter<Map<String, String>> meta = Parameter.metaParam();
140140

server/src/main/java/org/elasticsearch/index/mapper/CompositeRuntimeField.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class CompositeRuntimeField implements RuntimeField {
3838
() -> null,
3939
RuntimeField::parseScript,
4040
RuntimeField.initializerNotSupported()
41-
).setValidator(s -> {
41+
).addValidator(s -> {
4242
if (s == null) {
4343
throw new IllegalArgumentException("composite runtime field [" + name + "] must declare a [script]");
4444
}
@@ -50,7 +50,7 @@ public class CompositeRuntimeField implements RuntimeField {
5050
Collections::emptyMap,
5151
(f, p, o) -> parseFields(f, o),
5252
RuntimeField.initializerNotSupported()
53-
).setValidator(objectMap -> {
53+
).addValidator(objectMap -> {
5454
if (objectMap == null || objectMap.isEmpty()) {
5555
throw new IllegalArgumentException("composite runtime field [" + name + "] must declare its [fields]");
5656
}

server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ public static final class Parameter<T> implements Supplier<T> {
587587
private final TriFunction<String, MappingParserContext, Object, T> parser;
588588
private final Function<FieldMapper, T> initializer;
589589
private boolean acceptsNull = false;
590-
private Consumer<T> validator = null;
590+
private List<Consumer<T>> validators = new ArrayList<>();
591591
private Serializer<T> serializer = XContentBuilder::field;
592592
private SerializerCheck<T> serializerCheck = (includeDefaults, isConfigured, value) -> includeDefaults || isConfigured;
593593
private Function<T, String> conflictSerializer = Objects::toString;
@@ -682,10 +682,11 @@ public Parameter<T> deprecated() {
682682
}
683683

684684
/**
685-
* Adds validation to a parameter, called after parsing and merging
685+
* Adds validation to a parameter, called after parsing and merging. Multiple
686+
* validators can be added and all of them will be executed.
686687
*/
687-
public Parameter<T> setValidator(Consumer<T> validator) {
688-
this.validator = validator;
688+
public Parameter<T> addValidator(Consumer<T> validator) {
689+
this.validators.add(validator);
689690
return this;
690691
}
691692

@@ -742,8 +743,9 @@ public Parameter<T> precludesParameters(Parameter<?>... ps) {
742743
}
743744

744745
void validate() {
745-
if (validator != null) {
746-
validator.accept(getValue());
746+
// Iterate over the list of validators and execute them one by one.
747+
for (Consumer<T> v : validators) {
748+
v.accept(getValue());
747749
}
748750
if (this.isConfigured()) {
749751
for (Parameter<?> p : requires) {
@@ -894,7 +896,7 @@ public static Parameter<String> restrictedStringParam(String name, boolean updat
894896
assert values.length > 0;
895897
Set<String> acceptedValues = new LinkedHashSet<>(Arrays.asList(values));
896898
return stringParam(name, updateable, initializer, values[0])
897-
.setValidator(v -> {
899+
.addValidator(v -> {
898900
if (acceptedValues.contains(v)) {
899901
return;
900902
}
@@ -1082,7 +1084,7 @@ protected void addScriptValidation(
10821084
Parameter<Boolean> indexParam,
10831085
Parameter<Boolean> docValuesParam
10841086
) {
1085-
scriptParam.setValidator(s -> {
1087+
scriptParam.addValidator(s -> {
10861088
if (s != null && indexParam.get() == false && docValuesParam.get() == false) {
10871089
throw new MapperParsingException("Cannot define script on field with index:false and doc_values:false");
10881090
}

server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,5 +537,4 @@ public FieldMapper.Builder getMergeBuilder() {
537537
return new Builder(simpleName(), indexAnalyzers, scriptCompiler).init(this);
538538
}
539539

540-
541540
}

server/src/main/java/org/elasticsearch/index/mapper/LegacyGeoShapeFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public Builder(String name, Version version, boolean ignoreMalformedByDefault, b
166166
this.ignoreMalformed = ignoreMalformedParam(m -> builder(m).ignoreMalformed.get(), ignoreMalformedByDefault);
167167
this.coerce = coerceParam(m -> builder(m).coerce.get(), coerceByDefault);
168168

169-
this.pointsOnly.setValidator(v -> {
169+
this.pointsOnly.addValidator(v -> {
170170
if (v == null) {
171171
return;
172172
}

server/src/main/java/org/elasticsearch/index/mapper/TextParams.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public Analyzers(IndexAnalyzers indexAnalyzers,
4141
m -> analyzerInitFunction.apply(m).indexAnalyzer.get(), indexAnalyzers::getDefaultIndexAnalyzer)
4242
.setSerializerCheck((id, ic, a) -> id || ic ||
4343
Objects.equals(a, getSearchAnalyzer()) == false || Objects.equals(a, getSearchQuoteAnalyzer()) == false)
44-
.setValidator(a -> a.checkAllowedInMode(AnalysisMode.INDEX_TIME));
44+
.addValidator(a -> a.checkAllowedInMode(AnalysisMode.INDEX_TIME));
4545
this.searchAnalyzer
4646
= Parameter.analyzerParam("search_analyzer", true,
4747
m -> m.fieldType().getTextSearchInfo().getSearchAnalyzer(), () -> {
@@ -54,7 +54,7 @@ public Analyzers(IndexAnalyzers indexAnalyzers,
5454
return indexAnalyzer.get();
5555
})
5656
.setSerializerCheck((id, ic, a) -> id || ic || Objects.equals(a, getSearchQuoteAnalyzer()) == false)
57-
.setValidator(a -> a.checkAllowedInMode(AnalysisMode.SEARCH_TIME));
57+
.addValidator(a -> a.checkAllowedInMode(AnalysisMode.SEARCH_TIME));
5858
this.searchQuoteAnalyzer
5959
= Parameter.analyzerParam("search_quote_analyzer", true,
6060
m -> m.fieldType().getTextSearchInfo().getSearchQuoteAnalyzer(), () -> {
@@ -66,10 +66,10 @@ public Analyzers(IndexAnalyzers indexAnalyzers,
6666
}
6767
return searchAnalyzer.get();
6868
})
69-
.setValidator(a -> a.checkAllowedInMode(AnalysisMode.SEARCH_TIME));
69+
.addValidator(a -> a.checkAllowedInMode(AnalysisMode.SEARCH_TIME));
7070
this.positionIncrementGap = Parameter.intParam("position_increment_gap", false,
7171
m -> analyzerInitFunction.apply(m).positionIncrementGap.get(), TextFieldMapper.Defaults.POSITION_INCREMENT_GAP)
72-
.setValidator(v -> {
72+
.addValidator(v -> {
7373
if (v < 0) {
7474
throw new MapperParsingException("[position_increment_gap] must be positive, got [" + v + "]");
7575
}

server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public static class Builder extends FieldMapper.Builder {
114114

115115
final Parameter<Integer> depthLimit
116116
= Parameter.intParam("depth_limit", true, m -> builder(m).depthLimit.get(), Defaults.DEPTH_LIMIT)
117-
.setValidator(v -> {
117+
.addValidator(v -> {
118118
if (v < 0) {
119119
throw new IllegalArgumentException("[depth_limit] must be positive, got [" + v + "]");
120120
}

0 commit comments

Comments
 (0)