Skip to content

Commit 81eb167

Browse files
authored
Upgrade to Elasticsearch 8.15.0.
Ortiginal Pull Request #2974 Closes #2963
1 parent 6ad98bf commit 81eb167

File tree

11 files changed

+122
-129
lines changed

11 files changed

+122
-129
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<springdata.commons>3.4.0-SNAPSHOT</springdata.commons>
2222

2323
<!-- version of the ElasticsearchClient -->
24-
<elasticsearch-java>8.14.3</elasticsearch-java>
24+
<elasticsearch-java>8.15.0</elasticsearch-java>
2525

2626
<blockhound-junit>1.0.9.RELEASE</blockhound-junit>
2727
<hoverfly>0.19.0</hoverfly>

src/main/antora/modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[[new-features.5-4-0]]
55
== New in Spring Data Elasticsearch 5.4
66

7-
* Upgrade to Elasticsearch 8.14.3.
7+
* Upgrade to Elasticsearch 8.15.0.
88
* Allow to customize the mapped type name for `@InnerField` and `@Field` annotations.
99
* Support for Elasticsearch SQL.
1010

src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ The following table shows the Elasticsearch and Spring versions that are used by
66
[cols="^,^,^,^",options="header"]
77
|===
88
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
9-
| 2024.1 (in development) | 5.3.x | 8.14.3 | 6.1.x
9+
| 2024.1 (in development) | 5.3.x | 8.15.0 | 6.1.x
1010
| 2024.0 | 5.3.1 | 8.13.4 | 6.1.x
1111
| 2023.1 (Vaughan) | 5.2.x | 8.11.1 | 6.1.x
1212
| 2023.0 (Ullmann) | 5.1.x | 8.7.1 | 6.0.x

src/main/java/org/springframework/data/elasticsearch/client/elc/CriteriaQueryProcessor.java

+39-34
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public static Query createQuery(Criteria criteria) {
127127
mustQueries.add(Query.of(qb -> qb.matchAll(m -> m)));
128128
}
129129

