Skip to content

Commit ab8cbdf

Browse files
authored
Bulk operations must prefer index set on individual query.
Original Pull Request #2363 Closes #2362
1 parent d7e42fc commit ab8cbdf

File tree

2 files changed

+111
-28
lines changed

2 files changed

+111
-28
lines changed

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

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515
*/
1616
package org.springframework.data.elasticsearch.client.elc;
1717

18-
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.*;
19-
import static org.springframework.util.CollectionUtils.*;
18+
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.searchType;
19+
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.slices;
20+
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.time;
21+
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.timeStringMs;
22+
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.toFloat;
23+
import static org.springframework.util.CollectionUtils.isEmpty;
2024

2125
import co.elastic.clients.elasticsearch._types.Conflicts;
2226
import co.elastic.clients.elasticsearch._types.FieldValue;
@@ -33,7 +37,18 @@
3337
import co.elastic.clients.elasticsearch._types.mapping.TypeMapping;
3438
import co.elastic.clients.elasticsearch._types.query_dsl.Like;
3539
import co.elastic.clients.elasticsearch.cluster.HealthRequest;
36-
import co.elastic.clients.elasticsearch.core.*;
40+
import co.elastic.clients.elasticsearch.core.BulkRequest;
41+
import co.elastic.clients.elasticsearch.core.ClosePointInTimeRequest;
42+
import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest;
43+
import co.elastic.clients.elasticsearch.core.DeleteRequest;
44+
import co.elastic.clients.elasticsearch.core.GetRequest;
45+
import co.elastic.clients.elasticsearch.core.IndexRequest;
46+
import co.elastic.clients.elasticsearch.core.MgetRequest;
47+
import co.elastic.clients.elasticsearch.core.MsearchRequest;
48+
import co.elastic.clients.elasticsearch.core.OpenPointInTimeRequest;
49+
import co.elastic.clients.elasticsearch.core.SearchRequest;
50+
import co.elastic.clients.elasticsearch.core.UpdateByQueryRequest;
51+
import co.elastic.clients.elasticsearch.core.UpdateRequest;
3752
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
3853
import co.elastic.clients.elasticsearch.core.bulk.CreateOperation;
3954
import co.elastic.clients.elasticsearch.core.bulk.IndexOperation;
@@ -43,8 +58,17 @@
4358
import co.elastic.clients.elasticsearch.core.search.Highlight;
4459
import co.elastic.clients.elasticsearch.core.search.Rescore;
4560
import co.elastic.clients.elasticsearch.core.search.SourceConfig;
46-
import co.elastic.clients.elasticsearch.indices.*;
61+
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
62+
import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest;
4763
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
64+
import co.elastic.clients.elasticsearch.indices.GetAliasRequest;
65+
import co.elastic.clients.elasticsearch.indices.GetIndexRequest;
66+
import co.elastic.clients.elasticsearch.indices.GetIndicesSettingsRequest;
67+
import co.elastic.clients.elasticsearch.indices.GetMappingRequest;
68+
import co.elastic.clients.elasticsearch.indices.IndexSettings;
69+
import co.elastic.clients.elasticsearch.indices.PutMappingRequest;
70+
import co.elastic.clients.elasticsearch.indices.RefreshRequest;
71+
import co.elastic.clients.elasticsearch.indices.UpdateAliasesRequest;
4872
import co.elastic.clients.elasticsearch.indices.update_aliases.Action;
4973
import co.elastic.clients.json.JsonData;
5074
import co.elastic.clients.json.JsonpDeserializer;
@@ -82,7 +106,19 @@
82106
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
83107
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
84108
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
85-
import org.springframework.data.elasticsearch.core.query.*;
109+
import org.springframework.data.elasticsearch.core.query.BaseQuery;
110+
import org.springframework.data.elasticsearch.core.query.BulkOptions;
111+
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
112+
import org.springframework.data.elasticsearch.core.query.GeoDistanceOrder;
113+
import org.springframework.data.elasticsearch.core.query.IndexQuery;
114+
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
115+
import org.springframework.data.elasticsearch.core.query.Order;
116+
import org.springframework.data.elasticsearch.core.query.Query;
117+
import org.springframework.data.elasticsearch.core.query.RescorerQuery;
118+
import org.springframework.data.elasticsearch.core.query.ScriptData;
119+
import org.springframework.data.elasticsearch.core.query.SourceFilter;
120+
import org.springframework.data.elasticsearch.core.query.StringQuery;
121+
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
86122
import org.springframework.data.elasticsearch.core.reindex.ReindexRequest;
87123
import org.springframework.data.elasticsearch.core.reindex.Remote;
88124
import org.springframework.data.elasticsearch.support.DefaultStringObjectMap;
@@ -435,7 +471,7 @@ public IndexRequest<?> documentIndexRequest(IndexQuery query, IndexCoordinates i
435471

436472
IndexRequest.Builder<Object> builder = new IndexRequest.Builder<>();
437473

438-
builder.index(indexCoordinates.getIndexName());
474+
builder.index(query.getIndexName() != null ? query.getIndexName() : indexCoordinates.getIndexName());
439475

440476
Object queryObject = query.getObject();
441477

@@ -487,7 +523,7 @@ private IndexOperation<?> bulkIndexOperation(IndexQuery query, IndexCoordinates
487523

488524
IndexOperation.Builder<Object> builder = new IndexOperation.Builder<>();
489525

490-
builder.index(indexCoordinates.getIndexName());
526+
builder.index(query.getIndexName() != null ? query.getIndexName() : indexCoordinates.getIndexName());
491527

492528
Object queryObject = query.getObject();
493529

@@ -528,7 +564,7 @@ private CreateOperation<?> bulkCreateOperation(IndexQuery query, IndexCoordinate
528564

529565
CreateOperation.Builder<Object> builder = new CreateOperation.Builder<>();
530566

531-
builder.index(indexCoordinates.getIndexName());
567+
builder.index(query.getIndexName() != null ? query.getIndexName() : indexCoordinates.getIndexName());
532568

533569
Object queryObject = query.getObject();
534570

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

Lines changed: 67 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core;
1717

18-
import static java.util.Collections.*;
19-
import static org.assertj.core.api.Assertions.*;
20-
import static org.elasticsearch.index.query.QueryBuilders.*;
21-
import static org.springframework.data.elasticsearch.annotations.Document.VersionType.*;
22-
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
18+
import static java.util.Collections.singletonList;
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
21+
import static org.assertj.core.api.Assertions.fail;
22+
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
23+
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
24+
import static org.springframework.data.elasticsearch.annotations.Document.VersionType.EXTERNAL_GTE;
2325
import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
24-
import static org.springframework.data.elasticsearch.core.document.Document.*;
25-
import static org.springframework.data.elasticsearch.utils.IdGenerator.*;
26-
import static org.springframework.data.elasticsearch.utils.IndexBuilder.*;
27-
28-
import java.lang.Double;
29-
import java.lang.Integer;
30-
import java.lang.Long;
31-
import java.lang.Object;
26+
import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword;
27+
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
28+
import static org.springframework.data.elasticsearch.core.document.Document.create;
29+
import static org.springframework.data.elasticsearch.core.document.Document.parse;
30+
import static org.springframework.data.elasticsearch.utils.IdGenerator.nextIdAsString;
31+
import static org.springframework.data.elasticsearch.utils.IndexBuilder.buildIndex;
32+
3233
import java.util.ArrayList;
3334
import java.util.Arrays;
3435
import java.util.Collection;
@@ -78,7 +79,20 @@
7879
import org.springframework.data.elasticsearch.core.index.Settings;
7980
import org.springframework.data.elasticsearch.core.join.JoinField;
8081
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
81-
import org.springframework.data.elasticsearch.core.query.*;
82+
import org.springframework.data.elasticsearch.core.query.BaseQueryBuilder;
83+
import org.springframework.data.elasticsearch.core.query.Criteria;
84+
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
85+
import org.springframework.data.elasticsearch.core.query.FetchSourceFilterBuilder;
86+
import org.springframework.data.elasticsearch.core.query.HighlightQuery;
87+
import org.springframework.data.elasticsearch.core.query.IndexQuery;
88+
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
89+
import org.springframework.data.elasticsearch.core.query.IndicesOptions;
90+
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
91+
import org.springframework.data.elasticsearch.core.query.Query;
92+
import org.springframework.data.elasticsearch.core.query.SeqNoPrimaryTerm;
93+
import org.springframework.data.elasticsearch.core.query.SourceFilter;
94+
import org.springframework.data.elasticsearch.core.query.StringQuery;
95+
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
8296
import org.springframework.data.elasticsearch.core.query.highlight.Highlight;
8397
import org.springframework.data.elasticsearch.core.query.highlight.HighlightField;
8498
import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest;
@@ -480,6 +494,39 @@ public void shouldDoBulkIndex() {
480494
assertThat(searchHits.getTotalHits()).isEqualTo(2);
481495
}
482496

497+
@Test // #2362
498+
@DisplayName("should do bulk index into different indices")
499+
void shouldDoBulkIndexIntoDifferentIndices() {
500+
501+
var indexName = indexNameProvider.indexName();
502+
var documentId1 = "1";
503+
var sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message").build();
504+
var indexQuery1 = new IndexQueryBuilder() //
505+
.withId(documentId1) //
506+
.withObject(sampleEntity1) //
507+
.withIndex(indexName + "-" + documentId1) //
508+
.build();
509+
var documentId2 = "2";
510+
var sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message").build();
511+
var indexQuery2 = new IndexQueryBuilder() //
512+
.withId(documentId2) //
513+
.withObject(sampleEntity2) //
514+
.withIndex(indexName + "-" + documentId2) //
515+
.build();
516+
517+
var indexQueries = Arrays.asList(indexQuery1, indexQuery2);
518+
519+
operations.bulkIndex(indexQueries, IndexCoordinates.of(indexName));
520+
521+
var searchHits = operations.search(operations.matchAllQuery(), SampleEntity.class,
522+
IndexCoordinates.of(indexName + "*"));
523+
524+
assertThat(searchHits.getTotalHits()).isEqualTo(2);
525+
searchHits.forEach(searchHit -> {
526+
assertThat(searchHit.getIndex()).isEqualTo(indexName + "-" + searchHit.getId());
527+
});
528+
}
529+
483530
@Test
484531
public void shouldDoBulkUpdate() {
485532

@@ -4548,12 +4595,12 @@ static class NonFieldBackedPropertyClass {
45484595
@Nullable
45494596
@Field(type = Text) private String lastName;
45504597

4551-
@Field(type = Keyword)
4552-
@WriteOnlyProperty
4553-
@AccessType(AccessType.Type.PROPERTY)
4554-
public String getFullName() {
4555-
return sanitize(firstName) + sanitize(lastName);
4556-
}
4598+
@Field(type = Keyword)
4599+
@WriteOnlyProperty
4600+
@AccessType(AccessType.Type.PROPERTY)
4601+
public String getFullName() {
4602+
return sanitize(firstName) + sanitize(lastName);
4603+
}
45574604

45584605
@Nullable
45594606
public String getId() {

0 commit comments

Comments
 (0)