diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java index b9e191305..123caeca4 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractReactiveElasticsearchTemplate.java @@ -658,6 +658,12 @@ abstract public class AbstractReactiveElasticsearchTemplate public abstract Mono getClusterVersion(); + @Nullable + public String getEntityRouting(Object entity) { + return entityOperations.forEntity(entity, converter.getConversionService(), routingResolver) + .getRouting(); + } + /** * Value class to capture client independent information from a response to an index request. */ diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchOperations.java index de7c84fc8..c3d3f1524 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchOperations.java @@ -115,6 +115,17 @@ public interface ReactiveElasticsearchOperations extends ReactiveDocumentOperati ReactiveClusterOperations cluster(); // region routing + /** + * gets the routing for an entity. + * + * @param entity the entity + * @return the routing, may be null if not set. + * @since 5.2 + */ + @Nullable + String getEntityRouting(Object entity); + + // region customizations /** * Returns a copy of this instance with the same configuration, but that uses a different {@link RoutingResolver} to * obtain routing information. diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java index 763929e35..7f4358be6 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java @@ -39,6 +39,7 @@ import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.BaseQuery; import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery; import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.data.elasticsearch.core.routing.RoutingResolver; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.data.util.StreamUtils; import org.springframework.data.util.Streamable; @@ -223,7 +224,7 @@ public class SimpleElasticsearchRepository implements ElasticsearchReposi Assert.notNull(id, "Cannot delete entity with id 'null'."); - doDelete(id, getIndexCoordinates()); + doDelete(id, null, getIndexCoordinates()); } @Override @@ -231,7 +232,7 @@ public class SimpleElasticsearchRepository implements ElasticsearchReposi Assert.notNull(entity, "Cannot delete 'null' entity."); - doDelete(extractIdFromBean(entity), getIndexCoordinates()); + doDelete(extractIdFromBean(entity), operations.getEntityRouting(entity), getIndexCoordinates()); } @Override @@ -271,10 +272,14 @@ public class SimpleElasticsearchRepository implements ElasticsearchReposi deleteAllById(ids); } - private void doDelete(@Nullable ID id, IndexCoordinates indexCoordinates) { + private void doDelete(@Nullable ID id, @Nullable String routing, IndexCoordinates indexCoordinates) { if (id != null) { - executeAndRefresh(operations -> operations.delete(stringIdRepresentation(id), indexCoordinates)); + executeAndRefresh(operations -> { + var ops = routing != null ? operations.withRouting(RoutingResolver.just(routing)) : operations; + // noinspection DataFlowIssue + return ops.delete(stringIdRepresentation(id), indexCoordinates); + }); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepository.java index 9d9d04eba..eadd81f02 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleReactiveElasticsearchRepository.java @@ -31,6 +31,7 @@ import org.springframework.data.elasticsearch.core.SearchHit; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.data.elasticsearch.core.routing.RoutingResolver; import org.springframework.data.elasticsearch.repository.ReactiveElasticsearchRepository; import org.springframework.util.Assert; @@ -196,7 +197,10 @@ public class SimpleReactiveElasticsearchRepository implements ReactiveEla public Mono delete(T entity) { Assert.notNull(entity, "Entity must not be null!"); - return operations.delete(entity, entityInformation.getIndexCoordinates()) // + + var routing = operations.getEntityRouting(entity); + var ops = routing != null ? operations.withRouting(RoutingResolver.just(routing)) : operations; + return ops.delete(entity, entityInformation.getIndexCoordinates()) // .then(doRefresh()); }