130-
return new Query.Builder().bool(boolQueryBuilder -> {
130+
return new Query.Builder().bool(boolQueryBuilder -> {
131131

132132
if (!shouldQueries.isEmpty()) {
133133
boolQueryBuilder.should(shouldQueries);
@@ -249,49 +249,54 @@ private static Query.Builder queryFor(Criteria.CriteriaEntry entry, Field field,
249249
queryBuilder.queryString(queryStringQuery(fieldName, Objects.requireNonNull(value).toString(), boost));
250250
break;
251251
case LESS:
252-
queryBuilder //
253-
.range(rb -> rb //
254-
.field(fieldName) //
255-
.lt(JsonData.of(value)) //
256-
.boost(boost)); //
252+
queryBuilder
253+
.range(rb -> rb
254+
.untyped(ut -> ut
255+
.field(fieldName)
256+
.lt(JsonData.of(value))
257+
.boost(boost)));
257258
break;
258259
case LESS_EQUAL:
259-
queryBuilder //
260-
.range(rb -> rb //
261-
.field(fieldName) //
262-
.lte(JsonData.of(value)) //
263-
.boost(boost)); //
260+
queryBuilder
261+
.range(rb -> rb
262+
.untyped(ut -> ut
263+
.field(fieldName)
264+
.lte(JsonData.of(value))
265+
.boost(boost)));
264266
break;
265267
case GREATER:
266-
queryBuilder //
267-
.range(rb -> rb //
268-
.field(fieldName) //
269-
.gt(JsonData.of(value)) //
270-
.boost(boost)); //
268+
queryBuilder
269+
.range(rb -> rb
270+
.untyped(ut -> ut
271+
.field(fieldName)
272+
.gt(JsonData.of(value))
273+
.boost(boost)));
271274
break;
272275
case GREATER_EQUAL:
273-
queryBuilder //
274-
.range(rb -> rb //
275-
.field(fieldName) //
276-
.gte(JsonData.of(value)) //
277-
.boost(boost)); //
276+
queryBuilder
277+
.range(rb -> rb
278+
.untyped(ut -> ut
279+
.field(fieldName)
280+
.gte(JsonData.of(value))
281+
.boost(boost)));
278282
break;
279283
case BETWEEN:
280284
Object[] ranges = (Object[]) value;
281285
Assert.notNull(value, "value for a between condition must not be null");
282-
queryBuilder //
283-
.range(rb -> {
284-
rb.field(fieldName);
285-
if (ranges[0] != null) {
286-
rb.gte(JsonData.of(ranges[0]));
287-
}
288-
289-
if (ranges[1] != null) {
290-
rb.lte(JsonData.of(ranges[1]));
291-
}
292-
rb.boost(boost); //
293-
return rb;
294-
}); //
286+
queryBuilder
287+
.range(rb -> rb
288+
.untyped(ut -> {
289+
ut.field(fieldName);
290+
if (ranges[0] != null) {
291+
ut.gte(JsonData.of(ranges[0]));
292+
}
293+
294+
if (ranges[1] != null) {
295+
ut.lte(JsonData.of(ranges[1]));
296+
}
297+
ut.boost(boost); //
298+
return ut;
299+
}));
295300

296301
break;
297302
case FUZZY:

src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchClient.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public <T> Mono<GetResponse<T>> get(GetRequest request, Class<T> tClass) {
126126
// java.lang.Class<TDocument>)
127127
// noinspection unchecked
128128
JsonEndpoint<GetRequest, GetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<GetRequest, GetResponse<T>, ErrorResponse>) GetRequest._ENDPOINT;
129-
endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.get.TDocument",
129+
endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.get.Response.TDocument",
130130
getDeserializer(tClass));
131131

132132
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions));
@@ -145,7 +145,7 @@ public <T, P> Mono<UpdateResponse<T>> update(UpdateRequest<T, P> request, Class<
145145

146146
// noinspection unchecked
147147
JsonEndpoint<UpdateRequest<?, ?>, UpdateResponse<T>, ErrorResponse> endpoint = new EndpointWithResponseMapperAttr(
148-
UpdateRequest._ENDPOINT, "co.elastic.clients:Deserializer:_global.update.TDocument",
148+
UpdateRequest._ENDPOINT, "co.elastic.clients:Deserializer:_global.update.Response.TDocument",
149149
this.getDeserializer(clazz));
150150
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, this.transportOptions));
151151
}
@@ -171,7 +171,7 @@ public <T> Mono<MgetResponse<T>> mget(MgetRequest request, Class<T> clazz) {
171171

172172
// noinspection unchecked
173173
JsonEndpoint<MgetRequest, MgetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<MgetRequest, MgetResponse<T>, ErrorResponse>) MgetRequest._ENDPOINT;
174-
endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.mget.TDocument",
174+
endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.mget.Response.TDocument",
175175
this.getDeserializer(clazz));
176176

177177
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions));
@@ -282,7 +282,7 @@ public <T> Mono<ScrollResponse<T>> scroll(ScrollRequest request, Class<T> tDocum
282282
// noinspection unchecked
283283
JsonEndpoint<ScrollRequest, ScrollResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<ScrollRequest, ScrollResponse<T>, ErrorResponse>) ScrollRequest._ENDPOINT;
284284
endpoint = new EndpointWithResponseMapperAttr<>(endpoint,
285-
"co.elastic.clients:Deserializer:_global.scroll.TDocument", getDeserializer(tDocumentClass));
285+
"co.elastic.clients:Deserializer:_global.scroll.Response.TDocument", getDeserializer(tDocumentClass));
286286

287287
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions));
288288
}

src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java

