Skip to content

Commit 96ebc72

Browse files
authored
Dataes 745 consolidate operations api
Original PR: spring-projects#396
1 parent 1f56a9b commit 96ebc72

File tree

63 files changed

+1756
-1244
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1756
-1244
lines changed

src/main/java/org/springframework/data/elasticsearch/config/AbstractElasticsearchConfiguration.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.springframework.context.annotation.Bean;
2020
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
2121
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
22-
import org.springframework.data.elasticsearch.core.IndexOperations;
2322
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
2423

2524
/**
@@ -48,9 +47,4 @@ public abstract class AbstractElasticsearchConfiguration extends ElasticsearchCo
4847
public ElasticsearchOperations elasticsearchOperations(ElasticsearchConverter elasticsearchConverter) {
4948
return new ElasticsearchRestTemplate(elasticsearchClient(), elasticsearchConverter);
5049
}
51-
52-
@Bean
53-
public IndexOperations indexOperations(ElasticsearchOperations elasticsearchOperations) {
54-
return elasticsearchOperations.getIndexOperations();
55-
}
5650
}

src/main/java/org/springframework/data/elasticsearch/core/AbstractDefaultIndexOperations.java

Lines changed: 110 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,26 @@
1818
import static org.springframework.util.StringUtils.*;
1919

2020
import java.util.HashMap;
21+
import java.util.List;
2122
import java.util.Map;
2223

2324
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse;
25+
import org.elasticsearch.cluster.metadata.AliasMetaData;
2426
import org.elasticsearch.common.collect.MapBuilder;
2527
import org.elasticsearch.common.settings.Settings;
2628
import org.slf4j.Logger;
2729
import org.slf4j.LoggerFactory;
30+
import org.springframework.dao.InvalidDataAccessApiUsageException;
2831
import org.springframework.data.elasticsearch.ElasticsearchException;
2932
import org.springframework.data.elasticsearch.annotations.Mapping;
3033
import org.springframework.data.elasticsearch.annotations.Setting;
3134
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
35+
import org.springframework.data.elasticsearch.core.document.Document;
3236
import org.springframework.data.elasticsearch.core.index.MappingBuilder;
3337
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
3438
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
39+
import org.springframework.data.elasticsearch.core.query.AliasQuery;
40+
import org.springframework.lang.Nullable;
3541
import org.springframework.util.StringUtils;
3642

3743
/**
@@ -48,88 +54,145 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations {
4854
protected final ElasticsearchConverter elasticsearchConverter;
4955
protected final RequestFactory requestFactory;
5056

51-
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter) {
57+
@Nullable protected final Class<?> boundClass;
58+
protected final IndexCoordinates boundIndex;
59+
60+
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, Class<?> boundClass) {
5261
this.elasticsearchConverter = elasticsearchConverter;
5362
requestFactory = new RequestFactory(elasticsearchConverter);
63+
64+
this.boundClass = boundClass;
65+
this.boundIndex = getIndexCoordinatesFor(boundClass);
5466
}
5567

56-
// region IndexOperations
57-
@Override
58-
public boolean createIndex(String indexName) {
59-
return createIndex(indexName, null);
68+
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, IndexCoordinates boundIndex) {
69+
this.elasticsearchConverter = elasticsearchConverter;
70+
requestFactory = new RequestFactory(elasticsearchConverter);
71+
72+
this.boundClass = null;
73+
this.boundIndex = boundIndex;
6074
}
6175

76+
protected Class<?> checkForBoundClass() {
77+
if (boundClass == null) {
78+
throw new InvalidDataAccessApiUsageException("IndexOperations are not bound");
79+
}
80+
return boundClass;
81+
}
82+
83+
// region IndexOperations
84+
6285
@Override
63-
public boolean createIndex(Class<?> clazz) {
86+
public boolean create() {
87+
88+
if (boundClass != null) {
89+
Class<?> clazz = boundClass;
90+
String indexName = boundIndex.getIndexName();
6491

65-
String indexName = getRequiredPersistentEntity(clazz).getIndexCoordinates().getIndexName();
66-
if (clazz.isAnnotationPresent(Setting.class)) {
67-
String settingPath = clazz.getAnnotation(Setting.class).settingPath();
92+
if (clazz.isAnnotationPresent(Setting.class)) {
93+
String settingPath = clazz.getAnnotation(Setting.class).settingPath();
6894

69-
if (hasText(settingPath)) {
70-
String settings = ResourceUtil.readFileFromClasspath(settingPath);
95+
if (hasText(settingPath)) {
96+
String settings = ResourceUtil.readFileFromClasspath(settingPath);
7197

72-
if (hasText(settings)) {
73-
return createIndex(indexName, settings);
98+
if (hasText(settings)) {
99+
return doCreate(indexName, Document.parse(settings));
100+
}
101+
} else {
102+
LOGGER.info("settingPath in @Setting has to be defined. Using default instead.");
74103
}
75-
} else {
76-
LOGGER.info("settingPath in @Setting has to be defined. Using default instead.");
77104
}
105+
return doCreate(indexName, getDefaultSettings(getRequiredPersistentEntity(clazz)));
78106
}
79-
return createIndex(indexName, getDefaultSettings(getRequiredPersistentEntity(clazz)));
107+
return doCreate(boundIndex.getIndexName(), null);
108+
}
109+
110+
@Override
111+
public boolean create(Document settings) {
112+
return doCreate(boundIndex.getIndexName(), settings);
80113
}
81114

115+
protected abstract boolean doCreate(String indexName, @Nullable Document settings);
116+
82117
@Override
83-
public boolean createIndex(Class<?> clazz, Object settings) {
84-
return createIndex(getRequiredPersistentEntity(clazz).getIndexCoordinates().getIndexName(), settings);
118+
public boolean delete() {
119+
return doDelete(boundIndex.getIndexName());
85120
}
86121

122+
protected abstract boolean doDelete(String indexName);
123+
87124
@Override
88-
public boolean deleteIndex(Class<?> clazz) {
89-
return deleteIndex(getRequiredPersistentEntity(clazz).getIndexCoordinates().getIndexName());
125+
public boolean exists() {
126+
return doExists(boundIndex.getIndexName());
90127
}
91128

129+
protected abstract boolean doExists(String indexName);
130+
92131
@Override
93-
public boolean indexExists(Class<?> clazz) {
94-
return indexExists(getIndexCoordinatesFor(clazz).getIndexName());
132+
public boolean putMapping(Document mapping) {
133+
return doPutMapping(boundIndex, mapping);
95134
}
96135

136+
protected abstract boolean doPutMapping(IndexCoordinates index, Document mapping);
137+
97138
@Override
98-
public Map<String, Object> getMapping(Class<?> clazz) {
99-
return getMapping(getIndexCoordinatesFor(clazz));
139+
public Map<String, Object> getMapping() {
140+
return doGetMapping(boundIndex);
100141
}
101142

143+
abstract protected Map<String, Object> doGetMapping(IndexCoordinates index);
144+
102145
@Override
103-
public boolean putMapping(Class<?> clazz) {
104-
return putMapping(clazz, buildMapping(clazz));
146+
public Map<String, Object> getSettings() {
147+
return getSettings(false);
105148
}
106149

107150
@Override
108-
public <T> boolean putMapping(Class<T> clazz, Object mapping) {
109-
return putMapping(getIndexCoordinatesFor(clazz), mapping);
151+
public Map<String, Object> getSettings(boolean includeDefaults) {
152+
return doGetSettings(boundIndex.getIndexName(), includeDefaults);
110153
}
111154

155+
protected abstract Map<String, Object> doGetSettings(String indexName, boolean includeDefaults);
156+
112157
@Override
113-
public boolean putMapping(IndexCoordinates index, Class<?> clazz) {
114-
return putMapping(index, buildMapping(clazz));
158+
public void refresh() {
159+
doRefresh(boundIndex);
115160
}
116161

162+
protected abstract void doRefresh(IndexCoordinates indexCoordinates);
163+
117164
@Override
118-
public Map<String, Object> getSettings(Class<?> clazz) {
119-
return getSettings(clazz, false);
165+
public boolean addAlias(AliasQuery query) {
166+
return doAddAlias(query, boundIndex);
120167
}
121168

169+
protected abstract boolean doAddAlias(AliasQuery query, IndexCoordinates index);
170+
122171
@Override
123-
public Map<String, Object> getSettings(Class<?> clazz, boolean includeDefaults) {
124-
return getSettings(getRequiredPersistentEntity(clazz).getIndexCoordinates().getIndexName(), includeDefaults);
172+
public List<AliasMetaData> queryForAlias() {
173+
return doQueryForAlias(boundIndex.getIndexName());
125174
}
126175

176+
protected abstract List<AliasMetaData> doQueryForAlias(String indexName);
177+
127178
@Override
128-
public void refresh(Class<?> clazz) {
129-
refresh(getIndexCoordinatesFor(clazz));
179+
public boolean removeAlias(AliasQuery query) {
180+
return doRemoveAlias(query, boundIndex);
130181
}
131182

132-
protected String buildMapping(Class<?> clazz) {
183+
protected abstract boolean doRemoveAlias(AliasQuery query, IndexCoordinates index);
184+
185+
@Override
186+
public Document createMapping() {
187+
return createMapping(checkForBoundClass());
188+
}
189+
190+
@Override
191+
public Document createMapping(Class<?> clazz) {
192+
return buildMapping(clazz);
193+
}
194+
195+
protected Document buildMapping(Class<?> clazz) {
133196

134197
// load mapping specified in Mapping annotation if present
135198
if (clazz.isAnnotationPresent(Mapping.class)) {
@@ -139,7 +202,7 @@ protected String buildMapping(Class<?> clazz) {
139202
String mappings = ResourceUtil.readFileFromClasspath(mappingPath);
140203

141204
if (!StringUtils.isEmpty(mappings)) {
142-
return mappings;
205+
return Document.parse(mappings);
143206
}
144207
} else {
145208
LOGGER.info("mappingPath in @Mapping has to be defined. Building mappings using @Field");
@@ -148,23 +211,27 @@ protected String buildMapping(Class<?> clazz) {
148211

149212
// build mapping from field annotations
150213
try {
151-
return new MappingBuilder(elasticsearchConverter).buildPropertyMapping(clazz);
214+
String mapping = new MappingBuilder(elasticsearchConverter).buildPropertyMapping(clazz);
215+
return Document.parse(mapping);
152216
} catch (Exception e) {
153217
throw new ElasticsearchException("Failed to build mapping for " + clazz.getSimpleName(), e);
154218
}
155219
}
156220
// endregion
157221

158222
// region Helper functions
159-
private <T> Map getDefaultSettings(ElasticsearchPersistentEntity<T> persistentEntity) {
223+
private <T> Document getDefaultSettings(ElasticsearchPersistentEntity<T> persistentEntity) {
160224

161-
if (persistentEntity.isUseServerConfiguration())
162-
return new HashMap();
225+
if (persistentEntity.isUseServerConfiguration()) {
226+
return Document.create();
227+
}
163228

164-
return new MapBuilder<String, String>().put("index.number_of_shards", String.valueOf(persistentEntity.getShards()))
229+
Map<String, String> map = new MapBuilder<String, String>()
230+
.put("index.number_of_shards", String.valueOf(persistentEntity.getShards()))
165231
.put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas()))
166232
.put("index.refresh_interval", persistentEntity.getRefreshInterval())
167233
.put("index.store.type", persistentEntity.getIndexStoreType()).map();
234+
return Document.from(map);
168235
}
169236

170237
ElasticsearchPersistentEntity<?> getRequiredPersistentEntity(Class<?> clazz) {

0 commit comments

Comments
 (0)