Skip to content

Commit f989cf8

Browse files
authored
DATAES-891 - Returning a Stream from a Query annotated repository method crashes.
Original PR: spring-projects#497
1 parent fe45861 commit f989cf8

File tree

4 files changed

+40
-3
lines changed

4 files changed

+40
-3
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@
2828

2929
public abstract class AbstractElasticsearchRepositoryQuery implements RepositoryQuery {
3030

31+
protected static final int DEFAULT_STREAM_BATCH_SIZE = 500;
3132
protected ElasticsearchQueryMethod queryMethod;
3233
protected ElasticsearchOperations elasticsearchOperations;
3334

3435
public AbstractElasticsearchRepositoryQuery(ElasticsearchQueryMethod queryMethod,
35-
ElasticsearchOperations elasticsearchOperations) {
36+
ElasticsearchOperations elasticsearchOperations) {
3637
this.queryMethod = queryMethod;
3738
this.elasticsearchOperations = elasticsearchOperations;
3839
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@
4343
*/
4444
public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery {
4545

46-
private static final int DEFAULT_STREAM_BATCH_SIZE = 500;
47-
4846
private final PartTree tree;
4947
private final ElasticsearchConverter elasticsearchConverter;
5048
private final MappingContext<?, ElasticsearchPersistentProperty> mappingContext;

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import java.util.regex.Pattern;
2020

2121
import org.springframework.core.convert.support.GenericConversionService;
22+
import org.springframework.data.domain.PageRequest;
2223
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
2324
import org.springframework.data.elasticsearch.core.SearchHitSupport;
2425
import org.springframework.data.elasticsearch.core.SearchHits;
2526
import org.springframework.data.elasticsearch.core.convert.DateTimeConverters;
2627
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
2728
import org.springframework.data.elasticsearch.core.query.StringQuery;
2829
import org.springframework.data.repository.query.ParametersParameterAccessor;
30+
import org.springframework.data.util.StreamUtils;
2931
import org.springframework.util.Assert;
3032
import org.springframework.util.ClassUtils;
3133
import org.springframework.util.NumberUtils;
@@ -88,6 +90,13 @@ public Object execute(Object[] parameters) {
8890
stringQuery.setPageable(accessor.getPageable());
8991
SearchHits<?> searchHits = elasticsearchOperations.search(stringQuery, clazz, index);
9092
result = SearchHitSupport.page(searchHits, stringQuery.getPageable());
93+
} else if (queryMethod.isStreamQuery()) {
94+
if (accessor.getPageable().isUnpaged()) {
95+
stringQuery.setPageable(PageRequest.of(0, DEFAULT_STREAM_BATCH_SIZE));
96+
} else {
97+
stringQuery.setPageable(accessor.getPageable());
98+
}
99+
result = StreamUtils.createStreamFromIterator(elasticsearchOperations.searchForStream(stringQuery, clazz, index));
91100
} else if (queryMethod.isCollectionQuery()) {
92101
if (accessor.getPageable().isPaged()) {
93102
stringQuery.setPageable(accessor.getPageable());

src/test/java/org/springframework/data/elasticsearch/repositories/custommethod/CustomMethodRepositoryBaseTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,6 +1544,28 @@ private List<SampleEntity> createSampleEntities(String type, int numberOfEntitie
15441544
return entities;
15451545
}
15461546

1547+
@Test // DATAES-891
1548+
void shouldStreamEntitiesWithQueryAnnotatedMethod() {
1549+
List<SampleEntity> entities = createSampleEntities("abc", 20);
1550+
repository.saveAll(entities);
1551+
1552+
Stream<SampleEntity> stream = streamingRepository.streamEntitiesByType("abc");
1553+
1554+
long count = stream.peek(sampleEntity -> assertThat(sampleEntity).isInstanceOf(SampleEntity.class)).count();
1555+
assertThat(count).isEqualTo(20);
1556+
}
1557+
1558+
@Test // DATAES-891
1559+
void shouldStreamSearchHitsWithQueryAnnotatedMethod() {
1560+
List<SampleEntity> entities = createSampleEntities("abc", 20);
1561+
repository.saveAll(entities);
1562+
1563+
Stream<SearchHit<SampleEntity>> stream = streamingRepository.streamSearchHitsByType("abc");
1564+
1565+
long count = stream.peek(sampleEntity -> assertThat(sampleEntity).isInstanceOf(SearchHit.class)).count();
1566+
assertThat(count).isEqualTo(20);
1567+
}
1568+
15471569
@Data
15481570
@NoArgsConstructor
15491571
@AllArgsConstructor
@@ -1687,5 +1709,12 @@ public interface SampleStreamingCustomMethodRepository extends ElasticsearchRepo
16871709
Stream<SampleEntity> findByType(String type);
16881710

16891711
Stream<SampleEntity> findByType(String type, Pageable pageable);
1712+
1713+
@Query("{\"bool\": {\"must\": [{\"term\": {\"type\": \"?0\"}}]}}")
1714+
Stream<SampleEntity> streamEntitiesByType(String type);
1715+
1716+
@Query("{\"bool\": {\"must\": [{\"term\": {\"type\": \"?0\"}}]}}")
1717+
Stream<SearchHit<SampleEntity>> streamSearchHitsByType(String type);
1718+
16901719
}
16911720
}

0 commit comments

Comments
 (0)