+28-40
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import co.elastic.clients.elasticsearch._types.Conflicts;
2222
import co.elastic.clients.elasticsearch._types.ExpandWildcard;
23-
import co.elastic.clients.elasticsearch._types.InlineScript;
2423
import co.elastic.clients.elasticsearch._types.NestedSortValue;
2524
import co.elastic.clients.elasticsearch._types.OpType;
2625
import co.elastic.clients.elasticsearch._types.SortOptions;
@@ -744,16 +743,12 @@ private co.elastic.clients.elasticsearch._types.Script getScript(@Nullable Scrip
744743
scriptData.params().forEach((key, value) -> params.put(key, JsonData.of(value, jsonpMapper)));
745744
}
746745
return co.elastic.clients.elasticsearch._types.Script.of(sb -> {
746+
sb.lang(scriptData.language())
747+
.params(params);
747748
if (scriptData.type() == ScriptType.INLINE) {
748-
sb.inline(is -> is //
749-
.lang(scriptData.language()) //
750-
.source(scriptData.script()) //
751-
.params(params)); //
749+
sb.source(scriptData.script());
752750
} else if (scriptData.type() == ScriptType.STORED) {
753-
sb.stored(ss -> ss //
754-
.id(scriptData.script()) //
755-
.params(params) //
756-
);
751+
sb.id(scriptData.script());
757752
}
758753
return sb;
759754
});
@@ -925,7 +920,9 @@ public co.elastic.clients.elasticsearch.core.ReindexRequest reindex(ReindexReque
925920

926921
ReindexRequest.Script script = reindexRequest.getScript();
927922
if (script != null) {
928-
builder.script(s -> s.inline(InlineScript.of(i -> i.lang(script.getLang()).source(script.getSource()))));
923+
builder.script(sb -> sb
924+
.lang(script.getLang())
925+
.source(script.getSource()));
929926
}
930927

931928
builder.timeout(time(reindexRequest.getTimeout())) //
@@ -1078,21 +1075,15 @@ public DeleteByQueryRequest documentDeleteByQueryRequest(DeleteQuery query, @Nul
10781075
}
10791076

10801077
uqb.script(sb -> {
1078+
sb.lang(query.getLang()).params(params);
1079+
10811080
if (query.getScriptType() == ScriptType.INLINE) {
1082-
sb.inline(is -> is //
1083-
.lang(query.getLang()) //
1084-
.source(query.getScript()) //
1085-
.params(params)); //
1081+
sb.source(query.getScript()); //
10861082
} else if (query.getScriptType() == ScriptType.STORED) {
1087-
sb.stored(ss -> ss //
1088-
.id(query.getScript()) //
1089-
.params(params) //
1090-
);
1083+
sb.id(query.getScript());
10911084
}
10921085
return sb;
1093-
}
1094-
1095-
);
1086+
});
10961087
}
10971088

10981089
uqb //
@@ -1347,17 +1338,16 @@ public MsearchRequest searchMsearchRequest(
13471338
String script = runtimeField.getScript();
13481339

13491340
if (script != null) {
1350-
rfb
1351-
.script(s -> s
1352-
.inline(is -> {
1353-
is.source(script);
1354-
1355-
if (runtimeField.getParams() != null) {
1356-
is.params(TypeUtils.paramsMap(runtimeField.getParams()));
1357-
}
1358-
return is;
1359-
}));
1341+
rfb.script(s -> {
1342+
s.source(script);
1343+
1344+
if (runtimeField.getParams() != null) {
1345+
s.params(TypeUtils.paramsMap(runtimeField.getParams()));
1346+
}
1347+
return s;
1348+
});
13601349
}
1350+
13611351
return rfb;
13621352
});
13631353
runtimeMappings.put(runtimeField.getName(), esRuntimeField);
@@ -1548,16 +1538,14 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
15481538
rfb.type(RuntimeFieldType._DESERIALIZER.parse(runtimeField.getType()));
15491539
String script = runtimeField.getScript();
15501540
if (script != null) {
1551-
rfb
1552-
.script(s -> s
1553-
.inline(is -> {
1554-
is.source(script);
1541+
rfb.script(s -> {
1542+
s.source(script);
15551543

1556-
if (runtimeField.getParams() != null) {
1557-
is.params(TypeUtils.paramsMap(runtimeField.getParams()));
1558-
}
1559-
return is;
1560-
}));
1544+
if (runtimeField.getParams() != null) {
1545+
s.params(TypeUtils.paramsMap(runtimeField.getParams()));
1546+
}
1547+
return s;
1548+
});
15611549
}
15621550

15631551
return rfb;

