DATAES-812 - IndexOperations should use SpEL index name from entity.

Original PR: #447
This commit is contained in:
Peter-Josef Meisch 2020-05-05 21:39:06 +02:00 committed by GitHub
parent 97cb075afe
commit 4deea9d667
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 13 deletions

View File

@ -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<String, Object> getMapping() {
return doGetMapping(boundIndex);
return doGetMapping(getIndexCoordinates());
}
abstract protected Map<String, Object> doGetMapping(IndexCoordinates index);
@ -149,35 +149,35 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations {
@Override
public Map<String, Object> getSettings(boolean includeDefaults) {
return doGetSettings(boundIndex.getIndexName(), includeDefaults);
return doGetSettings(getIndexCoordinates().getIndexName(), includeDefaults);
}
protected abstract Map<String, Object> 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<AliasMetaData> queryForAlias() {
return doQueryForAlias(boundIndex.getIndexName());
return doQueryForAlias(getIndexCoordinates().getIndexName());
}
protected abstract List<AliasMetaData> 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();
}

View File

@ -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;