diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java index 2664e4a5e..fabd15733 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -119,6 +119,26 @@ public interface ElasticsearchOperations { */ Page queryForPage(StringQuery query, Class clazz); + /** + * Execute the criteria query against elasticsearch and return result as {@link List} + * + * @param query + * @param clazz + * @param + * @return + */ + List queryForList(CriteriaQuery query, Class clazz); + + /** + * Execute the string query against elasticsearch and return result as {@link List} + * + * @param query + * @param clazz + * @param + * @return + */ + List queryForList(StringQuery query, Class clazz); + /** * Execute the query against elasticsearch and return ids * diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 37d3cadfc..8fb584f34 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -152,6 +152,17 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return resultsMapper.mapResults(response); } + @Override + public List queryForList(CriteriaQuery query, Class clazz){ + return queryForPage(query, clazz).getContent(); + } + + @Override + public List queryForList(StringQuery query, Class clazz){ + return queryForPage(query, clazz).getContent(); + } + + @Override public List queryForIds(SearchQuery query) { SearchRequestBuilder request = prepareSearch(query).setQuery(query.getElasticsearchQuery()) diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java index 51af23511..034782b12 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java @@ -49,6 +49,11 @@ public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery if(queryMethod.isPageQuery()){ query.setPageable(accessor.getPageable()); return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType()); + } else if (queryMethod.isCollectionQuery()) { + if(accessor.getPageable() != null){ + query.setPageable(accessor.getPageable()); + } + return elasticsearchOperations.queryForList(query,queryMethod.getEntityInformation().getJavaType()); } return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType()); } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index d216ecc62..1d833bd36 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -65,7 +65,13 @@ public class ElasticsearchStringQuery extends AbstractElasticsearchRepositoryQue if(queryMethod.isPageQuery()){ stringQuery.setPageable(accessor.getPageable()); return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType()); + } else if(queryMethod.isCollectionQuery()) { + if(accessor.getPageable() != null) { + stringQuery.setPageable(accessor.getPageable()); + } + return elasticsearchOperations.queryForList(stringQuery,queryMethod.getEntityInformation().getJavaType()); } + return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType()); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java index 788c31763..f00eb7a24 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java @@ -614,6 +614,111 @@ public class ElasticsearchTemplateTest { assertThat(sampleEntities.size(), is(equalTo(2))); } + @Test + public void shouldReturnListForGivenCriteria(){ + //given + List indexQueries = new ArrayList(); + //first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("test message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + //second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test test"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + indexQueries.add(indexQuery2); + + //second document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("some message"); + sampleEntity3.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery3 = new IndexQuery(); + indexQuery3.setId(documentId3); + indexQuery3.setObject(sampleEntity3); + + indexQueries.add(indexQuery3); + //when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class,true); + //when + CriteriaQuery singleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); + CriteriaQuery multipleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").and("message").contains("message")); + List sampleEntitiesForSingleCriteria = elasticsearchTemplate.queryForList(singleCriteriaQuery,SampleEntity.class); + List sampleEntitiesForAndCriteria = elasticsearchTemplate.queryForList(multipleCriteriaQuery,SampleEntity.class); + //then + assertThat(sampleEntitiesForSingleCriteria.size(),is(2)); + assertThat(sampleEntitiesForAndCriteria.size(),is(1)); + } + + @Test + public void shouldReturnListForGivenStringQuery(){ + //given + List indexQueries = new ArrayList(); + //first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("test message"); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + indexQueries.add(indexQuery1); + + //second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("test test"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + indexQueries.add(indexQuery2); + + //second document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("some message"); + sampleEntity3.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery3 = new IndexQuery(); + indexQuery3.setId(documentId3); + indexQuery3.setObject(sampleEntity3); + + indexQueries.add(indexQuery3); + //when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class,true); + //when + StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); + List sampleEntities = elasticsearchTemplate.queryForList(stringQuery,SampleEntity.class); + //then + assertThat(sampleEntities.size(),is(3)); + } + @Test public void shouldPutMappingForGivenEntity()throws Exception{ //given diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java index 43842b421..f5a7435db 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java @@ -463,4 +463,39 @@ public class CustomMethodRepositoryTest { assertThat(pageResult.getContent().get(0).getMessage(),is(sampleEntity3.getMessage())); } + + @Test + public void shouldReturnListForMessage(){ + //given + String documentId = random(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("abc"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("abd"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity2); + + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("abe"); + sampleEntity.setVersion(System.currentTimeMillis()); + repository.save(sampleEntity3); + //when + List sampleEntities = repository.findByMessage("abc"); + //then + assertThat(sampleEntities.isEmpty(),is(false)); + assertThat(sampleEntities.size(),is(1)); + } + + + + + } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java index c1905ed5f..6e025d3d8 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java @@ -36,6 +36,9 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository findByMessage(String message, Pageable pageable); + @Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}") + List findByMessage(String message); + Page findByAvailable(boolean available, Pageable pageable); Page findByRateLessThan(int rate, Pageable pageable); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java index 31663d26f..f7b2d910e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java @@ -18,6 +18,8 @@ package org.springframework.data.elasticsearch.repositories; import org.springframework.data.elasticsearch.Book; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; +import java.util.List; + /** * @author Rizwan Idrees * @author Mohsin Husen