diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java index f6100e8ab..9199fc784 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java @@ -55,7 +55,7 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations { protected final RequestFactory requestFactory; @Nullable protected final Class boundClass; - protected final IndexCoordinates boundIndex; + private final IndexCoordinates boundIndex; public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, Class boundClass) { this.elasticsearchConverter = elasticsearchConverter; @@ -87,7 +87,7 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations { if (boundClass != null) { Class clazz = boundClass; - String indexName = boundIndex.getIndexName(); + String indexName = getIndexCoordinates().getIndexName(); if (clazz.isAnnotationPresent(Setting.class)) { String settingPath = clazz.getAnnotation(Setting.class).settingPath(); @@ -104,40 +104,40 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations { } return doCreate(indexName, getDefaultSettings(getRequiredPersistentEntity(clazz))); } - return doCreate(boundIndex.getIndexName(), null); + return doCreate(getIndexCoordinates().getIndexName(), null); } @Override public boolean create(Document settings) { - return doCreate(boundIndex.getIndexName(), settings); + return doCreate(getIndexCoordinates().getIndexName(), settings); } protected abstract boolean doCreate(String indexName, @Nullable Document settings); @Override public boolean delete() { - return doDelete(boundIndex.getIndexName()); + return doDelete(getIndexCoordinates().getIndexName()); } protected abstract boolean doDelete(String indexName); @Override public boolean exists() { - return doExists(boundIndex.getIndexName()); + return doExists(getIndexCoordinates().getIndexName()); } protected abstract boolean doExists(String indexName); @Override public boolean putMapping(Document mapping) { - return doPutMapping(boundIndex, mapping); + return doPutMapping(getIndexCoordinates(), mapping); } protected abstract boolean doPutMapping(IndexCoordinates index, Document mapping); @Override public Map getMapping() { - return doGetMapping(boundIndex); + return doGetMapping(getIndexCoordinates()); } abstract protected Map doGetMapping(IndexCoordinates index); @@ -149,35 +149,35 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations { @Override public Map getSettings(boolean includeDefaults) { - return doGetSettings(boundIndex.getIndexName(), includeDefaults); + return doGetSettings(getIndexCoordinates().getIndexName(), includeDefaults); } protected abstract Map doGetSettings(String indexName, boolean includeDefaults); @Override public void refresh() { - doRefresh(boundIndex); + doRefresh(getIndexCoordinates()); } protected abstract void doRefresh(IndexCoordinates indexCoordinates); @Override public boolean addAlias(AliasQuery query) { - return doAddAlias(query, boundIndex); + return doAddAlias(query, getIndexCoordinates()); } protected abstract boolean doAddAlias(AliasQuery query, IndexCoordinates index); @Override public List queryForAlias() { - return doQueryForAlias(boundIndex.getIndexName()); + return doQueryForAlias(getIndexCoordinates().getIndexName()); } protected abstract List doQueryForAlias(String indexName); @Override public boolean removeAlias(AliasQuery query) { - return doRemoveAlias(query, boundIndex); + return doRemoveAlias(query, getIndexCoordinates()); } protected abstract boolean doRemoveAlias(AliasQuery query, IndexCoordinates index); @@ -238,6 +238,16 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations { return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz); } + /** + * get the current {@link IndexCoordinates}. These may change over time when the entity class has a SpEL constructed + * index name. When this IndexOperations is not bound to a class, the bound IndexCoordinates are returned. + * + * @return IndexCoordinates + */ + protected IndexCoordinates getIndexCoordinates() { + return (boundClass != null) ? getIndexCoordinatesFor(boundClass) : boundIndex; + } + public IndexCoordinates getIndexCoordinatesFor(Class clazz) { return getRequiredPersistentEntity(clazz).getIndexCoordinates(); } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/dynamicindex/DynamicIndexEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/dynamicindex/DynamicIndexEntityTests.java index 1db09a7ff..3e37fb3df 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/dynamicindex/DynamicIndexEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/dynamicindex/DynamicIndexEntityTests.java @@ -96,6 +96,21 @@ public class DynamicIndexEntityTests { assertThat(repository.count()).isEqualTo(0L); } + @Test // DATAES-821 + void indexOpsShouldUseDynamicallyProvidedName() { + + indexNameProvider.setIndexName("test-dynamic"); + IndexOperations indexOps = operations.indexOps(DynamicIndexEntity.class); + + int initialCallsCount = indexNameProvider.callsCount; + indexOps.create(); + indexOps.refresh(); + indexOps.refresh(); + indexOps.delete(); + + assertThat(indexNameProvider.callsCount - initialCallsCount).isEqualTo(4); + } + static class IndexNameProvider { private String indexName;