Skip to content

Commit aeaa27c

Browse files
authored
DATAES-840 - Introduce IndexCoordinateResolver.
Original PR: spring-projects#467
1 parent 3c44a1c commit aeaa27c

26 files changed

+975
-628
lines changed

src/main/asciidoc/reference/elasticsearch-migration-guide-4.0-4.1.adoc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@
33

44
This section describes breaking changes from version 4.0.x to 4.1.x and how removed features can be replaced by new introduced features.
55

6+
== Deprecations
7+
8+
.Definition of the id property
9+
It is possible to define a property of en entity as the id property by naming it either `id` or `document`. This behaviour is now deprecated and will produce a warning. PLease us the `@Id` annotation to mark a property as being the id property.
10+
611
[[elasticsearch-migration-guide-4.0-4.1.removal]]
712
== Removals
813

14+
.Type mappings
915
The _type mappings_ parameters of the `@Document` annotation and the `IndexCoordinates` object were removed. They had been deprecated in Spring Data Elasticsearch 4.0 and their values weren't used anymore.
1016

17+
=== Breaking changes
18+

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

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
3939
import org.springframework.data.elasticsearch.core.query.AliasQuery;
4040
import org.springframework.lang.Nullable;
41+
import org.springframework.util.Assert;
4142
import org.springframework.util.StringUtils;
4243

4344
/**
@@ -55,20 +56,24 @@ abstract class AbstractDefaultIndexOperations implements IndexOperations {
5556
protected final RequestFactory requestFactory;
5657

5758
@Nullable protected final Class<?> boundClass;
58-
private final IndexCoordinates boundIndex;
59+
@Nullable private final IndexCoordinates boundIndex;
5960

6061
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, Class<?> boundClass) {
62+
63+
Assert.notNull(boundClass, "boundClass may not be null");
64+
6165
this.elasticsearchConverter = elasticsearchConverter;
6266
requestFactory = new RequestFactory(elasticsearchConverter);
63-
6467
this.boundClass = boundClass;
65-
this.boundIndex = getIndexCoordinatesFor(boundClass);
68+
this.boundIndex = null;
6669
}
6770

6871
public AbstractDefaultIndexOperations(ElasticsearchConverter elasticsearchConverter, IndexCoordinates boundIndex) {
72+
73+
Assert.notNull(boundIndex, "boundIndex may not be null");
74+
6975
this.elasticsearchConverter = elasticsearchConverter;
7076
requestFactory = new RequestFactory(elasticsearchConverter);
71-
7277
this.boundClass = null;
7378
this.boundIndex = boundIndex;
7479
}
@@ -85,48 +90,59 @@ protected Class<?> checkForBoundClass() {
8590
@Override
8691
public boolean create() {
8792

93+
IndexCoordinates index;
94+
Document settings = null;
95+
8896
if (boundClass != null) {
8997
Class<?> clazz = boundClass;
90-
String indexName = getIndexCoordinates().getIndexName();
98+
ElasticsearchPersistentEntity<?> persistentEntity = getRequiredPersistentEntity(clazz);
99+
index = persistentEntity.getIndexCoordinates();
91100

92101
if (clazz.isAnnotationPresent(Setting.class)) {
93102
String settingPath = clazz.getAnnotation(Setting.class).settingPath();
94103

95104
if (hasText(settingPath)) {
96-
String settings = ResourceUtil.readFileFromClasspath(settingPath);
105+
String fileSettings = ResourceUtil.readFileFromClasspath(settingPath);
97106

98-
if (hasText(settings)) {
99-
return doCreate(indexName, Document.parse(settings));
107+
if (hasText(fileSettings)) {
108+
settings = Document.parse(fileSettings);
100109
}
101110
} else {
102111
LOGGER.info("settingPath in @Setting has to be defined. Using default instead.");
103112
}
104113
}
105-
return doCreate(indexName, getDefaultSettings(getRequiredPersistentEntity(clazz)));
114+
115+
if (settings == null) {
116+
settings = getDefaultSettings(persistentEntity);
117+
}
118+
} else {
119+
index = boundIndex;
106120
}
107-
return doCreate(getIndexCoordinates().getIndexName(), null);
121+
122+
// noinspection ConstantConditions
123+
return doCreate(index, settings);
108124
}
109125

110126
@Override
111127
public boolean create(Document settings) {
112-
return doCreate(getIndexCoordinates().getIndexName(), settings);
128+
return doCreate(getIndexCoordinates(), settings);
113129
}
114130

115-
protected abstract boolean doCreate(String indexName, @Nullable Document settings);
131+
protected abstract boolean doCreate(IndexCoordinates index, @Nullable Document settings);
116132

117133
@Override
118134
public boolean delete() {
119-
return doDelete(getIndexCoordinates().getIndexName());
135+
return doDelete(getIndexCoordinates());
120136
}
121137

122-
protected abstract boolean doDelete(String indexName);
138+
protected abstract boolean doDelete(IndexCoordinates index);
123139

124140
@Override
125141
public boolean exists() {
126-
return doExists(getIndexCoordinates().getIndexName());
142+
return doExists(getIndexCoordinates());
127143
}
128144

129-
protected abstract boolean doExists(String indexName);
145+
protected abstract boolean doExists(IndexCoordinates index);
130146

131147
@Override
132148
public boolean putMapping(Document mapping) {
@@ -149,10 +165,10 @@ public Map<String, Object> getSettings() {
149165

150166
@Override
151167
public Map<String, Object> getSettings(boolean includeDefaults) {
152-
return doGetSettings(getIndexCoordinates().getIndexName(), includeDefaults);
168+
return doGetSettings(getIndexCoordinates(), includeDefaults);
153169
}
154170

155-
protected abstract Map<String, Object> doGetSettings(String indexName, boolean includeDefaults);
171+
protected abstract Map<String, Object> doGetSettings(IndexCoordinates index, boolean includeDefaults);
156172

157173
@Override
158174
public void refresh() {
@@ -170,10 +186,10 @@ public boolean addAlias(AliasQuery query) {
170186

171187
@Override
172188
public List<AliasMetaData> queryForAlias() {
173-
return doQueryForAlias(getIndexCoordinates().getIndexName());
189+
return doQueryForAlias(getIndexCoordinates());
174190
}
175191

176-
protected abstract List<AliasMetaData> doQueryForAlias(String indexName);
192+
protected abstract List<AliasMetaData> doQueryForAlias(IndexCoordinates index);
177193

178194
@Override
179195
public boolean removeAlias(AliasQuery query) {
@@ -238,14 +254,15 @@ ElasticsearchPersistentEntity<?> getRequiredPersistentEntity(Class<?> clazz) {
238254
return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz);
239255
}
240256

241-
/**
242-
* get the current {@link IndexCoordinates}. These may change over time when the entity class has a SpEL constructed
243-
* index name. When this IndexOperations is not bound to a class, the bound IndexCoordinates are returned.
244-
*
245-
* @return IndexCoordinates
246-
*/
247257
protected IndexCoordinates getIndexCoordinates() {
248-
return (boundClass != null) ? getIndexCoordinatesFor(boundClass) : boundIndex;
258+
259+
if (boundClass != null) {
260+
return getIndexCoordinatesFor(boundClass);
261+
}
262+
263+
Assert.notNull(boundIndex, "boundIndex may not be null");
264+
265+
return boundIndex;
249266
}
250267

