Skip to content

Commit d864ff1

Browse files
committed
DATAES-176 - firstN repository queries.
Original PR: spring-projects#305
1 parent b4ebca7 commit d864ff1

File tree

9 files changed

+143
-32
lines changed

9 files changed

+143
-32
lines changed

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -362,16 +362,19 @@ public <T> T queryForObject(GetQuery query, Class<T> clazz, GetResultMapper mapp
362362

363363
@Override
364364
public <T> T queryForObject(CriteriaQuery query, Class<T> clazz) {
365-
Page<T> page = queryForPage(query, clazz);
366-
Assert.isTrue(page.getTotalElements() < 2, "Expected 1 but found " + page.getTotalElements() + " results");
367-
return page.getTotalElements() > 0 ? page.getContent().get(0) : null;
365+
return getObjectFromPage(queryForPage(query, clazz));
368366
}
369367

370368
@Override
371369
public <T> T queryForObject(StringQuery query, Class<T> clazz) {
372-
Page<T> page = queryForPage(query, clazz);
373-
Assert.isTrue(page.getTotalElements() < 2, "Expected 1 but found " + page.getTotalElements() + " results");
374-
return page.getTotalElements() > 0 ? page.getContent().get(0) : null;
370+
return getObjectFromPage(queryForPage(query, clazz));
371+
}
372+
373+
@Nullable
374+
private <T> T getObjectFromPage(Page<T> page) {
375+
int contentSize = page.getContent().size();
376+
Assert.isTrue(contentSize < 2, "Expected 1 but found " + contentSize + " results");
377+
return contentSize > 0 ? page.getContent().get(0) : null;
375378
}
376379

377380
@Override
@@ -492,19 +495,24 @@ public <T> Page<T> queryForPage(CriteriaQuery criteriaQuery, Class<T> clazz) {
492495
QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor()
493496
.createFilterFromCriteria(criteriaQuery.getCriteria());
494497
SearchRequest request = prepareSearch(criteriaQuery, clazz);
498+
SearchSourceBuilder sourceBuilder = request.source();
495499

496500
if (elasticsearchQuery != null) {
497-
request.source().query(elasticsearchQuery);
501+
sourceBuilder.query(elasticsearchQuery);
498502
} else {
499-
request.source().query(QueryBuilders.matchAllQuery());
503+
sourceBuilder.query(QueryBuilders.matchAllQuery());
504+
}
505+
506+
if (criteriaQuery.isLimiting()) {
507+
sourceBuilder.size(criteriaQuery.getMaxResults());
500508
}
501509

502510
if (criteriaQuery.getMinScore() > 0) {
503-
request.source().minScore(criteriaQuery.getMinScore());
511+
sourceBuilder.minScore(criteriaQuery.getMinScore());
504512
}
505513

506514
if (elasticsearchFilter != null)
507-
request.source().postFilter(elasticsearchFilter);
515+
sourceBuilder.postFilter(elasticsearchFilter);
508516
if (logger.isDebugEnabled()) {
509517
logger.debug("doSearch query:\n" + request.toString());
510518
}

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,16 +294,19 @@ public <T> T queryForObject(GetQuery query, Class<T> clazz, GetResultMapper mapp
294294

295295
@Override
296296
public <T> T queryForObject(CriteriaQuery query, Class<T> clazz) {
297-
Page<T> page = queryForPage(query, clazz);
298-
Assert.isTrue(page.getTotalElements() < 2, "Expected 1 but found " + page.getTotalElements() + " results");
299-
return page.getTotalElements() > 0 ? page.getContent().get(0) : null;
297+
return getObjectFromPage(queryForPage(query, clazz));
300298
}
301299

302300
@Override
303301
public <T> T queryForObject(StringQuery query, Class<T> clazz) {
304-
Page<T> page = queryForPage(query, clazz);
305-
Assert.isTrue(page.getTotalElements() < 2, "Expected 1 but found " + page.getTotalElements() + " results");
306-
return page.getTotalElements() > 0 ? page.getContent().get(0) : null;
302+
return getObjectFromPage(queryForPage(query, clazz));
303+
}
304+
305+
@Nullable
306+
private <T> T getObjectFromPage(Page<T> page) {
307+
int contentSize = page.getContent().size();
308+
Assert.isTrue(contentSize < 2, "Expected 1 but found " + contentSize + " results");
309+
return contentSize > 0 ? page.getContent().get(0) : null;
307310
}
308311

309312
@Override
@@ -423,6 +426,10 @@ public <T> Page<T> queryForPage(CriteriaQuery criteriaQuery, Class<T> clazz) {
423426
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
424427
}
425428

429+
if (criteriaQuery.isLimiting()) {
430+
searchRequestBuilder.setSize(criteriaQuery.getMaxResults());
431+
}
432+
426433
if (criteriaQuery.getMinScore() > 0) {
427434
searchRequestBuilder.setMinScore(criteriaQuery.getMinScore());
428435
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,12 @@ private Flux<SearchHit> doFind(Query query, ElasticsearchPersistentEntity<?> ent
294294

295295
request.source(searchSourceBuilder);
296296
return doFind(prepareSearchRequest(request));
297+
} else if (query.isLimiting()) {
298+
searchSourceBuilder.from(0);
299+
searchSourceBuilder.size(query.getMaxResults());
297300

301+
request.source(searchSourceBuilder);
302+
return doFind(prepareSearchRequest(request));
298303
} else {
299304

300305
request.source(searchSourceBuilder);
@@ -657,9 +662,7 @@ private QueryBuilder mappedQuery(Query query, ElasticsearchPersistentEntity<?> e
657662
elasticsearchQuery = new WrapperQueryBuilder(((StringQuery) query).getSource());
658663
} else if (query instanceof NativeSearchQuery) {
659664
elasticsearchQuery = ((NativeSearchQuery) query).getQuery();
660-
}
661-
662-
else {
665+
} else {
663666
throw new IllegalArgumentException(String.format("Unknown query type '%s'.", query.getClass()));
664667
}
665668

src/main/java/org/springframework/data/elasticsearch/core/query/AbstractQuery.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
* @author Alen Turkovic
3737
* @author Sascha Woo
3838
* @author Farid Azaza
39+
* @author Peter-Josef Meisch
3940
*/
4041
abstract class AbstractQuery implements Query {
4142

@@ -52,6 +53,7 @@ abstract class AbstractQuery implements Query {
5253
protected IndicesOptions indicesOptions;
5354
protected boolean trackScores;
5455
protected String preference;
56+
protected Integer maxResults;
5557

5658
@Override
5759
public Sort getSort() {
@@ -112,6 +114,7 @@ public SourceFilter getSourceFilter() {
112114
return sourceFilter;
113115
}
114116

117+
@Override
115118
@SuppressWarnings("unchecked")
116119
public final <T extends Query> T addSort(Sort sort) {
117120
if (sort == null) {
@@ -127,6 +130,7 @@ public final <T extends Query> T addSort(Sort sort) {
127130
return (T) this;
128131
}
129132

133+
@Override
130134
public float getMinScore() {
131135
return minScore;
132136
}
@@ -135,6 +139,7 @@ public void setMinScore(float minScore) {
135139
this.minScore = minScore;
136140
}
137141

142+
@Override
138143
public Collection<String> getIds() {
139144
return ids;
140145
}
@@ -143,6 +148,7 @@ public void setIds(Collection<String> ids) {
143148
this.ids = ids;
144149
}
145150

151+
@Override
146152
public String getRoute() {
147153
return route;
148154
}
@@ -155,10 +161,12 @@ public void setSearchType(SearchType searchType) {
155161
this.searchType = searchType;
156162
}
157163

164+
@Override
158165
public SearchType getSearchType() {
159166
return searchType;
160167
}
161168

169+
@Override
162170
public IndicesOptions getIndicesOptions() {
163171
return indicesOptions;
164172
}
@@ -178,7 +186,7 @@ public boolean getTrackScores() {
178186

179187
/**
180188
* Configures whether to track scores.
181-
*
189+
*
182190
* @param trackScores
183191
* @since 3.1
184192
*/
@@ -195,4 +203,18 @@ public String getPreference() {
195203
public void setPreference(String preference) {
196204
this.preference = preference;
197205
}
206+
207+
@Override
208+
public boolean isLimiting() {
209+
return maxResults != null;
210+
}
211+
212+
@Override
213+
public Integer getMaxResults() {
214+
return maxResults;
215+
}
216+
217+
public void setMaxResults(Integer maxResults) {
218+
this.maxResults = maxResults;
219+
}
198220
}

src/main/java/org/springframework/data/elasticsearch/core/query/Query.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
* @author Sascha Woo
3636
* @author Christoph Strobl
3737
* @author Farid Azaza
38+
* @author Peter-Josef Meisch
3839
*/
3940
public interface Query {
4041

@@ -145,7 +146,7 @@ static Query findAll() {
145146

146147
/**
147148
* Get if scores will be computed and tracked, regardless of whether sorting on a field. Defaults to <tt>false</tt>.
148-
*
149+
*
149150
* @return
150151
* @since 3.1
151152
*/
@@ -194,4 +195,22 @@ static Query findAll() {
194195
* @since 3.2
195196
*/
196197
void setPreference(String preference);
198+
199+
/**
200+
* @return true if the query has a limit on the max number of results.
201+
* @since 4.0
202+
*/
203+
default boolean isLimiting() {
204+
return false;
205+
}
206+
207+
/**
208+
* return the max of results. Must not return null when {@link #isLimiting()} returns true.
209+
*
210+
* @since 4.0
211+
*/
212+
default Integer getMaxResults() {
213+
return null;
214+
}
215+
197216
}

src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public Object execute(Object[] parameters) {
5858
CriteriaQuery query = createQuery(accessor);
5959
Assert.notNull(query, "unsupported query");
6060

61+
if (tree.isLimiting()) {
62+
query.setMaxResults(tree.getMaxResults());
63+
}
64+
6165
if (tree.isDelete()) {
6266
Object result = countOrGetDocumentsForDelete(query, accessor);
6367
elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType());

src/main/java/org/springframework/data/elasticsearch/repository/query/ReactivePartTreeElasticsearchQuery.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
package org.springframework.data.elasticsearch.repository.query;
1717

1818
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
19+
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
1920
import org.springframework.data.elasticsearch.core.query.Query;
2021
import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator;
2122
import org.springframework.data.repository.query.ResultProcessor;
2223
import org.springframework.data.repository.query.parser.PartTree;
2324

2425
/**
2526
* @author Christoph Strobl
27+
* @author Peter-Josef Meisch
2628
* @since 3.2
2729
*/
2830
public class ReactivePartTreeElasticsearchQuery extends AbstractReactiveElasticsearchRepositoryQuery {
@@ -40,7 +42,12 @@ public ReactivePartTreeElasticsearchQuery(ReactiveElasticsearchQueryMethod query
4042

4143
@Override
4244
protected Query createQuery(ElasticsearchParameterAccessor accessor) {
43-
return new ElasticsearchQueryCreator(tree, accessor, getMappingContext()).createQuery();
45+
CriteriaQuery query = new ElasticsearchQueryCreator(tree, accessor, getMappingContext()).createQuery();
46+
47+
if (tree.isLimiting()) {
48+
query.setMaxResults(tree.getMaxResults());
49+
}
50+
return query;
4451
}
4552

4653
@Override

src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ protected CriteriaQuery or(CriteriaQuery base, CriteriaQuery query) {
8888
protected CriteriaQuery complete(@Nullable CriteriaQuery query, Sort sort) {
8989

9090
if (query == null) {
91-
9291
// this is the case in a findAllByOrderByField method, add empty criteria
9392
query = new CriteriaQuery(new Criteria());
9493
}

0 commit comments

Comments
 (0)