src/main/java/org/springframework/data/elasticsearch/core/mapping/IndexCoordinates.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ public class IndexCoordinates {
3434
private final String[] indexNames;
3535

3636
public static IndexCoordinates of(String... indexNames) {
37-
Assert.notNull(indexNames, "indexNames must not be null");
3837
return new IndexCoordinates(indexNames);
3938
}
4039

4140
private IndexCoordinates(String... indexNames) {
4241
Assert.notEmpty(indexNames, "indexNames may not be null or empty");
42+
Assert.noNullElements(indexNames, "indexNames may not contain null elements");
4343
this.indexNames = indexNames;
4444
}
4545

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchELCIntegrationTests.java

+36-38
Original file line numberDiff line numberDiff line change
@@ -190,44 +190,42 @@ protected Query getMatchAllQueryWithIncludesAndInlineExpressionScript(@Nullable
190190
@Override
191191
protected Query getQueryWithRescorer() {
192192

193-
return NativeQuery.builder() //
194-
.withQuery(q -> q //
195-
.bool(b -> b //
196-
.filter(f -> f.exists(e -> e.field("rate"))) //
197-
.should(s -> s.term(t -> t.field("message").value("message"))) //
198-
)) //
199-
.withRescorerQuery( //
200-
new RescorerQuery(NativeQuery.builder() //
201-
.withQuery(q -> q //
202-
.functionScore(fs -> fs //
203-
.functions(f1 -> f1 //
204-
.filter(matchAllQueryAsQuery()) //
205-
.weight(1.0) //
206-
.gauss(d -> d //
207-
.field("rate") //
208-
.placement(dp -> dp //
209-
.origin(JsonData.of(0)) //
210-
.scale(JsonData.of(10)) //
211-
.decay(0.5)) //
212-
)) //
213-
.functions(f2 -> f2 //
214-
.filter(matchAllQueryAsQuery()).weight(100.0) //
215-
.gauss(d -> d //
216-
.field("rate") //
217-
.placement(dp -> dp //
218-
.origin(JsonData.of(0)) //
219-
.scale(JsonData.of(10)) //
220-
.decay(0.5)) //
221-
222-
)) //
223-
.scoreMode(FunctionScoreMode.Sum) //
224-
.maxBoost(80.0) //
225-
.boostMode(FunctionBoostMode.Replace)) //
226-
) //
227-
.build() //
228-
) //
229-
.withScoreMode(RescorerQuery.ScoreMode.Max) //
230-
.withWindowSize(100)) //
193+
return NativeQuery.builder()
194+
.withQuery(q -> q
195+
.bool(b -> b
196+
.filter(f -> f.exists(e -> e.field("rate")))
197+
.should(s -> s.term(t -> t.field("message").value("message")))))
198+
.withRescorerQuery(
199+
new RescorerQuery(NativeQuery.builder()
200+
.withQuery(q -> q
201+
.functionScore(fs -> fs
202+
.functions(f1 -> f1
203+
.filter(matchAllQueryAsQuery())
204+
.weight(1.0)
205+
.gauss(d -> d
206+
.untyped(ut -> ut
207+
.field("rate")
208+
.placement(dp -> dp
209+
.origin(JsonData.of(0))
210+
.scale(JsonData.of(10))
211+
.decay(0.5)))))
212+
.functions(f2 -> f2
213+
.filter(matchAllQueryAsQuery()).weight(100.0)
214+
.gauss(d -> d
215+
.untyped(ut -> ut
216+
.field("rate")
217+
.placement(dp -> dp
218+
.origin(JsonData.of(0))
219+
.scale(JsonData.of(10))
220+
.decay(0.5)))
221+
222+
))
223+
.scoreMode(FunctionScoreMode.Sum)
224+
.maxBoost(80.0)
225+
.boostMode(FunctionBoostMode.Replace)))
226+
.build())
227+
.withScoreMode(RescorerQuery.ScoreMode.Max)
228+
.withWindowSize(100))
231229
.build();
232230
}
233231
}

src/test/java/org/springframework/data/elasticsearch/core/IndexCoordinatesUnitTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@
2323
/**
2424
* @author Peter-Josef Meisch
2525
*/
26+
@SuppressWarnings("DataFlowIssue")
2627
class IndexCoordinatesUnitTests {
2728

2829
@Test
2930
void cannotBeInitializedWithNullIndexName() {
30-
assertThatThrownBy(() -> IndexCoordinates.of(null)).isInstanceOf(IllegalArgumentException.class);
31+
assertThatThrownBy(() -> IndexCoordinates.of((String) null)).isInstanceOf(IllegalArgumentException.class);
3132
}
3233

3334
@Test

0 commit comments

Comments
 (0)