From 6b39b39d35215af761b5d0c2ce91f5d16da6941c Mon Sep 17 00:00:00 2001 From: cdalexndr Date: Thu, 11 Aug 2022 07:31:17 +0300 Subject: [PATCH] support RuntimeField with no script. Original Pull Request #2268 Closes #2267 --- .../client/elc/RequestConverter.java | 13 ++++--- .../data/elasticsearch/core/RuntimeField.java | 17 +++++++--- .../elasticsearch/core/RuntimeFieldTest.java | 34 +++++++++++++++++++ .../core/RuntimeFieldsIntegrationTests.java | 17 ++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldTest.java diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index 7b179dde6..f7cca8399 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -102,6 +102,7 @@ import org.springframework.util.StringUtils; * * @author Peter-Josef Meisch * @author Sascha Woo + * @author cdalxndr * @since 4.4 */ class RequestConverter { @@ -1130,12 +1131,16 @@ class RequestConverter { }); if (!query.getRuntimeFields().isEmpty()) { - Map> runtimeMappings = new HashMap<>(); query.getRuntimeFields().forEach(runtimeField -> { - runtimeMappings.put(runtimeField.getName(), Collections.singletonList(RuntimeField.of(rt -> rt // - .type(RuntimeFieldType._DESERIALIZER.parse(runtimeField.getType())) // - .script(s -> s.inline(is -> is.source(runtimeField.getScript())))))); + RuntimeField esRuntimeField = RuntimeField.of(rt -> { + RuntimeField.Builder builder = rt.type(RuntimeFieldType._DESERIALIZER.parse(runtimeField.getType())); + String script = runtimeField.getScript(); + if (script != null) + builder = builder.script(s -> s.inline(is -> is.source(script))); + return builder; + }); + runtimeMappings.put(runtimeField.getName(), Collections.singletonList(esRuntimeField)); }); bb.runtimeMappings(runtimeMappings); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/RuntimeField.java b/src/main/java/org/springframework/data/elasticsearch/core/RuntimeField.java index 84007b8a0..edb00c269 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/RuntimeField.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/RuntimeField.java @@ -18,25 +18,31 @@ package org.springframework.data.elasticsearch.core; import java.util.HashMap; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** * Defines a runtime field to be added to a Query * * @author Peter-Josef Meisch + * @author cdalxndr * @since 4.3 */ public class RuntimeField { private final String name; private final String type; + @Nullable private final String script; - public RuntimeField(String name, String type, String script) { + public RuntimeField(String name, String type){ + this(name, type, null); + } + + public RuntimeField(String name, String type, @Nullable String script) { Assert.notNull(name, "name must not be null"); Assert.notNull(type, "type must not be null"); - Assert.notNull(script, "script must not be null"); this.name = name; this.type = type; @@ -51,10 +57,11 @@ public class RuntimeField { * @return the mapping as a Map like it is needed for the Elasticsearch client */ public Map getMapping() { - Map map = new HashMap<>(); map.put("type", type); - map.put("script", script); + if (script != null) { + map.put("script", script); + } return map; } @@ -68,7 +75,7 @@ public class RuntimeField { /** * @since 4.4 */ - public String getScript() { + public @Nullable String getScript() { return script; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldTest.java b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldTest.java new file mode 100644 index 000000000..3f53d54d5 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldTest.java @@ -0,0 +1,34 @@ +package org.springframework.data.elasticsearch.core; + + +import static org.assertj.core.api.Assertions.*; + +import java.util.Map; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * @author cdalxndr + */ +class RuntimeFieldTest { + + @Test //#2267 + @DisplayName("should return mapping with script") + void testMapping() { + RuntimeField runtimeField = new RuntimeField("name", "double", "myscript"); + Map mapping = runtimeField.getMapping(); + assertThat(mapping).containsEntry("type", "double") + .containsEntry("script", "myscript"); + } + + @Test //#2267 + @DisplayName("should return mapping without script") + void testMappingNoScript() { + RuntimeField runtimeField = new RuntimeField("name", "double"); + Map mapping = runtimeField.getMapping(); + assertThat(mapping).containsEntry("type", "double") + .doesNotContainKey("script"); + } + +} \ No newline at end of file diff --git a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java index 55800c2a1..9fcb4fb13 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/RuntimeFieldsIntegrationTests.java @@ -38,6 +38,7 @@ import org.springframework.lang.Nullable; /** * @author Peter-Josef Meisch + * @author cdalxndr */ @SpringIntegrationTest public abstract class RuntimeFieldsIntegrationTests implements NewElasticsearchClientDevelopment { @@ -77,6 +78,22 @@ public abstract class RuntimeFieldsIntegrationTests implements NewElasticsearchC assertThat(searchHits.getSearchHit(0).getId()).isEqualTo("2"); } + @DisabledIf(value = "newElasticsearchClient", disabledReason = "todo #2171, ES issue 298") + @Test // #2267 + @DisplayName("should use runtime-field without script") + void shouldUseRuntimeFieldWithoutScript() { + + insert("1", "11", 10); + Query query = new CriteriaQuery(new Criteria("description").matches(11.0)); + RuntimeField runtimeField = new RuntimeField("description", "double"); + query.addRuntimeField(runtimeField); + + SearchHits searchHits = operations.search(query, SomethingToBuy.class); + + assertThat(searchHits.getTotalHits()).isEqualTo(1); + assertThat(searchHits.getSearchHit(0).getId()).isEqualTo("1"); + } + private void insert(String id, String description, double price) { SomethingToBuy entity = new SomethingToBuy(); entity.setId(id);