Adapt custom routing.

Original Pull Request #2474
Closes #2087
This commit is contained in:
Peter-Josef Meisch 2023-02-21 20:17:45 +01:00 committed by GitHub
parent 9c80dc9ae8
commit c9b8b1af19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 132 additions and 74 deletions

View File

@ -174,8 +174,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, clazz, index, DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, routingResolver.getRouting(),
getRefreshPolicy()); clazz, index, getRefreshPolicy());
DeleteByQueryResponse response = execute(client -> client.deleteByQuery(request)); DeleteByQueryResponse response = execute(client -> client.deleteByQuery(request));
@ -309,7 +309,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(index, "index must not be null"); Assert.notNull(index, "index must not be null");
SearchRequest searchRequest = requestConverter.searchRequest(query, clazz, index, true); SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index,
true);
SearchResponse<EntityAsMap> searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class)); SearchResponse<EntityAsMap> searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class));
@ -331,7 +332,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
} }
protected <T> SearchHits<T> doSearch(Query query, Class<T> clazz, IndexCoordinates index) { protected <T> SearchHits<T> doSearch(Query query, Class<T> clazz, IndexCoordinates index) {
SearchRequest searchRequest = requestConverter.searchRequest(query, clazz, index, false); SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index,
false);
SearchResponse<EntityAsMap> searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class)); SearchResponse<EntityAsMap> searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class));
// noinspection DuplicatedCode // noinspection DuplicatedCode
@ -343,7 +345,7 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
} }
protected <T> SearchHits<T> doSearch(SearchTemplateQuery query, Class<T> clazz, IndexCoordinates index) { protected <T> SearchHits<T> doSearch(SearchTemplateQuery query, Class<T> clazz, IndexCoordinates index) {
var searchTemplateRequest = requestConverter.searchTemplate(query, index); var searchTemplateRequest = requestConverter.searchTemplate(query, routingResolver.getRouting(), index);
var searchTemplateResponse = execute(client -> client.searchTemplate(searchTemplateRequest, EntityAsMap.class)); var searchTemplateResponse = execute(client -> client.searchTemplate(searchTemplateRequest, EntityAsMap.class));
// noinspection DuplicatedCode // noinspection DuplicatedCode
@ -374,7 +376,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(query.getPageable(), "pageable of query must not be null."); Assert.notNull(query.getPageable(), "pageable of query must not be null.");
SearchRequest request = requestConverter.searchRequest(query, clazz, index, false, scrollTimeInMillis); SearchRequest request = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index, false,
scrollTimeInMillis);
SearchResponse<EntityAsMap> response = execute(client -> client.search(request, EntityAsMap.class)); SearchResponse<EntityAsMap> response = execute(client -> client.search(request, EntityAsMap.class));
return getSearchScrollHits(clazz, index, response); return getSearchScrollHits(clazz, index, response);
@ -492,7 +495,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate {
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
private List<SearchHits<?>> doMultiSearch(List<MultiSearchQueryParameter> multiSearchQueryParameters) { private List<SearchHits<?>> doMultiSearch(List<MultiSearchQueryParameter> multiSearchQueryParameters) {
MsearchRequest request = requestConverter.searchMsearchRequest(multiSearchQueryParameters); MsearchRequest request = requestConverter.searchMsearchRequest(multiSearchQueryParameters,
routingResolver.getRouting());
MsearchResponse<EntityAsMap> msearchResponse = execute(client -> client.msearch(request, EntityAsMap.class)); MsearchResponse<EntityAsMap> msearchResponse = execute(client -> client.msearch(request, EntityAsMap.class));
List<MultiSearchResponseItem<EntityAsMap>> responseItems = msearchResponse.responses(); List<MultiSearchResponseItem<EntityAsMap>> responseItems = msearchResponse.responses();

View File

@ -111,8 +111,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
return Mono.just(entity) // return Mono.just(entity) //
.zipWith(// .zipWith(//
Mono.from(execute((ClientCallback<Publisher<IndexResponse>>) client -> client.index(indexRequest))) // Mono.from(execute((ClientCallback<Publisher<IndexResponse>>) client -> client.index(indexRequest))) //
.map(indexResponse -> new IndexResponseMetaData( .map(indexResponse -> new IndexResponseMetaData(indexResponse.id(), //
indexResponse.id(), //
indexResponse.index(), // indexResponse.index(), //
indexResponse.seqNo(), // indexResponse.seqNo(), //
indexResponse.primaryTerm(), // indexResponse.primaryTerm(), //
@ -171,8 +170,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, entityType, index, DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, routingResolver.getRouting(),
getRefreshPolicy()); entityType, index, getRefreshPolicy());
return Mono return Mono
.from(execute((ClientCallback<Publisher<DeleteByQueryResponse>>) client -> client.deleteByQuery(request))) .from(execute((ClientCallback<Publisher<DeleteByQueryResponse>>) client -> client.deleteByQuery(request)))
.map(responseConverter::byQueryResponse); .map(responseConverter::byQueryResponse);
@ -391,7 +390,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
baseQuery.setPointInTime(new Query.PointInTime(psa.getPit(), pitKeepAlive)); baseQuery.setPointInTime(new Query.PointInTime(psa.getPit(), pitKeepAlive));
baseQuery.addSort(Sort.by("_shard_doc")); baseQuery.addSort(Sort.by("_shard_doc"));
SearchRequest firstSearchRequest = requestConverter.searchRequest(baseQuery, clazz, index, false, true); SearchRequest firstSearchRequest = requestConverter.searchRequest(baseQuery, routingResolver.getRouting(),
clazz, index, false, true);
return Mono.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client return Mono.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client
.search(firstSearchRequest, EntityAsMap.class))).expand(entityAsMapSearchResponse -> { .search(firstSearchRequest, EntityAsMap.class))).expand(entityAsMapSearchResponse -> {
@ -404,7 +404,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
List<Object> sortOptions = hits.get(hits.size() - 1).sort().stream().map(TypeUtils::toObject) List<Object> sortOptions = hits.get(hits.size() - 1).sort().stream().map(TypeUtils::toObject)
.collect(Collectors.toList()); .collect(Collectors.toList());
baseQuery.setSearchAfter(sortOptions); baseQuery.setSearchAfter(sortOptions);
SearchRequest followSearchRequest = requestConverter.searchRequest(baseQuery, clazz, index, false, true); SearchRequest followSearchRequest = requestConverter.searchRequest(baseQuery,
routingResolver.getRouting(), clazz, index, false, true);
return Mono.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client return Mono.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client
.search(followSearchRequest, EntityAsMap.class))); .search(followSearchRequest, EntityAsMap.class)));
}); });
@ -460,7 +461,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(index, "index must not be null"); Assert.notNull(index, "index must not be null");
SearchRequest searchRequest = requestConverter.searchRequest(query, entityType, index, true); SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), entityType, index,
true);
return Mono return Mono
.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client.search(searchRequest, .from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client.search(searchRequest,
@ -470,7 +472,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
private Flux<SearchDocument> doFindBounded(Query query, Class<?> clazz, IndexCoordinates index) { private Flux<SearchDocument> doFindBounded(Query query, Class<?> clazz, IndexCoordinates index) {
SearchRequest searchRequest = requestConverter.searchRequest(query, clazz, index, false, false); SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index,
false, false);
return Mono return Mono
.from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client.search(searchRequest, .from(execute((ClientCallback<Publisher<ResponseBody<EntityAsMap>>>) client -> client.search(searchRequest,
@ -481,7 +484,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
private Flux<SearchDocument> doSearch(SearchTemplateQuery query, Class<?> clazz, IndexCoordinates index) { private Flux<SearchDocument> doSearch(SearchTemplateQuery query, Class<?> clazz, IndexCoordinates index) {
var request = requestConverter.searchTemplate(query, index); var request = requestConverter.searchTemplate(query, routingResolver.getRouting(), index);
return Mono return Mono
.from(execute((ClientCallback<Publisher<SearchTemplateResponse<EntityAsMap>>>) client -> client .from(execute((ClientCallback<Publisher<SearchTemplateResponse<EntityAsMap>>>) client -> client
@ -496,7 +499,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(index, "index must not be null"); Assert.notNull(index, "index must not be null");
SearchRequest searchRequest = requestConverter.searchRequest(query, clazz, index, false); SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index,
false);
// noinspection unchecked // noinspection unchecked
SearchDocumentCallback<T> callback = new ReadSearchDocumentCallback<>((Class<T>) clazz, index); SearchDocumentCallback<T> callback = new ReadSearchDocumentCallback<>((Class<T>) clazz, index);

View File

@ -837,8 +837,8 @@ class RequestConverter {
}); });
} }
public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, Class<?> clazz, IndexCoordinates index, public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, @Nullable String routing, Class<?> clazz,
@Nullable RefreshPolicy refreshPolicy) { IndexCoordinates index, @Nullable RefreshPolicy refreshPolicy) {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
Assert.notNull(index, "index must not be null"); Assert.notNull(index, "index must not be null");
@ -857,6 +857,8 @@ class RequestConverter {
if (query.getRoute() != null) { if (query.getRoute() != null) {
b.routing(query.getRoute()); b.routing(query.getRoute());
} else if (StringUtils.hasText(routing)) {
b.routing(routing);
} }
return b; return b;
@ -998,23 +1000,24 @@ class RequestConverter {
// region search // region search
public <T> SearchRequest searchRequest(Query query, @Nullable Class<T> clazz, IndexCoordinates indexCoordinates, public <T> SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class<T> clazz,
boolean forCount) { IndexCoordinates indexCoordinates, boolean forCount) {
return searchRequest(query, clazz, indexCoordinates, forCount, false, null); return searchRequest(query, routing, clazz, indexCoordinates, forCount, false, null);
} }
public <T> SearchRequest searchRequest(Query query, @Nullable Class<T> clazz, IndexCoordinates indexCoordinates, public <T> SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class<T> clazz,
boolean forCount, long scrollTimeInMillis) { IndexCoordinates indexCoordinates, boolean forCount, long scrollTimeInMillis) {
return searchRequest(query, clazz, indexCoordinates, forCount, true, scrollTimeInMillis); return searchRequest(query, routing, clazz, indexCoordinates, forCount, true, scrollTimeInMillis);
} }
public <T> SearchRequest searchRequest(Query query, @Nullable Class<T> clazz, IndexCoordinates indexCoordinates, public <T> SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class<T> clazz,
boolean forCount, boolean forBatchedSearch) { IndexCoordinates indexCoordinates, boolean forCount, boolean forBatchedSearch) {
return searchRequest(query, clazz, indexCoordinates, forCount, forBatchedSearch, null); return searchRequest(query, routing, clazz, indexCoordinates, forCount, forBatchedSearch, null);
} }
public <T> SearchRequest searchRequest(Query query, @Nullable Class<T> clazz, IndexCoordinates indexCoordinates, public <T> SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class<T> clazz,
boolean forCount, boolean forBatchedSearch, @Nullable Long scrollTimeInMillis) { IndexCoordinates indexCoordinates, boolean forCount, boolean forBatchedSearch,
@Nullable Long scrollTimeInMillis) {
String[] indexNames = indexCoordinates.getIndexNames(); String[] indexNames = indexCoordinates.getIndexNames();
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
@ -1022,7 +1025,7 @@ class RequestConverter {
elasticsearchConverter.updateQuery(query, clazz); elasticsearchConverter.updateQuery(query, clazz);
SearchRequest.Builder builder = new SearchRequest.Builder(); SearchRequest.Builder builder = new SearchRequest.Builder();
prepareSearchRequest(query, clazz, indexCoordinates, builder, forCount, forBatchedSearch); prepareSearchRequest(query, routing, clazz, indexCoordinates, builder, forCount, forBatchedSearch);
if (scrollTimeInMillis != null) { if (scrollTimeInMillis != null) {
builder.scroll(t -> t.time(scrollTimeInMillis + "ms")); builder.scroll(t -> t.time(scrollTimeInMillis + "ms"));
@ -1030,13 +1033,20 @@ class RequestConverter {
builder.query(getQuery(query, clazz)); builder.query(getQuery(query, clazz));
if (StringUtils.hasText(query.getRoute())) {
builder.routing(query.getRoute());
}
if (StringUtils.hasText(routing)) {
builder.routing(routing);
}
addFilter(query, builder); addFilter(query, builder);
return builder.build(); return builder.build();
} }
public MsearchRequest searchMsearchRequest( public MsearchRequest searchMsearchRequest(
List<ElasticsearchTemplate.MultiSearchQueryParameter> multiSearchQueryParameters) { List<ElasticsearchTemplate.MultiSearchQueryParameter> multiSearchQueryParameters, @Nullable String routing) {
// basically the same stuff as in prepareSearchRequest, but the new Elasticsearch has different builders for a // basically the same stuff as in prepareSearchRequest, but the new Elasticsearch has different builders for a
// normal search and msearch // normal search and msearch
@ -1049,11 +1059,16 @@ class RequestConverter {
.header(h -> { .header(h -> {
h // h //
.index(Arrays.asList(param.index().getIndexNames())) // .index(Arrays.asList(param.index().getIndexNames())) //
.routing(query.getRoute()) //
.searchType(searchType(query.getSearchType())) // .searchType(searchType(query.getSearchType())) //
.requestCache(query.getRequestCache()) // .requestCache(query.getRequestCache()) //
; ;
if (StringUtils.hasText(query.getRoute())) {
h.routing(query.getRoute());
} else if (StringUtils.hasText(routing)) {
h.routing(routing);
}
if (query.getPreference() != null) { if (query.getPreference() != null) {
h.preference(query.getPreference()); h.preference(query.getPreference());
} }
@ -1156,8 +1171,8 @@ class RequestConverter {
}); });
} }
private <T> void prepareSearchRequest(Query query, @Nullable Class<T> clazz, IndexCoordinates indexCoordinates, private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nullable Class<T> clazz,
SearchRequest.Builder builder, boolean forCount, boolean forBatchedSearch) { IndexCoordinates indexCoordinates, SearchRequest.Builder builder, boolean forCount, boolean forBatchedSearch) {
String[] indexNames = indexCoordinates.getIndexNames(); String[] indexNames = indexCoordinates.getIndexNames();
@ -1190,6 +1205,8 @@ class RequestConverter {
if (query.getRoute() != null) { if (query.getRoute() != null) {
builder.routing(query.getRoute()); builder.routing(query.getRoute());
} else if (StringUtils.hasText(routing)) {
builder.routing(routing);
} }
if (query.getPreference() != null) { if (query.getPreference() != null) {
@ -1559,7 +1576,8 @@ class RequestConverter {
return ClosePointInTimeRequest.of(cpit -> cpit.id(pit)); return ClosePointInTimeRequest.of(cpit -> cpit.id(pit));
} }
public SearchTemplateRequest searchTemplate(SearchTemplateQuery query, IndexCoordinates index) { public SearchTemplateRequest searchTemplate(SearchTemplateQuery query, @Nullable String routing,
IndexCoordinates index) {
Assert.notNull(query, "query must not be null"); Assert.notNull(query, "query must not be null");
@ -1570,10 +1588,15 @@ class RequestConverter {
.id(query.getId()) // .id(query.getId()) //
.index(Arrays.asList(index.getIndexNames())) // .index(Arrays.asList(index.getIndexNames())) //
.preference(query.getPreference()) // .preference(query.getPreference()) //
.routing(query.getRoute()) //
.searchType(searchType(query.getSearchType())).source(query.getSource()) // .searchType(searchType(query.getSearchType())).source(query.getSource()) //
; ;
if (query.getRoute() != null) {
builder.routing(query.getRoute());
} else if (StringUtils.hasText(routing)) {
builder.routing(routing);
}
var expandWildcards = query.getExpandWildcards(); var expandWildcards = query.getExpandWildcards();
if (!expandWildcards.isEmpty()) { if (!expandWildcards.isEmpty()) {
builder.expandWildcards(expandWildcards(expandWildcards)); builder.expandWildcards(expandWildcards(expandWildcards));

View File

@ -261,7 +261,8 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
@Override @Override
public ByQueryResponse delete(Query query, Class<?> clazz, IndexCoordinates index) { public ByQueryResponse delete(Query query, Class<?> clazz, IndexCoordinates index) {
DeleteByQueryRequest deleteByQueryRequest = requestFactory.deleteByQueryRequest(query, clazz, index); DeleteByQueryRequest deleteByQueryRequest = requestFactory.deleteByQueryRequest(query, routingResolver.getRouting(),
clazz, index);
return ResponseConverter return ResponseConverter
.byQueryResponseOf(execute(client -> client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT))); .byQueryResponseOf(execute(client -> client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT)));
} }
@ -398,7 +399,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
final Boolean trackTotalHits = query.getTrackTotalHits(); final Boolean trackTotalHits = query.getTrackTotalHits();
query.setTrackTotalHits(true); query.setTrackTotalHits(true);
SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); SearchRequest searchRequest = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index);
query.setTrackTotalHits(trackTotalHits); query.setTrackTotalHits(trackTotalHits);
searchRequest.source().size(0); searchRequest.source().size(0);
@ -409,7 +410,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
@Override @Override
public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) { public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) {
SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); SearchRequest searchRequest = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index);
SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT)); SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT));
ReadDocumentCallback<T> documentCallback = new ReadDocumentCallback<>(elasticsearchConverter, clazz, index); ReadDocumentCallback<T> documentCallback = new ReadDocumentCallback<>(elasticsearchConverter, clazz, index);
@ -431,7 +432,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
Assert.notNull(query.getPageable(), "pageable of query must not be null."); Assert.notNull(query.getPageable(), "pageable of query must not be null.");
SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); SearchRequest searchRequest = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index);
searchRequest.scroll(TimeValue.timeValueMillis(scrollTimeInMillis)); searchRequest.scroll(TimeValue.timeValueMillis(scrollTimeInMillis));
SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT)); SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT));
@ -477,7 +478,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) { public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) {
MultiSearchRequest request = new MultiSearchRequest(); MultiSearchRequest request = new MultiSearchRequest();
for (Query query : queries) { for (Query query : queries) {
request.add(requestFactory.searchRequest(query, clazz, index)); request.add(requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index));
} }
MultiSearchResponse.Item[] items = getMultiSearchResult(request); MultiSearchResponse.Item[] items = getMultiSearchResult(request);
@ -504,7 +505,8 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
Iterator<Class<?>> it = classes.iterator(); Iterator<Class<?>> it = classes.iterator();
for (Query query : queries) { for (Query query : queries) {
Class<?> clazz = it.next(); Class<?> clazz = it.next();
request.add(requestFactory.searchRequest(query, clazz, getIndexCoordinatesFor(clazz))); request
.add(requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, getIndexCoordinatesFor(clazz)));
} }
MultiSearchResponse.Item[] items = getMultiSearchResult(request); MultiSearchResponse.Item[] items = getMultiSearchResult(request);
@ -538,7 +540,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
MultiSearchRequest request = new MultiSearchRequest(); MultiSearchRequest request = new MultiSearchRequest();
Iterator<Class<?>> it = classes.iterator(); Iterator<Class<?>> it = classes.iterator();
for (Query query : queries) { for (Query query : queries) {
request.add(requestFactory.searchRequest(query, it.next(), index)); request.add(requestFactory.searchRequest(query, routingResolver.getRouting(), it.next(), index));
} }
MultiSearchResponse.Item[] items = getMultiSearchResult(request); MultiSearchResponse.Item[] items = getMultiSearchResult(request);
@ -572,7 +574,7 @@ public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate {
Iterator<Class<?>> it = classes.iterator(); Iterator<Class<?>> it = classes.iterator();
Iterator<IndexCoordinates> indexesIt = indexes.iterator(); Iterator<IndexCoordinates> indexesIt = indexes.iterator();
for (Query query : queries) { for (Query query : queries) {
request.add(requestFactory.searchRequest(query, it.next(), indexesIt.next())); request.add(requestFactory.searchRequest(query, routingResolver.getRouting(), it.next(), indexesIt.next()));
} }
MultiSearchResponse.Item[] items = getMultiSearchResult(request); MultiSearchResponse.Item[] items = getMultiSearchResult(request);

View File

@ -374,7 +374,8 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
protected Mono<BulkByScrollResponse> doDeleteBy(Query query, Class<?> entityType, IndexCoordinates index) { protected Mono<BulkByScrollResponse> doDeleteBy(Query query, Class<?> entityType, IndexCoordinates index) {
return Mono.defer(() -> { return Mono.defer(() -> {
DeleteByQueryRequest request = requestFactory.deleteByQueryRequest(query, entityType, index); DeleteByQueryRequest request = requestFactory.deleteByQueryRequest(query, routingResolver.getRouting(),
entityType, index);
return doDeleteBy(prepareDeleteByRequest(request)); return doDeleteBy(prepareDeleteByRequest(request));
}); });
} }
@ -505,7 +506,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
return Flux.defer(() -> { return Flux.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, clazz, index); SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index);
boolean useScroll = !(query.getPageable().isPaged() || query.isLimiting()); boolean useScroll = !(query.getPageable().isPaged() || query.isLimiting());
request = prepareSearchRequest(request, useScroll); request = prepareSearchRequest(request, useScroll);
@ -520,7 +521,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
protected <T> Mono<SearchDocumentResponse> doFindForResponse(Query query, Class<?> clazz, IndexCoordinates index) { protected <T> Mono<SearchDocumentResponse> doFindForResponse(Query query, Class<?> clazz, IndexCoordinates index) {
return Mono.defer(() -> { return Mono.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, clazz, index); SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index);
request = prepareSearchRequest(request, false); request = prepareSearchRequest(request, false);
SearchDocumentCallback<?> documentCallback = new ReadSearchDocumentCallback<>(clazz, index); SearchDocumentCallback<?> documentCallback = new ReadSearchDocumentCallback<>(clazz, index);
@ -540,7 +541,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
Assert.notNull(index, "index must not be null"); Assert.notNull(index, "index must not be null");
return Flux.defer(() -> { return Flux.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, entityType, index); SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), entityType, index);
request = prepareSearchRequest(request, false); request = prepareSearchRequest(request, false);
return doAggregate(request); return doAggregate(request);
}); });
@ -565,7 +566,7 @@ public class ReactiveElasticsearchTemplate extends AbstractReactiveElasticsearch
protected Mono<Long> doCount(Query query, Class<?> entityType, IndexCoordinates index) { protected Mono<Long> doCount(Query query, Class<?> entityType, IndexCoordinates index) {
return Mono.defer(() -> { return Mono.defer(() -> {
SearchRequest request = requestFactory.searchRequest(query, entityType, index); SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), entityType, index);
request = prepareSearchRequest(request, false); request = prepareSearchRequest(request, false);
return doCount(request); return doCount(request);
}); });

