diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java index 5583424b5d36a..4f99a75122da1 100644 --- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java +++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java @@ -75,7 +75,7 @@ public void execute(IngestDocument ingestDocument, BiConsumer(values.size()), ingestDocument, handler); + innerExecute(0, new ArrayList<>(values), new ArrayList<>(values.size()), ingestDocument, handler); } } diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ForEachProcessorTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ForEachProcessorTests.java index e63c75f34da19..5682e529326f5 100644 --- a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ForEachProcessorTests.java +++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ForEachProcessorTests.java @@ -289,6 +289,28 @@ public void testIgnoreMissing() throws Exception { assertThat(testProcessor.getInvokedCounter(), equalTo(0)); } + public void testAppendingToTheSameField() { + IngestDocument originalIngestDocument = new IngestDocument("_index", "_id", null, null, null, Map.of("field", List.of("a", "b"))); + IngestDocument ingestDocument = new IngestDocument(originalIngestDocument); + TestProcessor testProcessor = new TestProcessor(id->id.appendFieldValue("field", "a")); + ForEachProcessor processor = new ForEachProcessor("_tag", null, "field", testProcessor, true); + processor.execute(ingestDocument, (result, e) -> {}); + assertThat(testProcessor.getInvokedCounter(), equalTo(2)); + ingestDocument.removeField("_ingest._value"); + assertThat(ingestDocument, equalTo(originalIngestDocument)); + } + + public void testRemovingFromTheSameField() { + IngestDocument originalIngestDocument = new IngestDocument("_index", "_id", null, null, null, Map.of("field", List.of("a", "b"))); + IngestDocument ingestDocument = new IngestDocument(originalIngestDocument); + TestProcessor testProcessor = new TestProcessor(id -> id.removeField("field.0")); + ForEachProcessor processor = new ForEachProcessor("_tag", null, "field", testProcessor, true); + processor.execute(ingestDocument, (result, e) -> {}); + assertThat(testProcessor.getInvokedCounter(), equalTo(2)); + ingestDocument.removeField("_ingest._value"); + assertThat(ingestDocument, equalTo(originalIngestDocument)); + } + private class AsyncUpperCaseProcessor implements Processor { private final String field;