diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java index f849c2822..f00641347 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java @@ -174,8 +174,8 @@ public ByQueryResponse delete(Query query, Class clazz, IndexCoordinates inde Assert.notNull(query, "query must not be null"); - DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, clazz, index, - getRefreshPolicy()); + DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, routingResolver.getRouting(), + clazz, index, getRefreshPolicy()); DeleteByQueryResponse response = execute(client -> client.deleteByQuery(request)); @@ -309,7 +309,8 @@ public long count(Query query, @Nullable Class clazz, IndexCoordinates index) Assert.notNull(query, "query 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 searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class)); @@ -331,7 +332,8 @@ public SearchHits search(Query query, Class clazz, IndexCoordinates in } protected SearchHits doSearch(Query query, Class clazz, IndexCoordinates index) { - SearchRequest searchRequest = requestConverter.searchRequest(query, clazz, index, false); + SearchRequest searchRequest = requestConverter.searchRequest(query, routingResolver.getRouting(), clazz, index, + false); SearchResponse searchResponse = execute(client -> client.search(searchRequest, EntityAsMap.class)); // noinspection DuplicatedCode @@ -343,7 +345,7 @@ protected SearchHits doSearch(Query query, Class clazz, IndexCoordinat } protected SearchHits doSearch(SearchTemplateQuery query, Class 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)); // noinspection DuplicatedCode @@ -374,7 +376,8 @@ public SearchScrollHits searchScrollStart(long scrollTimeInMillis, Query Assert.notNull(query, "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 response = execute(client -> client.search(request, EntityAsMap.class)); return getSearchScrollHits(clazz, index, response); @@ -492,7 +495,8 @@ public List> multiSearch(List queries, List> doMultiSearch(List multiSearchQueryParameters) { - MsearchRequest request = requestConverter.searchMsearchRequest(multiSearchQueryParameters); + MsearchRequest request = requestConverter.searchMsearchRequest(multiSearchQueryParameters, + routingResolver.getRouting()); MsearchResponse msearchResponse = execute(client -> client.msearch(request, EntityAsMap.class)); List> responseItems = msearchResponse.responses(); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java index 501fc7504..0f2046a3c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java @@ -111,8 +111,7 @@ protected Mono> doIndex(T entity, IndexCoor return Mono.just(entity) // .zipWith(// Mono.from(execute((ClientCallback>) client -> client.index(indexRequest))) // - .map(indexResponse -> new IndexResponseMetaData( - indexResponse.id(), // + .map(indexResponse -> new IndexResponseMetaData(indexResponse.id(), // indexResponse.index(), // indexResponse.seqNo(), // indexResponse.primaryTerm(), // @@ -171,8 +170,8 @@ public Mono delete(Query query, Class entityType, IndexCoord Assert.notNull(query, "query must not be null"); - DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, entityType, index, - getRefreshPolicy()); + DeleteByQueryRequest request = requestConverter.documentDeleteByQueryRequest(query, routingResolver.getRouting(), + entityType, index, getRefreshPolicy()); return Mono .from(execute((ClientCallback>) client -> client.deleteByQuery(request))) .map(responseConverter::byQueryResponse); @@ -391,7 +390,8 @@ private Flux doFindUnbounded(Query query, Class clazz, IndexC baseQuery.setPointInTime(new Query.PointInTime(psa.getPit(), pitKeepAlive)); 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>>) client -> client .search(firstSearchRequest, EntityAsMap.class))).expand(entityAsMapSearchResponse -> { @@ -404,7 +404,8 @@ private Flux doFindUnbounded(Query query, Class clazz, IndexC List sortOptions = hits.get(hits.size() - 1).sort().stream().map(TypeUtils::toObject) .collect(Collectors.toList()); 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>>) client -> client .search(followSearchRequest, EntityAsMap.class))); }); @@ -460,7 +461,8 @@ protected Mono doCount(Query query, Class entityType, IndexCoordinates Assert.notNull(query, "query 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 .from(execute((ClientCallback>>) client -> client.search(searchRequest, @@ -470,7 +472,8 @@ protected Mono doCount(Query query, Class entityType, IndexCoordinates private Flux 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 .from(execute((ClientCallback>>) client -> client.search(searchRequest, @@ -481,7 +484,7 @@ private Flux doFindBounded(Query query, Class clazz, IndexCoo private Flux doSearch(SearchTemplateQuery query, Class clazz, IndexCoordinates index) { - var request = requestConverter.searchTemplate(query, index); + var request = requestConverter.searchTemplate(query, routingResolver.getRouting(), index); return Mono .from(execute((ClientCallback>>) client -> client @@ -496,7 +499,8 @@ protected Mono doFindForResponse(Query query, Class< Assert.notNull(query, "query 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 SearchDocumentCallback callback = new ReadSearchDocumentCallback<>((Class) clazz, index); 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 2bd8c5334..692212519 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 @@ -837,8 +837,8 @@ public DeleteRequest documentDeleteRequest(String id, @Nullable String routing, }); } - public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, Class clazz, IndexCoordinates index, - @Nullable RefreshPolicy refreshPolicy) { + public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, @Nullable String routing, Class clazz, + IndexCoordinates index, @Nullable RefreshPolicy refreshPolicy) { Assert.notNull(query, "query must not be null"); Assert.notNull(index, "index must not be null"); @@ -857,6 +857,8 @@ public DeleteByQueryRequest documentDeleteByQueryRequest(Query query, Class c if (query.getRoute() != null) { b.routing(query.getRoute()); + } else if (StringUtils.hasText(routing)) { + b.routing(routing); } return b; @@ -998,23 +1000,24 @@ public UpdateByQueryRequest documentUpdateByQueryRequest(UpdateQuery updateQuery // region search - public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexCoordinates indexCoordinates, - boolean forCount) { - return searchRequest(query, clazz, indexCoordinates, forCount, false, null); + public SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class clazz, + IndexCoordinates indexCoordinates, boolean forCount) { + return searchRequest(query, routing, clazz, indexCoordinates, forCount, false, null); } - public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexCoordinates indexCoordinates, - boolean forCount, long scrollTimeInMillis) { - return searchRequest(query, clazz, indexCoordinates, forCount, true, scrollTimeInMillis); + public SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class clazz, + IndexCoordinates indexCoordinates, boolean forCount, long scrollTimeInMillis) { + return searchRequest(query, routing, clazz, indexCoordinates, forCount, true, scrollTimeInMillis); } - public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexCoordinates indexCoordinates, - boolean forCount, boolean forBatchedSearch) { - return searchRequest(query, clazz, indexCoordinates, forCount, forBatchedSearch, null); + public SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class clazz, + IndexCoordinates indexCoordinates, boolean forCount, boolean forBatchedSearch) { + return searchRequest(query, routing, clazz, indexCoordinates, forCount, forBatchedSearch, null); } - public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexCoordinates indexCoordinates, - boolean forCount, boolean forBatchedSearch, @Nullable Long scrollTimeInMillis) { + public SearchRequest searchRequest(Query query, @Nullable String routing, @Nullable Class clazz, + IndexCoordinates indexCoordinates, boolean forCount, boolean forBatchedSearch, + @Nullable Long scrollTimeInMillis) { String[] indexNames = indexCoordinates.getIndexNames(); Assert.notNull(query, "query must not be null"); @@ -1022,7 +1025,7 @@ public SearchRequest searchRequest(Query query, @Nullable Class clazz, In elasticsearchConverter.updateQuery(query, clazz); SearchRequest.Builder builder = new SearchRequest.Builder(); - prepareSearchRequest(query, clazz, indexCoordinates, builder, forCount, forBatchedSearch); + prepareSearchRequest(query, routing, clazz, indexCoordinates, builder, forCount, forBatchedSearch); if (scrollTimeInMillis != null) { builder.scroll(t -> t.time(scrollTimeInMillis + "ms")); @@ -1030,13 +1033,20 @@ public SearchRequest searchRequest(Query query, @Nullable Class clazz, In builder.query(getQuery(query, clazz)); + if (StringUtils.hasText(query.getRoute())) { + builder.routing(query.getRoute()); + } + if (StringUtils.hasText(routing)) { + builder.routing(routing); + } + addFilter(query, builder); return builder.build(); } public MsearchRequest searchMsearchRequest( - List multiSearchQueryParameters) { + List multiSearchQueryParameters, @Nullable String routing) { // basically the same stuff as in prepareSearchRequest, but the new Elasticsearch has different builders for a // normal search and msearch @@ -1049,11 +1059,16 @@ public MsearchRequest searchMsearchRequest( .header(h -> { h // .index(Arrays.asList(param.index().getIndexNames())) // - .routing(query.getRoute()) // .searchType(searchType(query.getSearchType())) // .requestCache(query.getRequestCache()) // ; + if (StringUtils.hasText(query.getRoute())) { + h.routing(query.getRoute()); + } else if (StringUtils.hasText(routing)) { + h.routing(routing); + } + if (query.getPreference() != null) { h.preference(query.getPreference()); } @@ -1156,8 +1171,8 @@ public MsearchRequest searchMsearchRequest( }); } - private void prepareSearchRequest(Query query, @Nullable Class clazz, IndexCoordinates indexCoordinates, - SearchRequest.Builder builder, boolean forCount, boolean forBatchedSearch) { + private void prepareSearchRequest(Query query, @Nullable String routing, @Nullable Class clazz, + IndexCoordinates indexCoordinates, SearchRequest.Builder builder, boolean forCount, boolean forBatchedSearch) { String[] indexNames = indexCoordinates.getIndexNames(); @@ -1190,6 +1205,8 @@ private void prepareSearchRequest(Query query, @Nullable Class clazz, Ind if (query.getRoute() != null) { builder.routing(query.getRoute()); + } else if (StringUtils.hasText(routing)) { + builder.routing(routing); } if (query.getPreference() != null) { @@ -1559,7 +1576,8 @@ public ClosePointInTimeRequest searchClosePointInTime(String 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"); @@ -1570,10 +1588,15 @@ public SearchTemplateRequest searchTemplate(SearchTemplateQuery query, IndexCoor .id(query.getId()) // .index(Arrays.asList(index.getIndexNames())) // .preference(query.getPreference()) // - .routing(query.getRoute()) // .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(); if (!expandWildcards.isEmpty()) { builder.expandWildcards(expandWildcards(expandWildcards)); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchRestTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchRestTemplate.java index ff19938a5..327d69f98 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchRestTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchRestTemplate.java @@ -261,7 +261,8 @@ protected String doDelete(String id, @Nullable String routing, IndexCoordinates @Override 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 .byQueryResponseOf(execute(client -> client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT))); } @@ -398,7 +399,7 @@ public long count(Query query, @Nullable Class clazz, IndexCoordinates index) final Boolean trackTotalHits = query.getTrackTotalHits(); query.setTrackTotalHits(true); - SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); + SearchRequest searchRequest = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index); query.setTrackTotalHits(trackTotalHits); searchRequest.source().size(0); @@ -409,7 +410,7 @@ public long count(Query query, @Nullable Class clazz, IndexCoordinates index) @Override public SearchHits search(Query query, Class 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)); ReadDocumentCallback documentCallback = new ReadDocumentCallback<>(elasticsearchConverter, clazz, index); @@ -431,7 +432,7 @@ public SearchScrollHits searchScrollStart(long scrollTimeInMillis, Query 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)); SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT)); @@ -477,7 +478,7 @@ public SearchResponse suggest(SuggestBuilder suggestion, IndexCoordinates index) public List> multiSearch(List queries, Class clazz, IndexCoordinates index) { MultiSearchRequest request = new MultiSearchRequest(); 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); @@ -504,7 +505,8 @@ public List> multiSearch(List queries, List> it = classes.iterator(); for (Query query : queries) { 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); @@ -538,7 +540,7 @@ public List> multiSearch(List queries, List> it = classes.iterator(); 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); @@ -572,7 +574,7 @@ public List> multiSearch(List queries, List> it = classes.iterator(); Iterator indexesIt = indexes.iterator(); 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); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ReactiveElasticsearchTemplate.java index 782d3ae49..f847ae26c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/ReactiveElasticsearchTemplate.java @@ -374,7 +374,8 @@ public Mono submitReindex(ReindexRequest postReindexRequest) { protected Mono doDeleteBy(Query query, Class entityType, IndexCoordinates index) { return Mono.defer(() -> { - DeleteByQueryRequest request = requestFactory.deleteByQueryRequest(query, entityType, index); + DeleteByQueryRequest request = requestFactory.deleteByQueryRequest(query, routingResolver.getRouting(), + entityType, index); return doDeleteBy(prepareDeleteByRequest(request)); }); } @@ -505,7 +506,7 @@ protected Flux doFind(Query query, Class clazz, IndexCoordina 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()); request = prepareSearchRequest(request, useScroll); @@ -520,7 +521,7 @@ protected Flux doFind(Query query, Class clazz, IndexCoordina protected Mono doFindForResponse(Query query, Class clazz, IndexCoordinates index) { return Mono.defer(() -> { - SearchRequest request = requestFactory.searchRequest(query, clazz, index); + SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), clazz, index); request = prepareSearchRequest(request, false); SearchDocumentCallback documentCallback = new ReadSearchDocumentCallback<>(clazz, index); @@ -540,7 +541,7 @@ public Flux> aggregate(Query query, Class entityType, Assert.notNull(index, "index must not be null"); return Flux.defer(() -> { - SearchRequest request = requestFactory.searchRequest(query, entityType, index); + SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), entityType, index); request = prepareSearchRequest(request, false); return doAggregate(request); }); @@ -565,7 +566,7 @@ protected Flux> doAggregate(SearchRequest request) { protected Mono doCount(Query query, Class entityType, IndexCoordinates index) { return Mono.defer(() -> { - SearchRequest request = requestFactory.searchRequest(query, entityType, index); + SearchRequest request = requestFactory.searchRequest(query, routingResolver.getRouting(), entityType, index); request = prepareSearchRequest(request, false); return doCount(request); }); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactory.java b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactory.java index e4a685f4d..e0fc6e66b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactory.java @@ -525,8 +525,8 @@ public org.elasticsearch.index.reindex.ReindexRequest reindexRequest(ReindexRequ // endregion // region delete - public DeleteByQueryRequest deleteByQueryRequest(Query query, Class clazz, IndexCoordinates index) { - SearchRequest searchRequest = searchRequest(query, clazz, index); + public DeleteByQueryRequest deleteByQueryRequest(Query query, @Nullable String routing, Class clazz, IndexCoordinates index) { + SearchRequest searchRequest = searchRequest(query, routing, clazz, index); DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(index.getIndexNames()) // .setQuery(searchRequest.source().query()) // .setAbortOnVersionConflict(false) // @@ -544,6 +544,8 @@ public DeleteByQueryRequest deleteByQueryRequest(Query query, Class clazz, In if (query.getRoute() != null) { deleteByQueryRequest.setRouting(query.getRoute()); + } else if (StringUtils.hasText(routing)) { + deleteByQueryRequest.setRouting(routing); } return deleteByQueryRequest; @@ -751,10 +753,10 @@ public SearchRequest searchRequest(SuggestBuilder suggestion, IndexCoordinates i 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); - SearchRequest searchRequest = prepareSearchRequest(query, clazz, index); + SearchRequest searchRequest = prepareSearchRequest(query, routing,clazz, index); QueryBuilder elasticsearchQuery = getQuery(query); QueryBuilder elasticsearchFilter = getFilter(query); @@ -768,7 +770,7 @@ public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexC } - 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(); Assert.notNull(indexNames, "No index defined for Query"); @@ -843,6 +845,8 @@ private SearchRequest prepareSearchRequest(Query query, @Nullable Class clazz if (StringUtils.hasLength(query.getRoute())) { request.routing(query.getRoute()); + } else if (StringUtils.hasText(routing)) { + request.routing(routing); } Duration timeout = query.getTimeout(); diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchPartQueryELCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchPartQueryELCIntegrationTests.java index b07fdca8f..6fe225e94 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchPartQueryELCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchPartQueryELCIntegrationTests.java @@ -40,7 +40,7 @@ protected String buildQueryString(Query query, Class clazz) { JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(); 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 "{\"query\":" + JsonUtils.toJson(request.query(), jsonpMapper) + "}"; diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/RequestConverterTest.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/RequestConverterTest.java index cb314a988..c20ab8da8 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/RequestConverterTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/RequestConverterTest.java @@ -62,7 +62,7 @@ void shouldAddDocvalueFields() { .withDocValueFields(docValueFields) // .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(); assertThat(fieldAndFormats).hasSize(2); diff --git a/src/test/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchPartQueryERHLCIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchPartQueryERHLCIntegrationTests.java index ff85179f4..eff0f2bb4 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchPartQueryERHLCIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/erhlc/ElasticsearchPartQueryERHLCIntegrationTests.java @@ -40,7 +40,7 @@ static class Config {} protected String buildQueryString(Query query, Class clazz) { SearchSourceBuilder source = new RequestFactory(operations.getElasticsearchConverter()) - .searchRequest(query, clazz, IndexCoordinates.of("dummy")).source(); + .searchRequest(query, null, clazz, IndexCoordinates.of("dummy")).source(); // remove defaultboost values return source.toString().replaceAll("(\\^\\d+\\.\\d+)", ""); } diff --git a/src/test/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactoryTests.java b/src/test/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactoryTests.java index fca3552cb..ac6b23b6e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/erhlc/RequestFactoryTests.java @@ -110,7 +110,7 @@ public long getOffset() { .build(); // when - SearchRequest searchRequest = requestFactory.searchRequest(query, null, IndexCoordinates.of("test")); + SearchRequest searchRequest = requestFactory.searchRequest(query, null, null, IndexCoordinates.of("test")); // then assertThat(searchRequest.source().from()).isEqualTo(30); @@ -218,21 +218,35 @@ void shouldBuildSearchWithGeoSortSort() throws JSONException { " ]" + // '}'; - String searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")).source() - .toString(); + String searchRequest = requestFactory.searchRequest(query, null, Person.class, IndexCoordinates.of("persons")) + .source().toString(); assertEquals(expected, searchRequest, false); } @Test // DATAES-449 - void shouldAddRouting() { + void shouldAddRoutingFromQuery() { String route = "route66"; CriteriaQuery query = new CriteriaQuery(new Criteria("lastName").is("Smith")); query.setRoute(route); 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); } @@ -242,7 +256,8 @@ void shouldAddRouting() { void shouldAddMaxQueryWindowForUnpagedToRequest() { 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().size()).isEqualTo(RequestFactory.INDEX_MAX_RESULT_WINDOW); @@ -267,7 +282,7 @@ void shouldIncludeSeqNoAndPrimaryTermFromIndexQueryToIndexRequest() { void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassDoesNotContainSeqNoPrimaryTermProperty() { 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(); } @@ -277,7 +292,7 @@ void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassDoesNotContainSeqNoPrimar void shouldRequestSeqNoAndPrimaryTermWhenEntityClassContainsSeqNoPrimaryTermProperty() { Query query = new NativeSearchQueryBuilder().build(); - SearchRequest request = requestFactory.searchRequest(query, EntityWithSeqNoPrimaryTerm.class, + SearchRequest request = requestFactory.searchRequest(query, null, EntityWithSeqNoPrimaryTerm.class, IndexCoordinates.of("seqNoPrimaryTerm")); assertThat(request.source().seqNoAndPrimaryTerm()).isTrue(); @@ -288,7 +303,7 @@ void shouldRequestSeqNoAndPrimaryTermWhenEntityClassContainsSeqNoPrimaryTermProp void shouldNotRequestSeqNoAndPrimaryTermWhenEntityClassIsNull() { 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(); } @@ -516,7 +531,8 @@ void shouldSetOpTypeIndexIfSpecified() { void shouldSetTimeoutToRequest() { 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()); } @@ -622,8 +638,8 @@ void shouldBuildSearchWithRescorerQuery() throws JSONException { ] }"""; - String searchRequest = requestFactory.searchRequest(query, Person.class, IndexCoordinates.of("persons")).source() - .toString(); + String searchRequest = requestFactory.searchRequest(query, null, Person.class, IndexCoordinates.of("persons")) + .source().toString(); assertEquals(expected, searchRequest, false); } @@ -634,7 +650,8 @@ void shouldNotSetRequestCacheOnDefaultSearchRequest() { 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(); } @@ -646,7 +663,8 @@ void shouldSetRequestCacheTrueOnSearchRequest() { Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); 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(); } @@ -658,7 +676,8 @@ void shouldSetRequestCacheFalseOnSearchRequest() { Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); 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(); } @@ -670,7 +689,8 @@ void shouldSetStoredFieldsOnSearchRequest() { Query query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withStoredFields("lastName", "location") .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().fieldNames())