From 4c53a14ab59cea262f3e62ce21f81d915c1653cc Mon Sep 17 00:00:00 2001 From: jeffganmr <106223805+jeffganmr@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:22:48 +0800 Subject: [PATCH] fix stale data in synthetic source for string stored field (#123105) --- docs/changelog/123105.yaml | 6 +++ .../mapper/StringStoredFieldFieldLoader.java | 2 +- .../StringStoredFieldFieldLoaderTests.java | 52 +++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/123105.yaml create mode 100644 server/src/test/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoaderTests.java diff --git a/docs/changelog/123105.yaml b/docs/changelog/123105.yaml new file mode 100644 index 0000000000000..f763b51436434 --- /dev/null +++ b/docs/changelog/123105.yaml @@ -0,0 +1,6 @@ +pr: 123105 +summary: fix stale data in synthetic source for string stored field +area: Mapping +type: bug +issues: + - 123110 diff --git a/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java index c8a8dd4b4a898..c114a1619c7a9 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java @@ -54,7 +54,7 @@ public final void write(XContentBuilder b) throws IOException { case 1: b.field(simpleName); write(b, values.get(0)); - return; + break; default: b.startArray(simpleName); for (Object value : values) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoaderTests.java b/server/src/test/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoaderTests.java new file mode 100644 index 0000000000000..dcd6c35ab1700 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoaderTests.java @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.index.mapper; + +import org.elasticsearch.common.Strings; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xcontent.XContentBuilder; +import org.elasticsearch.xcontent.XContentType; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class StringStoredFieldFieldLoaderTests extends ESTestCase { + + public void testLoadStoredFieldAndReset() throws IOException { + var sfl = new StringStoredFieldFieldLoader("foo", "foo") { + @Override + protected void write(XContentBuilder b, Object value) throws IOException { + b.value((String) value); + } + }; + + var storedFieldLoaders = sfl.storedFieldLoaders().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + storedFieldLoaders.get("foo").load(List.of("one")); + + var result = XContentBuilder.builder(XContentType.JSON.xContent()); + result.startObject(); + sfl.write(result); + result.endObject(); + + assertEquals(""" + {"foo":"one"}""", Strings.toString(result)); + + var empty = XContentBuilder.builder(XContentType.JSON.xContent()); + empty.startObject(); + // reset() should have been called after previous write + sfl.write(empty); + empty.endObject(); + + assertEquals("{}", Strings.toString(empty)); + } + +}