View File

@ -525,8 +525,8 @@ class RequestFactory {
// endregion // endregion
// region delete // region delete
public DeleteByQueryRequest deleteByQueryRequest(Query query, Class<?> clazz, IndexCoordinates index) { public DeleteByQueryRequest deleteByQueryRequest(Query query, @Nullable String routing, Class<?> clazz, IndexCoordinates index) {
SearchRequest searchRequest = searchRequest(query, clazz, index); SearchRequest searchRequest = searchRequest(query, routing, clazz, index);
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(index.getIndexNames()) // DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(index.getIndexNames()) //
.setQuery(searchRequest.source().query()) // .setQuery(searchRequest.source().query()) //
.setAbortOnVersionConflict(false) // .setAbortOnVersionConflict(false) //
@ -544,6 +544,8 @@ class RequestFactory {
if (query.getRoute() != null) { if (query.getRoute() != null) {
deleteByQueryRequest.setRouting(query.getRoute()); deleteByQueryRequest.setRouting(query.getRoute());
} else if (StringUtils.hasText(routing)) {
deleteByQueryRequest.setRouting(routing);
} }
return deleteByQueryRequest; return deleteByQueryRequest;
@ -751,10 +753,10 @@ class RequestFactory {
return searchRequest; return searchRequest;
} }
public SearchRequest searchRequest(Query query, @Nullable Class<?> clazz, IndexCoordinates index) { public SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class<?> clazz, IndexCoordinates index) {
elasticsearchConverter.updateQuery(query, clazz); elasticsearchConverter.updateQuery(query, clazz);
SearchRequest searchRequest = prepareSearchRequest(query, clazz, index); SearchRequest searchRequest = prepareSearchRequest(query, routing,clazz, index);
QueryBuilder elasticsearchQuery = getQuery(query); QueryBuilder elasticsearchQuery = getQuery(query);
QueryBuilder elasticsearchFilter = getFilter(query); QueryBuilder elasticsearchFilter = getFilter(query);
@ -768,7 +770,7 @@ class RequestFactory {
} }
private SearchRequest prepareSearchRequest(Query query, @Nullable Class<?> clazz, IndexCoordinates indexCoordinates) { private SearchRequest prepareSearchRequest(Query query, @Nullable String routing, @Nullable Class<?> clazz, IndexCoordinates indexCoordinates) {
String[] indexNames = indexCoordinates.getIndexNames(); String[] indexNames = indexCoordinates.getIndexNames();
Assert.notNull(indexNames, "No index defined for Query"); Assert.notNull(indexNames, "No index defined for Query");
@ -843,6 +845,8 @@ class RequestFactory {
if (StringUtils.hasLength(query.getRoute())) { if (StringUtils.hasLength(query.getRoute())) {
request.routing(query.getRoute()); request.routing(query.getRoute());
} else if (StringUtils.hasText(routing)) {
request.routing(routing);
} }
Duration timeout = query.getTimeout(); Duration timeout = query.getTimeout();

View File

@ -40,7 +40,7 @@ public class ElasticsearchPartQueryELCIntegrationTests extends ElasticsearchPart
JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(); JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper();
RequestConverter requestConverter = new RequestConverter(operations.getElasticsearchConverter(), jsonpMapper); RequestConverter requestConverter = new RequestConverter(operations.getElasticsearchConverter(), jsonpMapper);
SearchRequest request = requestConverter.searchRequest(query, clazz, IndexCoordinates.of("dummy"), false); SearchRequest request = requestConverter.searchRequest(query, null, clazz, IndexCoordinates.of("dummy"), false);
return JsonUtils.toJson(request, jsonpMapper); return JsonUtils.toJson(request, jsonpMapper);
// return "{\"query\":" + JsonUtils.toJson(request.query(), jsonpMapper) + "}"; // return "{\"query\":" + JsonUtils.toJson(request.query(), jsonpMapper) + "}";

View File

@ -62,7 +62,7 @@ class RequestConverterTest {
.withDocValueFields(docValueFields) // .withDocValueFields(docValueFields) //
.build(); .build();
var searchRequest = requestConverter.searchRequest(query, SampleEntity.class, IndexCoordinates.of("foo"), true); var searchRequest = requestConverter.searchRequest(query,null, SampleEntity.class, IndexCoordinates.of("foo"), true);
var fieldAndFormats = searchRequest.docvalueFields(); var fieldAndFormats = searchRequest.docvalueFields();
assertThat(fieldAndFormats).hasSize(2); assertThat(fieldAndFormats).hasSize(2);

View File

@ -40,7 +40,7 @@ public class ElasticsearchPartQueryERHLCIntegrationTests extends ElasticsearchPa
protected String buildQueryString(Query query, Class<?> clazz) { protected String buildQueryString(Query query, Class<?> clazz) {
SearchSourceBuilder source = new RequestFactory(operations.getElasticsearchConverter()) SearchSourceBuilder source = new RequestFactory(operations.getElasticsearchConverter())
.searchRequest(query, clazz, IndexCoordinates.of("dummy")).source(); .searchRequest(query, null, clazz, IndexCoordinates.of("dummy")).source();
// remove defaultboost values // remove defaultboost values
return source.toString().replaceAll("(\\^\\d+\\.\\d+)", ""); return source.toString().replaceAll("(\\^\\d+\\.\\d+)", "");
} }

View File

@ -110,7 +110,7 @@ class RequestFactoryTests {
.build(); .build();
// when // when
SearchRequest searchRequest = requestFactory.searchRequest(query, null, IndexCoordinates.of("test")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, null, IndexCoordinates.of("test"));
// then // then
assertThat(searchRequest.source().from()).isEqualTo(30); assertThat(searchRequest.source().from()).isEqualTo(30);
@ -218,21 +218,35 @@ class RequestFactoryTests {
" ]" + // " ]" + //
'}'; '}';
String searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")).source() String searchRequest = requestFactory.searchRequest(query, null, Person.class, IndexCoordinates.of("persons"))
.toString(); .source().toString();
assertEquals(expected, searchRequest, false); assertEquals(expected, searchRequest, false);
} }
@Test @Test
// DATAES-449 // DATAES-449
void shouldAddRouting() { void shouldAddRoutingFromQuery() {
String route = "route66"; String route = "route66";
CriteriaQuery query = new CriteriaQuery(new Criteria("lastName").is("Smith")); CriteriaQuery query = new CriteriaQuery(new Criteria("lastName").is("Smith"));
query.setRoute(route); query.setRoute(route);
converter.updateQuery(query, Person.class); converter.updateQuery(query, Person.class);
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.routing()).isEqualTo(route);
}
@Test
// #2087
void shouldAddRoutingFromRouting() {
String route = "route66";
CriteriaQuery query = new CriteriaQuery(new Criteria("lastName").is("Smith"));
converter.updateQuery(query, Person.class);
SearchRequest searchRequest = requestFactory.searchRequest(query, route, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.routing()).isEqualTo(route); assertThat(searchRequest.routing()).isEqualTo(route);
} }
@ -242,7 +256,8 @@ class RequestFactoryTests {
void shouldAddMaxQueryWindowForUnpagedToRequest() { void shouldAddMaxQueryWindowForUnpagedToRequest() {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(Pageable.unpaged()).build(); Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(Pageable.unpaged()).build();
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.source().from()).isEqualTo(0); assertThat(searchRequest.source().from()).isEqualTo(0);
assertThat(searchRequest.source().size()).isEqualTo(RequestFactory.INDEX_MAX_RESULT_WINDOW); assertThat(searchRequest.source().size()).isEqualTo(RequestFactory.INDEX_MAX_RESULT_WINDOW);
@ -267,7 +282,7 @@ class RequestFactoryTests {
void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassDoesNotContainSeqNoPrimaryTermProperty() { void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassDoesNotContainSeqNoPrimaryTermProperty() {
Query query = new NativeSearchQueryBuilder().build(); Query query = new NativeSearchQueryBuilder().build();
SearchRequest request = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest request = requestFactory.searchRequest(query, null, Person.class, IndexCoordinates.of("persons"));
assertThat(request.source().seqNoAndPrimaryTerm()).isNull(); assertThat(request.source().seqNoAndPrimaryTerm()).isNull();
} }
@ -277,7 +292,7 @@ class RequestFactoryTests {
void shouldRequestSeqNoAndPrimaryTermWhenEntityClassContainsSeqNoPrimaryTermProperty() { void shouldRequestSeqNoAndPrimaryTermWhenEntityClassContainsSeqNoPrimaryTermProperty() {
Query query = new NativeSearchQueryBuilder().build(); Query query = new NativeSearchQueryBuilder().build();
SearchRequest request = requestFactory.searchRequest(query, EntityWithSeqNoPrimaryTerm.class, SearchRequest request = requestFactory.searchRequest(query, null, EntityWithSeqNoPrimaryTerm.class,
IndexCoordinates.of("seqNoPrimaryTerm")); IndexCoordinates.of("seqNoPrimaryTerm"));
assertThat(request.source().seqNoAndPrimaryTerm()).isTrue(); assertThat(request.source().seqNoAndPrimaryTerm()).isTrue();
@ -288,7 +303,7 @@ class RequestFactoryTests {
void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassIsNull() { void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassIsNull() {
Query query = new NativeSearchQueryBuilder().build(); Query query = new NativeSearchQueryBuilder().build();
SearchRequest request = requestFactory.searchRequest(query, null, IndexCoordinates.of("persons")); SearchRequest request = requestFactory.searchRequest(query, null, null, IndexCoordinates.of("persons"));
assertThat(request.source().seqNoAndPrimaryTerm()).isNull(); assertThat(request.source().seqNoAndPrimaryTerm()).isNull();
} }
@ -516,7 +531,8 @@ class RequestFactoryTests {
void shouldSetTimeoutToRequest() { void shouldSetTimeoutToRequest() {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTimeout(Duration.ofSeconds(1)).build(); Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTimeout(Duration.ofSeconds(1)).build();
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.source().timeout().getMillis()).isEqualTo(Duration.ofSeconds(1).toMillis()); assertThat(searchRequest.source().timeout().getMillis()).isEqualTo(Duration.ofSeconds(1).toMillis());
} }
@ -622,8 +638,8 @@ class RequestFactoryTests {
] ]
}"""; }""";
String searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")).source() String searchRequest = requestFactory.searchRequest(query, null, Person.class, IndexCoordinates.of("persons"))
.toString(); .source().toString();
assertEquals(expected, searchRequest, false); assertEquals(expected, searchRequest, false);
} }
@ -634,7 +650,8 @@ class RequestFactoryTests {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isNull(); assertThat(searchRequest.requestCache()).isNull();
} }
@ -646,7 +663,8 @@ class RequestFactoryTests {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
query.setRequestCache(true); query.setRequestCache(true);
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isTrue(); assertThat(searchRequest.requestCache()).isTrue();
} }
@ -658,7 +676,8 @@ class RequestFactoryTests {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
query.setRequestCache(false); query.setRequestCache(false);
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.requestCache()).isFalse(); assertThat(searchRequest.requestCache()).isFalse();
} }
@ -670,7 +689,8 @@ class RequestFactoryTests {
Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withStoredFields("lastName", "location") Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withStoredFields("lastName", "location")
.build(); .build();
SearchRequest searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")); SearchRequest searchRequest = requestFactory.searchRequest(query, null, Person.class,
IndexCoordinates.of("persons"));
assertThat(searchRequest.source().storedFields()).isNotNull(); assertThat(searchRequest.source().storedFields()).isNotNull();
assertThat(searchRequest.source().storedFields().fieldNames()) assertThat(searchRequest.source().storedFields().fieldNames())