Skip to content

Commit a39ffbc

Browse files
committed
moving merge methods out of DataStream
1 parent 39e41c0 commit a39ffbc

File tree

6 files changed

+167
-105
lines changed

6 files changed

+167
-105
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplate.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.common.io.stream.StreamInput;
1919
import org.elasticsearch.common.io.stream.StreamOutput;
2020
import org.elasticsearch.common.io.stream.Writeable;
21+
import org.elasticsearch.common.settings.Settings;
2122
import org.elasticsearch.core.Nullable;
2223
import org.elasticsearch.index.mapper.DataStreamTimestampFieldMapper;
2324
import org.elasticsearch.index.mapper.MapperService;
@@ -309,6 +310,33 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params, @Nulla
309310
return builder;
310311
}
311312

313+
/*
314+
* Merges the given settings into the settings in this ComposableIndexTemplate. Any null values in the
315+
* given settings are removed from the settings in the returned ComposableIndexTemplate. If this
316+
* ComposableIndexTemplate has no settings, the given settings are the only ones in the returned template
317+
* (with any null values removed). If this ComposableIndexTemplate has no template, an empty template with
318+
* those settings is created. If the given settings are null or empty, this ComposableIndexTemplate is just
319+
* returned unchanged. This method never changes this object.
320+
*/
321+
public ComposableIndexTemplate mergeSettings(Settings settings) {
322+
if (settings == null || Settings.EMPTY.equals(settings)) {
323+
return this;
324+
}
325+
ComposableIndexTemplate.Builder mergedIndexTemplateBuilder = this.toBuilder();
326+
Template.Builder mergedTemplateBuilder;
327+
Settings templateSettings;
328+
if (this.template() == null) {
329+
mergedTemplateBuilder = Template.builder();
330+
templateSettings = null;
331+
} else {
332+
mergedTemplateBuilder = Template.builder(this.template());
333+
templateSettings = this.template().settings();
334+
}
335+
mergedTemplateBuilder.settings(templateSettings == null ? settings : templateSettings.merge(settings));
336+
mergedIndexTemplateBuilder.template(mergedTemplateBuilder);
337+
return mergedIndexTemplateBuilder.build();
338+
}
339+
312340
@Override
313341
public int hashCode() {
314342
return Objects.hash(

server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
import java.util.ArrayList;
5959
import java.util.Comparator;
6060
import java.util.HashMap;
61-
import java.util.HashSet;
6261
import java.util.List;
6362
import java.util.Locale;
6463
import java.util.Map;
@@ -377,52 +376,19 @@ public boolean rolloverOnWrite() {
377376
}
378377

379378
public ComposableIndexTemplate getEffectiveIndexTemplate(ProjectMetadata projectMetadata) {
380-
return mergeSettingsIntoTemplate(getMatchingIndexTemplate(projectMetadata), settings);
379+
return getMatchingIndexTemplate(projectMetadata).mergeSettings(settings);
381380
}
382381

383382
public Settings getEffectiveSettings(ProjectMetadata projectMetadata) {
384383
ComposableIndexTemplate template = getMatchingIndexTemplate(projectMetadata);
385-
return mergeSettings(template.template() == null ? Settings.EMPTY : template.template().settings(), settings);
384+
Settings templateSettings = template.template() == null ? Settings.EMPTY : template.template().settings();
385+
return templateSettings.merge(settings);
386386
}
387387

388388
private ComposableIndexTemplate getMatchingIndexTemplate(ProjectMetadata projectMetadata) {
389389
return lookupTemplateForDataStream(name, projectMetadata);
390390
}
391391

392-
public static ComposableIndexTemplate mergeSettingsIntoTemplate(ComposableIndexTemplate template, Settings settings) {
393-
if (Settings.EMPTY.equals(settings)) {
394-
return template;
395-
}
396-
ComposableIndexTemplate.Builder mergedIndexTemplateBuilder = template.toBuilder();
397-
Template.Builder mergedTemplateBuilder;
398-
Settings templateSettings;
399-
if (template.template() == null) {
400-
mergedTemplateBuilder = Template.builder();
401-
templateSettings = null;
402-
} else {
403-
mergedTemplateBuilder = Template.builder(template.template());
404-
templateSettings = template.template().settings();
405-
}
406-
mergedTemplateBuilder.settings(mergeSettings(templateSettings, settings));
407-
mergedIndexTemplateBuilder.template(mergedTemplateBuilder);
408-
return mergedIndexTemplateBuilder.build();
409-
}
410-
411-
private static Settings mergeSettings(Settings originalSettings, Settings newSettings) {
412-
if (newSettings == null || Settings.EMPTY.equals(newSettings)) {
413-
return Objects.requireNonNullElse(originalSettings, Settings.EMPTY);
414-
} else if (originalSettings == null || Settings.EMPTY.equals(originalSettings)) {
415-
return newSettings;
416-
}
417-
Settings.Builder settingsBuilder = Settings.builder().put(originalSettings).put(newSettings);
418-
for (String settingName : new HashSet<>(settingsBuilder.keys())) {
419-
if (settingsBuilder.get(settingName) == null) {
420-
settingsBuilder.remove(settingName);
421-
}
422-
}
423-
return settingsBuilder.build();
424-
}
425-
426392
/**
427393
* We define that a data stream is considered internal either if it is a system index or if
428394
* its name starts with a dot.

server/src/main/java/org/elasticsearch/common/settings/Settings.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,24 @@ public Set<String> keySet() {
876876
return newKeySet;
877877
}
878878

879+
/*
880+
* This method merges the given newSettings into this Settings, returning either a new Settings object or
881+
* this if the newSettings are null or empty. If any values are null in newSettings, those keys are removed
882+
* from the returned object.
883+
*/
884+
public Settings merge(Settings newSettings) {
885+
if (newSettings == null || Settings.EMPTY.equals(newSettings)) {
886+
return this;
887+
}
888+
Settings.Builder settingsBuilder = Settings.builder().put(this).put(newSettings);
889+
for (String settingName : new HashSet<>(settingsBuilder.keys())) {
890+
if (settingsBuilder.get(settingName) == null) {
891+
settingsBuilder.remove(settingName);
892+
}
893+
}
894+
return settingsBuilder.build();
895+
}
896+
879897
/**
880898
* A builder allowing to put different settings and then {@link #build()} an immutable
881899
* settings implementation. Use {@link Settings#builder()} in order to

server/src/test/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplateTests.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.io.IOException;
2727
import java.util.Collections;
2828
import java.util.List;
29+
import java.util.Locale;
2930
import java.util.Map;
3031

3132
import static org.elasticsearch.cluster.metadata.DataStream.TIMESTAMP_FIELD_NAME;
@@ -277,4 +278,67 @@ public void testBuilderRoundtrip() {
277278
assertEquals(template.template(), Template.builder(template.template()).build());
278279
}
279280
}
281+
282+
public void testMergeSettings() {
283+
{
284+
// We only have settings from the template, so the effective template will just be the original template
285+
Settings templateSettings = randomSettings();
286+
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(randomMappings(null));
287+
ComposableIndexTemplate indexTemplate = randomInstance();
288+
assertThat(indexTemplate.mergeSettings(Settings.EMPTY), equalTo(indexTemplate));
289+
}
290+
{
291+
// We only have settings from the data stream, so we expect to get only those back in the effective template
292+
Settings dataStreamSettings = randomSettings();
293+
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT);
294+
Settings templateSettings = Settings.EMPTY;
295+
CompressedXContent templateMappings = randomMappings(randomDataStreamTemplate());
296+
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(templateMappings);
297+
ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder()
298+
.indexPatterns(List.of(dataStreamName))
299+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
300+
.template(templateBuilder)
301+
.build();
302+
Template.Builder expectedTemplateBuilder = Template.builder().settings(dataStreamSettings).mappings(templateMappings);
303+
ComposableIndexTemplate expectedEffectiveTemplate = ComposableIndexTemplate.builder()
304+
.indexPatterns(List.of(dataStreamName))
305+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
306+
.template(expectedTemplateBuilder)
307+
.build();
308+
assertThat(indexTemplate.mergeSettings(dataStreamSettings), equalTo(expectedEffectiveTemplate));
309+
}
310+
{
311+
// Here we have settings from both the template and the data stream, so we expect the data stream settings to take precedence
312+
Settings dataStreamSettings = Settings.builder()
313+
.put("index.setting1", "dataStreamValue")
314+
.put("index.setting2", "dataStreamValue")
315+
.put("index.setting3", (String) null) // This one gets removed from the effective settings
316+
.build();
317+
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT);
318+
Settings templateSettings = Settings.builder()
319+
.put("index.setting1", "templateValue")
320+
.put("index.setting3", "templateValue")
321+
.put("index.setting4", "templateValue")
322+
.build();
323+
CompressedXContent templateMappings = randomMappings(randomDataStreamTemplate());
324+
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(templateMappings);
325+
ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder()
326+
.indexPatterns(List.of(dataStreamName))
327+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
328+
.template(templateBuilder)
329+
.build();
330+
Settings mergedSettings = Settings.builder()
331+
.put("index.setting1", "dataStreamValue")
332+
.put("index.setting2", "dataStreamValue")
333+
.put("index.setting4", "templateValue")
334+
.build();
335+
Template.Builder expectedTemplateBuilder = Template.builder().settings(mergedSettings).mappings(templateMappings);
336+
ComposableIndexTemplate expectedEffectiveTemplate = ComposableIndexTemplate.builder()
337+
.indexPatterns(List.of(dataStreamName))
338+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
339+
.template(expectedTemplateBuilder)
340+
.build();
341+
assertThat(indexTemplate.mergeSettings(dataStreamSettings), equalTo(expectedEffectiveTemplate));
342+
}
343+
}
280344
}

server/src/test/java/org/elasticsearch/cluster/metadata/DataStreamTests.java

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2778,74 +2778,6 @@ public void testGetEffectiveIndexTemplate() {
27782778
}
27792779
}
27802780

2781-
public void testMergeSettingsIntoTemplate() {
2782-
{
2783-
// We only have settings from the template, so the effective template will just be the original template
2784-
DataStream dataStream = createDataStream(Settings.EMPTY);
2785-
Settings templateSettings = randomSettings();
2786-
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(randomMappings());
2787-
ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder()
2788-
.indexPatterns(List.of(dataStream.getName()))
2789-
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
2790-
.template(templateBuilder)
2791-
.build();
2792-
assertThat(DataStream.mergeSettingsIntoTemplate(indexTemplate, Settings.EMPTY), equalTo(indexTemplate));
2793-
}
2794-
{
2795-
// We only have settings from the data stream, so we expect to get only those back in the effective template
2796-
Settings dataStreamSettings = randomSettings();
2797-
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT);
2798-
Settings templateSettings = Settings.EMPTY;
2799-
CompressedXContent templateMappings = randomMappings();
2800-
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(templateMappings);
2801-
ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder()
2802-
.indexPatterns(List.of(dataStreamName))
2803-
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
2804-
.template(templateBuilder)
2805-
.build();
2806-
Template.Builder expectedTemplateBuilder = Template.builder().settings(dataStreamSettings).mappings(templateMappings);
2807-
ComposableIndexTemplate expectedEffectiveTemplate = ComposableIndexTemplate.builder()
2808-
.indexPatterns(List.of(dataStreamName))
2809-
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
2810-
.template(expectedTemplateBuilder)
2811-
.build();
2812-
assertThat(DataStream.mergeSettingsIntoTemplate(indexTemplate, dataStreamSettings), equalTo(expectedEffectiveTemplate));
2813-
}
2814-
{
2815-
// Here we have settings from both the template and the data stream, so we expect the data stream settings to take precedence
2816-
Settings dataStreamSettings = Settings.builder()
2817-
.put("index.setting1", "dataStreamValue")
2818-
.put("index.setting2", "dataStreamValue")
2819-
.put("index.setting3", (String) null) // This one gets removed from the effective settings
2820-
.build();
2821-
String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT);
2822-
Settings templateSettings = Settings.builder()
2823-
.put("index.setting1", "templateValue")
2824-
.put("index.setting3", "templateValue")
2825-
.put("index.setting4", "templateValue")
2826-
.build();
2827-
CompressedXContent templateMappings = randomMappings();
2828-
Template.Builder templateBuilder = Template.builder().settings(templateSettings).mappings(templateMappings);
2829-
ComposableIndexTemplate indexTemplate = ComposableIndexTemplate.builder()
2830-
.indexPatterns(List.of(dataStreamName))
2831-
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
2832-
.template(templateBuilder)
2833-
.build();
2834-
Settings mergedSettings = Settings.builder()
2835-
.put("index.setting1", "dataStreamValue")
2836-
.put("index.setting2", "dataStreamValue")
2837-
.put("index.setting4", "templateValue")
2838-
.build();
2839-
Template.Builder expectedTemplateBuilder = Template.builder().settings(mergedSettings).mappings(templateMappings);
2840-
ComposableIndexTemplate expectedEffectiveTemplate = ComposableIndexTemplate.builder()
2841-
.indexPatterns(List.of(dataStreamName))
2842-
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate())
2843-
.template(expectedTemplateBuilder)
2844-
.build();
2845-
assertThat(DataStream.mergeSettingsIntoTemplate(indexTemplate, dataStreamSettings), equalTo(expectedEffectiveTemplate));
2846-
}
2847-
}
2848-
28492781
private DataStream createDataStream(Settings settings) {
28502782
DataStream dataStream = createTestInstance();
28512783
return dataStream.copy().setSettings(settings).build();

server/src/test/java/org/elasticsearch/common/settings/SettingsTests.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,4 +722,58 @@ public void testGlobValues() throws IOException {
722722
assertThat(values, contains("1"));
723723
}
724724

725+
public void testMerge() {
726+
{
727+
assertThat(Settings.EMPTY.merge(null), equalTo(Settings.EMPTY));
728+
assertThat(Settings.EMPTY.merge(Settings.EMPTY), equalTo(Settings.EMPTY));
729+
}
730+
{
731+
Settings.Builder builder = Settings.builder();
732+
for (int i = 1; i < randomInt(100); i++) {
733+
builder.put(randomAlphanumericOfLength(20), randomAlphanumericOfLength(50));
734+
}
735+
Settings settings = builder.build();
736+
assertThat(settings.merge(null), equalTo(settings));
737+
assertThat(settings.merge(Settings.EMPTY), equalTo(settings));
738+
}
739+
{
740+
Settings.Builder builder = Settings.builder();
741+
for (int i = 1; i < randomInt(100); i++) {
742+
builder.put(randomAlphanumericOfLength(20), randomAlphanumericOfLength(50));
743+
}
744+
Settings newSettings = builder.build();
745+
assertThat(Settings.EMPTY.merge(newSettings), equalTo(newSettings));
746+
}
747+
{
748+
Settings settings = Settings.builder()
749+
.put("index.setting1", "templateValue")
750+
.put("index.setting3", "templateValue")
751+
.put("index.setting4", "templateValue")
752+
.build();
753+
Settings newSettings = Settings.builder()
754+
.put("index.setting1", "dataStreamValue")
755+
.put("index.setting2", "dataStreamValue")
756+
.put("index.setting3", (String) null) // This one gets removed from the effective settings
757+
.build();
758+
Settings mergedSettings = Settings.builder()
759+
.put("index.setting1", "dataStreamValue")
760+
.put("index.setting2", "dataStreamValue")
761+
.put("index.setting4", "templateValue")
762+
.build();
763+
assertThat(settings.merge(newSettings), equalTo(mergedSettings));
764+
}
765+
{
766+
Settings newSettings = Settings.builder()
767+
.put("index.setting1", "dataStreamValue")
768+
.put("index.setting2", "dataStreamValue")
769+
.put("index.setting3", (String) null) // This one gets removed from the effective settings
770+
.build();
771+
Settings mergedSettings = Settings.builder()
772+
.put("index.setting1", "dataStreamValue")
773+
.put("index.setting2", "dataStreamValue")
774+
.build();
775+
assertThat(Settings.EMPTY.merge(newSettings), equalTo(mergedSettings));
776+
}
777+
}
778+
725779
}

0 commit comments

Comments
 (0)