Added method support for Repository and Template to return List<T> (https://github.com/BioMedCentralLtd/spring-data-elasticsearch/issues/22)

This commit is contained in:
Mohsin Husen 2013-04-09 17:08:05 +01:00
parent 6e57235fa9
commit c471774e0a
8 changed files with 187 additions and 0 deletions

View File

@ -119,6 +119,26 @@ public interface ElasticsearchOperations {
*/
<T> Page<T> queryForPage(StringQuery query, Class<T> clazz);
/**
* Execute the criteria query against elasticsearch and return result as {@link List}
*
* @param query
* @param clazz
* @param <T>
* @return
*/
<T> List<T> queryForList(CriteriaQuery query, Class<T> clazz);
/**
* Execute the string query against elasticsearch and return result as {@link List}
*
* @param query
* @param clazz
* @param <T>
* @return
*/
<T> List<T> queryForList(StringQuery query, Class<T> clazz);
/**
* Execute the query against elasticsearch and return ids
*

View File

@ -152,6 +152,17 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
return resultsMapper.mapResults(response);
}
@Override
public <T> List<T> queryForList(CriteriaQuery query, Class<T> clazz){
return queryForPage(query, clazz).getContent();
}
@Override
public <T> List<T> queryForList(StringQuery query, Class<T> clazz){
return queryForPage(query, clazz).getContent();
}
@Override
public <T> List<String> queryForIds(SearchQuery query) {
SearchRequestBuilder request = prepareSearch(query).setQuery(query.getElasticsearchQuery())

View File

@ -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());
}

View File

@ -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());
}

View File

@ -614,6 +614,111 @@ public class ElasticsearchTemplateTest {
assertThat(sampleEntities.size(), is(equalTo(2)));
}
@Test
public void shouldReturnListForGivenCriteria(){
//given
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
//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<SampleEntity> sampleEntitiesForSingleCriteria = elasticsearchTemplate.queryForList(singleCriteriaQuery,SampleEntity.class);
List<SampleEntity> sampleEntitiesForAndCriteria = elasticsearchTemplate.queryForList(multipleCriteriaQuery,SampleEntity.class);
//then
assertThat(sampleEntitiesForSingleCriteria.size(),is(2));
assertThat(sampleEntitiesForAndCriteria.size(),is(1));
}
@Test
public void shouldReturnListForGivenStringQuery(){
//given
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
//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<SampleEntity> sampleEntities = elasticsearchTemplate.queryForList(stringQuery,SampleEntity.class);
//then
assertThat(sampleEntities.size(),is(3));
}
@Test
public void shouldPutMappingForGivenEntity()throws Exception{
//given

View File

@ -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<SampleEntity> sampleEntities = repository.findByMessage("abc");
//then
assertThat(sampleEntities.isEmpty(),is(false));
assertThat(sampleEntities.size(),is(1));
}
}

View File

@ -36,6 +36,9 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository<Sa
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}")
Page<SampleEntity> findByMessage(String message, Pageable pageable);
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}")
List<SampleEntity> findByMessage(String message);
Page<SampleEntity> findByAvailable(boolean available, Pageable pageable);
Page<SampleEntity> findByRateLessThan(int rate, Pageable pageable);

View File

@ -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