251268
public IndexCoordinates getIndexCoordinatesFor(Class<?> clazz) {

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.action.search.SearchResponse;
3333
import org.elasticsearch.common.unit.TimeValue;
3434
import org.elasticsearch.index.query.MoreLikeThisQueryBuilder;
35+
import org.elasticsearch.search.suggest.SuggestBuilder;
3536
import org.springframework.beans.BeansException;
3637
import org.springframework.context.ApplicationContext;
3738
import org.springframework.context.ApplicationContextAware;
@@ -48,13 +49,15 @@
4849
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
4950
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
5051
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
52+
import org.springframework.data.elasticsearch.core.query.BulkOptions;
5153
import org.springframework.data.elasticsearch.core.query.GetQuery;
5254
import org.springframework.data.elasticsearch.core.query.IndexQuery;
5355
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
5456
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
5557
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
5658
import org.springframework.data.elasticsearch.core.query.Query;
5759
import org.springframework.data.elasticsearch.core.query.SeqNoPrimaryTerm;
60+
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
5861
import org.springframework.data.elasticsearch.support.VersionInfo;
5962
import org.springframework.data.mapping.callback.EntityCallbacks;
6063
import org.springframework.data.util.CloseableIterator;
@@ -199,6 +202,11 @@ public <T> T get(GetQuery query, Class<T> clazz, IndexCoordinates index) {
199202
return get(query.getId(), clazz, index);
200203
}
201204

205+
@Override
206+
public <T> List<T> multiGet(Query query, Class<T> clazz) {
207+
return multiGet(query, clazz, getIndexCoordinatesFor(clazz));
208+
}
209+
202210
@Override
203211
@Nullable
204212
public <T> T queryForObject(GetQuery query, Class<T> clazz) {
@@ -226,6 +234,11 @@ public String delete(String id, Class<?> entityType) {
226234
return this.delete(id, getIndexCoordinatesFor(entityType));
227235
}
228236

237+
@Override
238+
public void delete(Query query, Class<?> clazz) {
239+
delete(query, getIndexCoordinatesFor(clazz));
240+
}
241+
229242
@Override
230243
public String delete(Object entity) {
231244
return delete(entity, getIndexCoordinatesFor(entity.getClass()));
@@ -235,6 +248,22 @@ public String delete(Object entity) {
235248
public String delete(Object entity, IndexCoordinates index) {
236249
return this.delete(getEntityId(entity), index);
237250
}
251+
252+
@Override
253+
public List<String> bulkIndex(List<IndexQuery> queries, Class<?> clazz) {
254+
return bulkIndex(queries, getIndexCoordinatesFor(clazz));
255+
}
256+
257+
@Override
258+
public List<String> bulkIndex(List<IndexQuery> queries, BulkOptions bulkOptions, Class<?> clazz) {
259+
return bulkIndex(queries, bulkOptions, getIndexCoordinatesFor(clazz));
260+
}
261+
262+
@Override
263+
public void bulkUpdate(List<UpdateQuery> queries, Class<?> clazz) {
264+
bulkUpdate(queries, getIndexCoordinatesFor(clazz));
265+
}
266+
238267
// endregion
239268

240269
// region SearchOperations
@@ -282,6 +311,11 @@ public <T> SearchHits<T> search(MoreLikeThisQuery query, Class<T> clazz, IndexCo
282311
return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index);
283312
}
284313

314+
@Override
315+
public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz) {
316+
return multiSearch(queries, clazz, getIndexCoordinatesFor(clazz));
317+
}
318+
285319
@Override
286320
public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<T> clazz, IndexCoordinates index) {
287321
MultiSearchRequest request = new MultiSearchRequest();
@@ -300,9 +334,46 @@ public <T> List<SearchHits<T>> multiSearch(List<? extends Query> queries, Class<
300334
return res;
301335
}
302336

337+
@Override
338+
public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes) {
339+
340+
Assert.notNull(queries, "queries must not be null");
341+
Assert.notNull(classes, "classes must not be null");
342+
Assert.isTrue(queries.size() == classes.size(), "queries and classes must have the same size");
343+
344+
MultiSearchRequest request = new MultiSearchRequest();
345+
Iterator<Class<?>> it = classes.iterator();
346+
for (Query query : queries) {
347+
Class<?> clazz = it.next();
348+
request.add(requestFactory.searchRequest(query, clazz, getIndexCoordinatesFor(clazz)));
349+
}
350+
351+
MultiSearchResponse.Item[] items = getMultiSearchResult(request);
352+
353+
List<SearchHits<?>> res = new ArrayList<>(queries.size());
354+
int c = 0;
355+
Iterator<Class<?>> it1 = classes.iterator();
356+
for (Query query : queries) {
357+
Class entityClass = it1.next();
358+
359+
SearchDocumentResponseCallback<SearchHits<?>> callback = new ReadSearchDocumentResponseCallback<>(entityClass,
360+
getIndexCoordinatesFor(entityClass));
361+
362+
SearchResponse response = items[c++].getResponse();
363+
res.add(callback.doWith(SearchDocumentResponse.from(response)));
364+
}
365+
return res;
366+
}
367+
303368
@Override
304369
public List<SearchHits<?>> multiSearch(List<? extends Query> queries, List<Class<?>> classes,
305370
IndexCoordinates index) {
371+
372+
Assert.notNull(queries, "queries must not be null");
373+
Assert.notNull(classes, "classes must not be null");
374+
Assert.notNull(index, "index must not be null");
375+
Assert.isTrue(queries.size() == classes.size(), "queries and classes must have the same size");
376+
306377
MultiSearchRequest request = new MultiSearchRequest();
307378
Iterator<Class<?>> it = classes.iterator();
308379
for (Query query : queries) {
@@ -356,6 +427,12 @@ protected void searchScrollClear(String scrollId) {
356427
abstract protected void searchScrollClear(List<String> scrollIds);
357428

358429
abstract protected MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request);
430+
431+
@Override
432+
public SearchResponse suggest(SuggestBuilder suggestion, Class<?> clazz) {
433+
return suggest(suggestion, getIndexCoordinatesFor(clazz));
434+
}
435+
359436
// endregion
360437

361438
// region Helper methods

0 commit comments

Comments
 (0)