Skip to content

Commit 94290ab

Browse files
committed
DATAES-631 - Consolidate query objects.
1 parent 3f82108 commit 94290ab

12 files changed

+527
-247
lines changed

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

+17-19
Original file line numberDiff line numberDiff line change
@@ -326,36 +326,34 @@ default List<List<?>> queryForList(List<NativeSearchQuery> queries, List<Class<?
326326
/**
327327
* return number of elements found by given query
328328
*
329-
* @param query
330-
* @param clazz
331-
* @return
329+
* @param query the query to execute
330+
* @param clazz the entity clazz containing the index information
331+
* @return count
332332
*/
333-
<T> long count(CriteriaQuery query, Class<T> clazz);
334-
335-
/**
336-
* return number of elements found by given query
337-
*
338-
* @param query
339-
* @return
340-
*/
341-
<T> long count(CriteriaQuery query);
333+
default long count(Query query, @Nullable Class<?> clazz) {
334+
return count(query, clazz, null);
335+
}
342336

343337
/**
344338
* return number of elements found by given query
345339
*
346-
* @param query
347-
* @param clazz
348-
* @return
340+
* @param query the query to execute
341+
* @param index the index to run the query against
342+
* @return count
349343
*/
350-
<T> long count(NativeSearchQuery query, Class<T> clazz);
344+
default <T> long count(Query query, IndexCoordinates index) {
345+
return count(query, null, index);
346+
}
351347

352348
/**
353349
* return number of elements found by given query
354350
*
355-
* @param query
356-
* @return
351+
* @param query the query to execute
352+
* @param clazz the entity clazz containing the index information, used if #index is null
353+
* @param index the index to run the query against
354+
* @return count
357355
*/
358-
<T> long count(NativeSearchQuery query);
356+
long count(Query query, @Nullable Class<?> clazz, IndexCoordinates index);
359357

360358
/**
361359
* Execute a multiGet against elasticsearch for the given ids

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

+19-86
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,12 @@
147147
* @author Gyula Attila Csorogi
148148
*/
149149
public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate
150-
implements EsClient<RestHighLevelClient>, ApplicationContextAware {
150+
implements ApplicationContextAware {
151151

152152
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchRestTemplate.class);
153153

154+
private SearchRequestFactory searchRequestFactory;
155+
154156
private RestHighLevelClient client;
155157
private String searchTimeout;
156158

@@ -169,11 +171,7 @@ private void initialize(RestHighLevelClient client, ElasticsearchConverter elast
169171

170172
this.client = client;
171173
this.elasticsearchConverter = elasticsearchConverter;
172-
}
173-
174-
@Override
175-
public RestHighLevelClient getClient() {
176-
return client;
174+
this.searchRequestFactory = new SearchRequestFactory(elasticsearchConverter);
177175
}
178176

179177
public void setSearchTimeout(String searchTimeout) {
@@ -514,89 +512,15 @@ private <T> CloseableIterator<T> doStream(long scrollTimeInMillis, ScrolledPage<
514512
}
515513

516514
@Override
517-
public <T> long count(CriteriaQuery criteriaQuery, Class<T> clazz) {
518-
QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
519-
QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor()
520-
.createFilterFromCriteria(criteriaQuery.getCriteria());
521-
522-
if (elasticsearchFilter == null) {
523-
return doCount(prepareCount(criteriaQuery, clazz), elasticsearchQuery);
524-
} else {
525-
// filter could not be set into CountRequestBuilder, convert request into search request
526-
return doCount(prepareSearch(criteriaQuery, clazz), elasticsearchQuery, elasticsearchFilter);
527-
}
528-
}
529-
530-
@Override
531-
public <T> long count(NativeSearchQuery searchQuery, Class<T> clazz) {
532-
QueryBuilder elasticsearchQuery = searchQuery.getQuery();
533-
QueryBuilder elasticsearchFilter = searchQuery.getFilter();
534-
535-
if (elasticsearchFilter == null) {
536-
return doCount(prepareCount(searchQuery, clazz), elasticsearchQuery);
537-
} else {
538-
// filter could not be set into CountRequestBuilder, convert request into search request
539-
return doCount(prepareSearch(searchQuery, clazz), elasticsearchQuery, elasticsearchFilter);
540-
}
541-
}
542-
543-
@Override
544-
public <T> long count(CriteriaQuery query) {
545-
return count(query, null);
546-
}
547-
548-
@Override
549-
public <T> long count(NativeSearchQuery query) {
550-
return count(query, null);
551-
}
552-
553-
private long doCount(SearchRequest countRequest, QueryBuilder elasticsearchQuery) {
554-
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
555-
if (elasticsearchQuery != null) {
556-
sourceBuilder.query(elasticsearchQuery);
557-
}
558-
countRequest.source(sourceBuilder);
515+
public long count(Query query, Class<?> clazz, IndexCoordinates index) {
516+
SearchRequest searchRequest = searchRequestFactory.searchRequestFor(query, clazz, index);
517+
searchRequest.source().size(0);
559518

560519
try {
561-
return SearchHitsUtil.getTotalCount(client.search(countRequest, RequestOptions.DEFAULT).getHits());
562-
} catch (IOException e) {
563-
throw new ElasticsearchException("Error while searching for request: " + countRequest.toString(), e);
564-
}
565-
}
566-
567-
private long doCount(SearchRequest searchRequest, QueryBuilder elasticsearchQuery, QueryBuilder elasticsearchFilter) {
568-
if (elasticsearchQuery != null) {
569-
searchRequest.source().query(elasticsearchQuery);
570-
} else {
571-
searchRequest.source().query(QueryBuilders.matchAllQuery());
572-
}
573-
if (elasticsearchFilter != null) {
574-
searchRequest.source().postFilter(elasticsearchFilter);
575-
}
576-
SearchResponse response;
577-
try {
578-
response = client.search(searchRequest, RequestOptions.DEFAULT);
520+
return SearchHitsUtil.getTotalCount(client.search(searchRequest, RequestOptions.DEFAULT).getHits());
579521
} catch (IOException e) {
580522
throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e);
581523
}
582-
return SearchHitsUtil.getTotalCount(response.getHits());
583-
}
584-
585-
private <T> SearchRequest prepareCount(Query query, Class<T> clazz) {
586-
String[] indexName = !isEmpty(query.getIndices())
587-
? query.getIndices().toArray(new String[query.getIndices().size()])
588-
: retrieveIndexNameFromPersistentEntity(clazz);
589-
String[] types = !isEmpty(query.getTypes()) ? query.getTypes().toArray(new String[query.getTypes().size()])
590-
: retrieveTypeFromPersistentEntity(clazz);
591-
592-
Assert.notNull(indexName, "No index defined for Query");
593-
594-
SearchRequest countRequestBuilder = new SearchRequest(indexName);
595-
596-
if (types != null) {
597-
countRequestBuilder.types(types);
598-
}
599-
return countRequestBuilder;
600524
}
601525

602526
@Override
@@ -1247,6 +1171,7 @@ private <T> SearchRequest prepareSearch(NativeSearchQuery query, Class<T> clazz)
12471171

12481172
private SearchRequest prepareSearch(Query query, Optional<QueryBuilder> builder, @Nullable Class<?> clazz) {
12491173
Assert.notNull(query.getIndices(), "No index defined for Query");
1174+
Assert.notEmpty(query.getIndices(), "No index defined for Query");
12501175
Assert.notNull(query.getTypes(), "No type defined for Query");
12511176

12521177
int startRecord = 0;
@@ -1474,10 +1399,18 @@ private void setPersistentEntityId(Object entity, String id) {
14741399

14751400
private void setPersistentEntityIndexAndType(Query query, Class clazz) {
14761401
if (query.getIndices().isEmpty()) {
1477-
query.addIndices(retrieveIndexNameFromPersistentEntity(clazz));
1402+
String[] indices = retrieveIndexNameFromPersistentEntity(clazz);
1403+
1404+
if (indices != null) {
1405+
query.addIndices(indices);
1406+
}
14781407
}
14791408
if (query.getTypes().isEmpty()) {
1480-
query.addTypes(retrieveTypeFromPersistentEntity(clazz));
1409+
String[] types = retrieveTypeFromPersistentEntity(clazz);
1410+
1411+
if (types != null) {
1412+
query.addTypes(types);
1413+
}
14811414
}
14821415
}
14831416

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

+18-79
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
*/
128128
@Deprecated
129129
public class ElasticsearchTemplate extends AbstractElasticsearchTemplate
130-
implements EsClient<Client>, ApplicationContextAware {
130+
implements ApplicationContextAware {
131131

132132
private static final Logger QUERY_LOGGER = LoggerFactory
133133
.getLogger("org.springframework.data.elasticsearch.core.QUERY");
@@ -136,6 +136,8 @@ public class ElasticsearchTemplate extends AbstractElasticsearchTemplate
136136
private Client client;
137137
private String searchTimeout;
138138

139+
private SearchRequestFactory searchRequestFactory;
140+
139141
public ElasticsearchTemplate(Client client) {
140142
initialize(client, createElasticsearchConverter());
141143
}
@@ -150,11 +152,7 @@ private void initialize(Client client, ElasticsearchConverter elasticsearchConve
150152

151153
this.client = client;
152154
this.elasticsearchConverter = elasticsearchConverter;
153-
}
154-
155-
@Override
156-
public Client getClient() {
157-
return client;
155+
this.searchRequestFactory = new SearchRequestFactory(elasticsearchConverter);
158156
}
159157

160158
public void setSearchTimeout(String searchTimeout) {
@@ -422,81 +420,13 @@ private <T> CloseableIterator<T> doStream(long scrollTimeInMillis, ScrolledPage<
422420
}
423421

424422
@Override
425-
public <T> long count(CriteriaQuery criteriaQuery, Class<T> clazz) {
426-
QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
427-
QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor()
428-
.createFilterFromCriteria(criteriaQuery.getCriteria());
429-
430-
if (elasticsearchFilter == null) {
431-
return doCount(prepareCount(criteriaQuery, clazz), elasticsearchQuery);
432-
} else {
433-
// filter could not be set into CountRequestBuilder, convert request into search request
434-
return doCount(prepareSearch(criteriaQuery, clazz), elasticsearchQuery, elasticsearchFilter);
435-
}
436-
}
437-
438-
@Override
439-
public <T> long count(NativeSearchQuery searchQuery, Class<T> clazz) {
440-
QueryBuilder elasticsearchQuery = searchQuery.getQuery();
441-
QueryBuilder elasticsearchFilter = searchQuery.getFilter();
442-
443-
if (elasticsearchFilter == null) {
444-
return doCount(prepareCount(searchQuery, clazz), elasticsearchQuery);
445-
} else {
446-
// filter could not be set into CountRequestBuilder, convert request into search request
447-
return doCount(prepareSearch(searchQuery, clazz), elasticsearchQuery, elasticsearchFilter);
448-
}
449-
}
450-
451-
@Override
452-
public <T> long count(CriteriaQuery query) {
453-
return count(query, null);
454-
}
455-
456-
@Override
457-
public <T> long count(NativeSearchQuery query) {
458-
return count(query, null);
459-
}
460-
461-
private long doCount(SearchRequestBuilder countRequestBuilder, QueryBuilder elasticsearchQuery) {
423+
public long count(Query query, @Nullable Class<?> clazz, IndexCoordinates index) {
424+
SearchRequestBuilder searchRequestBuilder = searchRequestFactory.searchRequestBuilderFor(query, client, clazz, index);
425+
searchRequestBuilder.setSize(0);
462426

463-
if (elasticsearchQuery != null) {
464-
countRequestBuilder.setQuery(elasticsearchQuery);
465-
}
466-
return SearchHitsUtil.getTotalCount(countRequestBuilder.execute().actionGet().getHits());
467-
}
468-
469-
private long doCount(SearchRequestBuilder searchRequestBuilder, QueryBuilder elasticsearchQuery,
470-
QueryBuilder elasticsearchFilter) {
471-
if (elasticsearchQuery != null) {
472-
searchRequestBuilder.setQuery(elasticsearchQuery);
473-
} else {
474-
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
475-
}
476-
if (elasticsearchFilter != null) {
477-
searchRequestBuilder.setPostFilter(elasticsearchFilter);
478-
}
479427
return SearchHitsUtil.getTotalCount(searchRequestBuilder.execute().actionGet().getHits());
480428
}
481429

482-
private <T> SearchRequestBuilder prepareCount(Query query, Class<T> clazz) {
483-
String indexName[] = !isEmpty(query.getIndices())
484-
? query.getIndices().toArray(new String[query.getIndices().size()])
485-
: retrieveIndexNameFromPersistentEntity(clazz);
486-
String types[] = !isEmpty(query.getTypes()) ? query.getTypes().toArray(new String[query.getTypes().size()])
487-
: retrieveTypeFromPersistentEntity(clazz);
488-
489-
Assert.notNull(indexName, "No index defined for Query");
490-
491-
SearchRequestBuilder countRequestBuilder = client.prepareSearch(indexName);
492-
493-
if (types != null) {
494-
countRequestBuilder.setTypes(types);
495-
}
496-
countRequestBuilder.setSize(0);
497-
return countRequestBuilder;
498-
}
499-
500430
@Override
501431
public <T> List<T> multiGet(NativeSearchQuery searchQuery, Class<T> clazz) {
502432
return elasticsearchConverter.mapDocuments(DocumentAdapters.from(getMultiResponse(searchQuery, clazz)), clazz);
@@ -1034,6 +964,7 @@ private <T> SearchRequestBuilder prepareSearch(Query query, Class<T> clazz) {
1034964

1035965
private SearchRequestBuilder prepareSearch(Query query, @Nullable ElasticsearchPersistentEntity<?> entity) {
1036966
Assert.notNull(query.getIndices(), "No index defined for Query");
967+
Assert.notEmpty(query.getIndices(), "No index defined for Query");
1037968
Assert.notNull(query.getTypes(), "No type defined for Query");
1038969

1039970
int startRecord = 0;
@@ -1197,10 +1128,18 @@ private void setPersistentEntityId(Object entity, String id) {
11971128

11981129
private void setPersistentEntityIndexAndType(Query query, Class clazz) {
11991130
if (query.getIndices().isEmpty()) {
1200-
query.addIndices(retrieveIndexNameFromPersistentEntity(clazz));
1131+
String[] indices = retrieveIndexNameFromPersistentEntity(clazz);
1132+
1133+
if (indices != null) {
1134+
query.addIndices(indices);
1135+
}
12011136
}
12021137
if (query.getTypes().isEmpty()) {
1203-
query.addTypes(retrieveTypeFromPersistentEntity(clazz));
1138+
String[] types = retrieveTypeFromPersistentEntity(clazz);
1139+
1140+
if (types != null) {
1141+
query.addTypes(types);
1142+
}
12041143
}
12051144
}
12061145

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

-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.springframework.data.elasticsearch.core;
1717

1818
import lombok.AccessLevel;
19-
import lombok.Getter;
2019
import lombok.NonNull;
2120
import lombok.RequiredArgsConstructor;
2221

@@ -615,14 +614,4 @@ public T incrementVersion() {
615614
}
616615
}
617616

618-
/**
619-
* Value object encapsulating index name and index type.
620-
*/
621-
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
622-
@Getter
623-
static class IndexCoordinates {
624-
625-
private final String indexName;
626-
private final String typeName;
627-
}
628617
}

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

-26
This file was deleted.

0 commit comments

Comments
 (0)