Skip to content

Commit cedb18f

Browse files
committed
DATAES-631 - Refactored count methods in ElasticsearchTemplate.
1 parent a4b9a76 commit cedb18f

File tree

2 files changed

+40
-55
lines changed

2 files changed

+40
-55
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,9 @@ default List<List<?>> queryForList(List<SearchQuery> queries, List<Class<?>> cla
347347
* @param query
348348
* @return
349349
*/
350-
<T> long count(CriteriaQuery query);
350+
default <T> long count(CriteriaQuery query) {
351+
return count(query, null);
352+
}
351353

352354
/**
353355
* return number of elements found by given query
@@ -364,7 +366,9 @@ default List<List<?>> queryForList(List<SearchQuery> queries, List<Class<?>> cla
364366
* @param query
365367
* @return
366368
*/
367-
<T> long count(SearchQuery query);
369+
default <T> long count(SearchQuery query) {
370+
return count(query, null);
371+
}
368372

369373
/**
370374
* Execute a multiGet against elasticsearch for the given ids

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

+34-53
Original file line numberDiff line numberDiff line change
@@ -422,78 +422,50 @@ private <T> CloseableIterator<T> doStream(long scrollTimeInMillis, ScrolledPage<
422422

423423
@Override
424424
public <T> long count(CriteriaQuery criteriaQuery, Class<T> clazz) {
425-
QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
426-
QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor()
427-
.createFilterFromCriteria(criteriaQuery.getCriteria());
428-
429-
if (elasticsearchFilter == null) {
430-
return doCount(prepareCount(criteriaQuery, clazz), elasticsearchQuery);
431-
} else {
432-
// filter could not be set into CountRequestBuilder, convert request into search request
433-
return doCount(prepareSearch(criteriaQuery, clazz), elasticsearchQuery, elasticsearchFilter);
434-
}
425+
return doCount(criteriaQuery, clazz);
435426
}
436427

437428
@Override
438429
public <T> long count(SearchQuery searchQuery, Class<T> clazz) {
439-
QueryBuilder elasticsearchQuery = searchQuery.getQuery();
440-
QueryBuilder elasticsearchFilter = searchQuery.getFilter();
441-
442-
if (elasticsearchFilter == null) {
443-
return doCount(prepareCount(searchQuery, clazz), elasticsearchQuery);
444-
} else {
445-
// filter could not be set into CountRequestBuilder, convert request into search request
446-
return doCount(prepareSearch(searchQuery, clazz), elasticsearchQuery, elasticsearchFilter);
447-
}
430+
return doCount(searchQuery, clazz);
448431
}
449432

450-
@Override
451-
public <T> long count(CriteriaQuery query) {
452-
return count(query, null);
453-
}
433+
private <T> long doCount(Query query, Class<T> clazz) {
434+
SearchRequestBuilder searchRequestBuilder = mapQuery(query, clazz);
435+
searchRequestBuilder.setSize(0);
454436

455-
@Override
456-
public <T> long count(SearchQuery query) {
457-
return count(query, null);
437+
return SearchHitsUtil.getTotalCount(searchRequestBuilder.execute().actionGet().getHits());
458438
}
459439

460-
private long doCount(SearchRequestBuilder countRequestBuilder, QueryBuilder elasticsearchQuery) {
440+
private <T> SearchRequestBuilder mapQuery(Query query, Class<T> clazz) {
441+
QueryBuilder elasticsearchQuery;
442+
QueryBuilder elasticsearchFilter;
461443

462-
if (elasticsearchQuery != null) {
463-
countRequestBuilder.setQuery(elasticsearchQuery);
444+
if (query instanceof SearchQuery) {
445+
SearchQuery searchQuery = (SearchQuery) query;
446+
elasticsearchQuery = searchQuery.getQuery();
447+
elasticsearchFilter = searchQuery.getFilter();
448+
} else if (query instanceof CriteriaQuery) {
449+
CriteriaQuery criteriaQuery = (CriteriaQuery) query;
450+
elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
451+
elasticsearchFilter = new CriteriaFilterProcessor().createFilterFromCriteria(criteriaQuery.getCriteria());
452+
} else {
453+
throw new IllegalArgumentException("unhandled Query implementation " + query.getClass().getName());
464454
}
465-
return SearchHitsUtil.getTotalCount(countRequestBuilder.execute().actionGet().getHits());
466-
}
467455

468-
private long doCount(SearchRequestBuilder searchRequestBuilder, QueryBuilder elasticsearchQuery,
469-
QueryBuilder elasticsearchFilter) {
456+
SearchRequestBuilder searchRequestBuilder = prepareSearch(query, clazz);
457+
470458
if (elasticsearchQuery != null) {
471459
searchRequestBuilder.setQuery(elasticsearchQuery);
472460
} else {
473461
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
474462
}
463+
475464
if (elasticsearchFilter != null) {
476465
searchRequestBuilder.setPostFilter(elasticsearchFilter);
477466
}
478-
return SearchHitsUtil.getTotalCount(searchRequestBuilder.execute().actionGet().getHits());
479-
}
480-
481-
private <T> SearchRequestBuilder prepareCount(Query query, Class<T> clazz) {
482-
String indexName[] = !isEmpty(query.getIndices())
483-
? query.getIndices().toArray(new String[query.getIndices().size()])
484-
: retrieveIndexNameFromPersistentEntity(clazz);
485-
String types[] = !isEmpty(query.getTypes()) ? query.getTypes().toArray(new String[query.getTypes().size()])
486-
: retrieveTypeFromPersistentEntity(clazz);
487-
488-
Assert.notNull(indexName, "No index defined for Query");
489-
490-
SearchRequestBuilder countRequestBuilder = client.prepareSearch(indexName);
491467

492-
if (types != null) {
493-
countRequestBuilder.setTypes(types);
494-
}
495-
countRequestBuilder.setSize(0);
496-
return countRequestBuilder;
468+
return searchRequestBuilder;
497469
}
498470

499471
@Override
@@ -1033,6 +1005,7 @@ private <T> SearchRequestBuilder prepareSearch(Query query, Class<T> clazz) {
10331005

10341006
private SearchRequestBuilder prepareSearch(Query query, @Nullable ElasticsearchPersistentEntity<?> entity) {
10351007
Assert.notNull(query.getIndices(), "No index defined for Query");
1008+
Assert.notEmpty(query.getIndices(), "No index defined for Query");
10361009
Assert.notNull(query.getTypes(), "No type defined for Query");
10371010

10381011
int startRecord = 0;
@@ -1196,10 +1169,18 @@ private void setPersistentEntityId(Object entity, String id) {
11961169

11971170
private void setPersistentEntityIndexAndType(Query query, Class clazz) {
11981171
if (query.getIndices().isEmpty()) {
1199-
query.addIndices(retrieveIndexNameFromPersistentEntity(clazz));
1172+
String[] indices = retrieveIndexNameFromPersistentEntity(clazz);
1173+
1174+
if (indices != null) {
1175+
query.addIndices(indices);
1176+
}
12001177
}
12011178
if (query.getTypes().isEmpty()) {
1202-
query.addTypes(retrieveTypeFromPersistentEntity(clazz));
1179+
String[] types = retrieveTypeFromPersistentEntity(clazz);
1180+
1181+
if (types != null) {
1182+
query.addTypes(types);
1183+
}
12031184
}
12041185
}
12051186

0 commit comments

Comments
 (0)