From 56d4079d81a8a81ce2c4b5924eb36de9911243f2 Mon Sep 17 00:00:00 2001 From: Artur Konczak Date: Sun, 17 Nov 2013 20:25:50 +0000 Subject: [PATCH] DATAES-34 #17 - added option to inject custom implementation of ResultMapper --- .../core/AbstractResultMapper.java | 35 + .../core/DefaultResultMapper.java | 53 + .../core/ElasticsearchOperations.java | 39 +- .../core/ElasticsearchTemplate.java | 91 +- .../elasticsearch/core/GetResultMapper.java | 14 + .../elasticsearch/core/ResultsMapper.java | 12 +- .../core/SearchResultMapper.java | 13 + ...cetMapper.java => DefaultFacetMapper.java} | 2 +- .../data/elasticsearch/CarBuilder.java | 38 + .../core/CustomResultMapper.java | 35 + .../core/DefaultEntityMapperTests.java | 51 + .../core/DefaultResultMapperTests.java | 83 ++ ...lasticsearchTemplateCustomMapperTests.java | 6 +- .../core/ElasticsearchTemplateTests.java | 1229 ++++++++--------- .../elasticsearch-template-custom-mapper.xml | 6 +- 15 files changed, 1001 insertions(+), 706 deletions(-) create mode 100644 src/main/java/org/springframework/data/elasticsearch/core/AbstractResultMapper.java create mode 100644 src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java create mode 100644 src/main/java/org/springframework/data/elasticsearch/core/GetResultMapper.java create mode 100644 src/main/java/org/springframework/data/elasticsearch/core/SearchResultMapper.java rename src/main/java/org/springframework/data/elasticsearch/core/facet/{FacetMapper.java => DefaultFacetMapper.java} (98%) create mode 100644 src/test/java/org/springframework/data/elasticsearch/CarBuilder.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/core/CustomResultMapper.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/core/DefaultResultMapperTests.java diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractResultMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractResultMapper.java new file mode 100644 index 000000000..3d2278b93 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractResultMapper.java @@ -0,0 +1,35 @@ +package org.springframework.data.elasticsearch.core; + +import org.springframework.data.elasticsearch.ElasticsearchException; + +import java.io.IOException; + +import static org.apache.commons.lang.StringUtils.isBlank; + +/** + * @author Artur Konczak + */ +public abstract class AbstractResultMapper implements ResultsMapper { + + private EntityMapper entityMapper; + + public AbstractResultMapper(EntityMapper entityMapper) { + this.entityMapper = entityMapper; + } + + public T mapEntity(String source, Class clazz) { + if (isBlank(source)) { + return null; + } + try { + return entityMapper.mapToObject(source, clazz); + } catch (IOException e) { + throw new ElasticsearchException("failed to map source [ " + source + "] to class " + clazz.getSimpleName(), e); + } + } + + @Override + public EntityMapper getEntityMapper() { + return this.entityMapper; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java new file mode 100644 index 000000000..6da45520c --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java @@ -0,0 +1,53 @@ +package org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.facet.Facet; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.facet.DefaultFacetMapper; +import org.springframework.data.elasticsearch.core.facet.FacetResult; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Artur Konczak + */ +public class DefaultResultMapper extends AbstractResultMapper { + + public DefaultResultMapper(){ + super(new DefaultEntityMapper()); + } + + public DefaultResultMapper(EntityMapper entityMapper) { + super(entityMapper); + } + + @Override + public FacetedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + long totalHits = response.getHits().totalHits(); + List results = new ArrayList(); + for (SearchHit hit : response.getHits()) { + if (hit != null) { + results.add(mapEntity(hit.sourceAsString(), clazz)); + } + } + List facets = new ArrayList(); + if (response.getFacets() != null) { + for (Facet facet : response.getFacets()) { + FacetResult facetResult = DefaultFacetMapper.parse(facet); + if (facetResult != null) { + facets.add(facetResult); + } + } + } + + return new FacetedPageImpl(results, pageable, totalHits, facets); + } + + @Override + public T mapResult(GetResponse response, Class clazz) { + return mapEntity(response.getSourceAsString(),clazz); + } +} 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 bae6e6848..54f403cde 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -60,6 +60,16 @@ public interface ElasticsearchOperations { */ T queryForObject(GetQuery query, Class clazz); + /** + * Execute the query against elasticsearch and return the first returned object using custom mapper + * + * @param query + * @param clazz + * @param mapper + * @return the first matching object + */ + T queryForObject(GetQuery query, Class clazz, GetResultMapper mapper); + /** * Execute the query against elasticsearch and return the first returned object * @@ -87,14 +97,14 @@ public interface ElasticsearchOperations { */ FacetedPage queryForPage(SearchQuery query, Class clazz); - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param resultsMapper - * @return - */ - FacetedPage queryForPage(SearchQuery query, ResultsMapper resultsMapper); + /** + * Execute the query against elasticsearch and return result as {@link Page} using custom mapper + * + * @param query + * @param clazz + * @return + */ + FacetedPage queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper); /** * Execute the query against elasticsearch and return result as {@link Page} @@ -114,6 +124,15 @@ public interface ElasticsearchOperations { */ FacetedPage queryForPage(StringQuery query, Class clazz); + /** + * Execute the query against elasticsearch and return result as {@link Page} using custom mapper + * + * @param query + * @param clazz + * @return + */ + FacetedPage queryForPage(StringQuery query, Class clazz, SearchResultMapper mapper); + /** * Execute the criteria query against elasticsearch and return result as {@link List} * @@ -284,11 +303,11 @@ public interface ElasticsearchOperations { * * @param scrollId * @param scrollTimeInMillis - * @param resultsMapper + * @param clazz * @param * @return */ - Page scroll(String scrollId, long scrollTimeInMillis, ResultsMapper resultsMapper); + Page scroll(String scrollId, long scrollTimeInMillis, Class clazz); /** * more like this query to search for documents that are "like" a specific document. 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 fa9791a5b..a4cc3e0ef 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -39,20 +39,16 @@ import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.facet.Facet; import org.elasticsearch.search.facet.FacetBuilder; import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; -import org.springframework.data.elasticsearch.core.facet.FacetMapper; import org.springframework.data.elasticsearch.core.facet.FacetRequest; -import org.springframework.data.elasticsearch.core.facet.FacetResult; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; import org.springframework.data.elasticsearch.core.query.*; @@ -86,25 +82,29 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { private Client client; private ElasticsearchConverter elasticsearchConverter; - private EntityMapper entityMapper; + private ResultsMapper resultsMapper; public ElasticsearchTemplate(Client client) { this(client, null, null); } public ElasticsearchTemplate(Client client, EntityMapper entityMapper) { - this(client, null, entityMapper); + this(client, null, new DefaultResultMapper(entityMapper)); + } + + public ElasticsearchTemplate(Client client, ResultsMapper resultsMapper) { + this(client, null, resultsMapper); } public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearchConverter) { this(client, elasticsearchConverter, null); } - public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearchConverter, EntityMapper entityMapper) { + public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearchConverter, ResultsMapper resultsMapper) { this.client = client; - this.entityMapper = (entityMapper == null) ? new DefaultEntityMapper() : entityMapper; this.elasticsearchConverter = (elasticsearchConverter == null) ? new MappingElasticsearchConverter( new SimpleElasticsearchMappingContext()) : elasticsearchConverter; + this.resultsMapper = (resultsMapper == null) ? new DefaultResultMapper() : resultsMapper; } @Override @@ -134,11 +134,16 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public T queryForObject(GetQuery query, Class clazz) { + return queryForObject(query, clazz, resultsMapper); + } + + @Override + public T queryForObject(GetQuery query, Class clazz, GetResultMapper mapper) { ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); GetResponse response = client .prepareGet(persistentEntity.getIndexName(), persistentEntity.getIndexType(), query.getId()).execute() .actionGet(); - return mapResult(response.getSourceAsString(), clazz); + return mapper.mapResult(response, clazz); } @Override @@ -157,14 +162,13 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public FacetedPage queryForPage(SearchQuery query, Class clazz) { - SearchResponse response = doSearch(prepareSearch(query, clazz), query); - return mapResults(response, clazz, query.getPageable()); + return queryForPage(query, clazz, resultsMapper); } @Override - public FacetedPage queryForPage(SearchQuery query, ResultsMapper resultsMapper) { - SearchResponse response = doSearch(prepareSearch(query), query); - return resultsMapper.mapResults(response); + public FacetedPage queryForPage(SearchQuery query, Class clazz, SearchResultMapper mapper) { + SearchResponse response = doSearch(prepareSearch(query, clazz), query); + return mapper.mapResults(response, clazz, query.getPageable()); } @Override @@ -209,13 +213,18 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { SearchResponse response = searchRequestBuilder .execute().actionGet(); - return mapResults(response, clazz, criteriaQuery.getPageable()); + return resultsMapper.mapResults(response, clazz, criteriaQuery.getPageable()); } @Override public FacetedPage queryForPage(StringQuery query, Class clazz) { + return queryForPage(query, clazz, resultsMapper); + } + + @Override + public FacetedPage queryForPage(StringQuery query, Class clazz, SearchResultMapper mapper) { SearchResponse response = prepareSearch(query, clazz).setQuery(query.getSource()).execute().actionGet(); - return mapResults(response, clazz, query.getPageable()); + return mapper.mapResults(response, clazz, query.getPageable()); } @Override @@ -349,10 +358,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } @Override - public Page scroll(String scrollId, long scrollTimeInMillis, ResultsMapper resultsMapper) { + public Page scroll(String scrollId, long scrollTimeInMillis, Class clazz) { SearchResponse response = client.prepareSearchScroll(scrollId) .setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute().actionGet(); - return resultsMapper.mapResults(response); + return resultsMapper.mapResults(response, clazz, null); } @Override @@ -415,7 +424,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } SearchResponse response = requestBuilder.execute().actionGet(); - return mapResults(response, clazz, query.getPageable()); + return resultsMapper.mapResults(response, clazz, query.getPageable()); } private SearchResponse doSearch(SearchRequestBuilder searchRequest, SearchQuery searchQuery) { @@ -513,7 +522,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { : query.getType(); IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource( - entityMapper.mapToString(query.getObject())); + resultsMapper.getEntityMapper().mapToString(query.getObject())); if (query.getVersion() != null) { indexRequestBuilder.setVersion(query.getVersion()); @@ -549,33 +558,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return new String[]{getPersistentEntityFor(clazz).getIndexType()}; } - private FacetedPage mapResults(SearchResponse response, final Class elementType, final Pageable pageable) { - ResultsMapper resultsMapper = new ResultsMapper() { - @Override - public FacetedPage mapResults(SearchResponse response) { - long totalHits = response.getHits().totalHits(); - List results = new ArrayList(); - for (SearchHit hit : response.getHits()) { - if (hit != null) { - results.add(mapResult(hit.sourceAsString(), elementType)); - } - } - List facets = new ArrayList(); - if (response.getFacets() != null) { - for (Facet facet : response.getFacets()) { - FacetResult facetResult = FacetMapper.parse(facet); - if (facetResult != null) { - facets.add(facetResult); - } - } - } - - return new FacetedPageImpl(results, pageable, totalHits, facets); - } - }; - return resultsMapper.mapResults(response); - } - private List extractIds(SearchResponse response) { List ids = new ArrayList(); for (SearchHit hit : response.getHits()) { @@ -586,24 +568,13 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return ids; } - private T mapResult(String source, Class clazz) { - if (isBlank(source)) { - return null; - } - try { - return entityMapper.mapToObject(source, clazz); - } catch (IOException e) { - throw new ElasticsearchException("failed to map source [ " + source + "] to class " + clazz.getSimpleName(), e); - } - } - private static String[] toArray(List values) { String[] valuesAsArray = new String[values.size()]; return values.toArray(valuesAsArray); } - protected EntityMapper getEntityMapper() { - return entityMapper; + protected ResultsMapper getResultsMapper() { + return resultsMapper; } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/GetResultMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/GetResultMapper.java new file mode 100644 index 000000000..382126464 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/GetResultMapper.java @@ -0,0 +1,14 @@ +package org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.springframework.data.domain.Pageable; + +/** + * @author Artur Konczak + */ +public interface GetResultMapper { + + T mapResult(GetResponse response, Class clazz); + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java index c12492283..327a4a849 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ResultsMapper.java @@ -15,22 +15,16 @@ */ package org.springframework.data.elasticsearch.core; -import org.elasticsearch.action.search.SearchResponse; -import org.springframework.data.domain.Page; - /** * ResultsMapper - * - * @param - * + * * @author Rizwan Idrees * @author Mohsin Husen * @author Artur Konczak - * */ -public interface ResultsMapper { +public interface ResultsMapper extends SearchResultMapper, GetResultMapper { - FacetedPage mapResults(SearchResponse response); + EntityMapper getEntityMapper(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/SearchResultMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/SearchResultMapper.java new file mode 100644 index 000000000..c5ebf8cd9 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/SearchResultMapper.java @@ -0,0 +1,13 @@ +package org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.search.SearchResponse; +import org.springframework.data.domain.Pageable; + +/** + * @author Artur Konczak + */ +public interface SearchResultMapper { + + FacetedPage mapResults(SearchResponse response, Class clazz, Pageable pageable); + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java similarity index 98% rename from src/main/java/org/springframework/data/elasticsearch/core/facet/FacetMapper.java rename to src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java index 5a11afefd..80374da6e 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetMapper.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/DefaultFacetMapper.java @@ -14,7 +14,7 @@ import java.util.List; * @author Artur Konczak * @author Petar Tahchiev */ -public class FacetMapper { +public class DefaultFacetMapper { public static FacetResult parse(Facet facet) { if (facet instanceof TermsFacet) { diff --git a/src/test/java/org/springframework/data/elasticsearch/CarBuilder.java b/src/test/java/org/springframework/data/elasticsearch/CarBuilder.java new file mode 100644 index 000000000..e312a99e6 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/CarBuilder.java @@ -0,0 +1,38 @@ +/* + * Copyright 2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.elasticsearch; + +/** + * @author Artur Konczak + */ +public class CarBuilder { + + private Car car = new Car(); + + public CarBuilder name(String name) { + car.setName(name); + return this; + } + + public CarBuilder model(String model) { + car.setModel(model); + return this; + } + + public Car build(){ + return car; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/CustomResultMapper.java b/src/test/java/org/springframework/data/elasticsearch/core/CustomResultMapper.java new file mode 100644 index 000000000..e2676fa9a --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/CustomResultMapper.java @@ -0,0 +1,35 @@ +package org.springframework.data.elasticsearch.core; + +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.springframework.data.domain.Pageable; + +/** + * User: dead + * Date: 11/11/13 + * Time: 17:37 + */ +public class CustomResultMapper implements ResultsMapper{ + + + private EntityMapper entityMapper; + + public CustomResultMapper(EntityMapper entityMapper) { + this.entityMapper = entityMapper; + } + + @Override + public EntityMapper getEntityMapper() { + return entityMapper; + } + + @Override + public T mapResult(GetResponse response, Class clazz) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public FacetedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java new file mode 100644 index 000000000..69e04482e --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java @@ -0,0 +1,51 @@ +package org.springframework.data.elasticsearch.core; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.data.elasticsearch.Car; +import org.springframework.data.elasticsearch.CarBuilder; + +import java.io.IOException; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Artur Konczak + */ +public class DefaultEntityMapperTests { + + public static final String JSON_STRING = "{\"name\":\"Grat\",\"model\":\"Ford\"}"; + public static final String CAR_MODEL = "Ford"; + public static final String CAR_NAME = "Grat"; + DefaultEntityMapper entityMapper; + + @Before + public void init(){ + entityMapper = new DefaultEntityMapper(); + } + + @Test + public void shouldMapObjectToJsonString() throws IOException { + //Given + + //When + String jsonResult = entityMapper.mapToString(new CarBuilder().model(CAR_MODEL).name(CAR_NAME).build()); + + //Then + assertThat(jsonResult, is(JSON_STRING)); + } + + @Test + public void shouldMapJsonStringToObject() throws IOException { + //Given + + //When + Car result = entityMapper.mapToObject(JSON_STRING,Car.class); + + //Then + assertThat(result.getName(),is(CAR_NAME)); + assertThat(result.getModel(),is(CAR_MODEL)); + } + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/DefaultResultMapperTests.java b/src/test/java/org/springframework/data/elasticsearch/core/DefaultResultMapperTests.java new file mode 100644 index 000000000..845832246 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/DefaultResultMapperTests.java @@ -0,0 +1,83 @@ +package org.springframework.data.elasticsearch.core; + +import org.apache.commons.collections.iterators.ArrayIterator; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.data.elasticsearch.Car; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Artur Konczak + */ +public class DefaultResultMapperTests { + + private DefaultResultMapper resultMapper; + + @Mock + private SearchResponse response; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + resultMapper = new DefaultResultMapper(); + } + + @Test + public void shouldMapSearchRequestToPage() { + //Given + SearchHit[] hits = {createCarHit("Ford", "Grat"), createCarHit("BMW", "Arrow")}; + SearchHits searchHits = mock(SearchHits.class); + when(searchHits.totalHits()).thenReturn(2L); + when(searchHits.iterator()).thenReturn(new ArrayIterator(hits)); + when(response.getHits()).thenReturn(searchHits); + + //When + FacetedPage page = resultMapper.mapResults(response, Car.class, null); + + //Then + assertThat(page.hasContent(), is(true)); + assertThat(page.getTotalElements(), is(2L)); + assertThat(page.getContent().get(0).getName(), is("Ford")); + } + + @Test + public void shouldMapGetRequestToObject() { + //Given + GetResponse response = mock(GetResponse.class); + when(response.getSourceAsString()).thenReturn(createJsonCar("Ford", "Grat")); + + //When + Car result = resultMapper.mapResult(response, Car.class); + + //Then + assertThat(result, notNullValue()); + assertThat(result.getModel(), is("Grat")); + assertThat(result.getName(), is("Ford")); + } + + private SearchHit createCarHit(String name, String model) { + SearchHit hit = mock(SearchHit.class); + when(hit.sourceAsString()).thenReturn(createJsonCar(name, model)); + return hit; + } + + private String createJsonCar(String name, String model) { + final String q = "\""; + StringBuffer sb = new StringBuffer(); + sb.append("{").append(q).append("name").append(q).append(":").append(q).append(name).append(q).append(","); + sb.append(q).append("model").append(q).append(":").append(q).append(model).append(q).append("}"); + return sb.toString(); + } + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateCustomMapperTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateCustomMapperTests.java index 7bade55b1..1b108915e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateCustomMapperTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateCustomMapperTests.java @@ -37,12 +37,16 @@ public class ElasticsearchTemplateCustomMapperTests { @Autowired private EntityMapper entityMapper; + @Autowired + private ResultsMapper resultsMapper; + @Test public void shouldUseCustomMapper() { //given //when //them - assertThat(elasticsearchTemplate.getEntityMapper(), is(entityMapper)); + assertThat(elasticsearchTemplate.getResultsMapper(), is(resultsMapper)); + assertThat(elasticsearchTemplate.getResultsMapper().getEntityMapper(), is(entityMapper)); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 6cdc46204..592c610d2 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -29,6 +29,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.SampleEntity; import org.springframework.data.elasticsearch.SampleMappingEntity; @@ -55,524 +56,504 @@ import static org.junit.Assert.*; @ContextConfiguration("classpath:elasticsearch-template-test.xml") public class ElasticsearchTemplateTests { - @Autowired - private ElasticsearchTemplate elasticsearchTemplate; + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; @Before - public void before(){ + public void before() { elasticsearchTemplate.deleteIndex(SampleEntity.class); elasticsearchTemplate.createIndex(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class, true); } - @Test - public void shouldReturnCountForGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - // when - long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class); - // then - assertThat(count, is(equalTo(1L))); - } - - @Test - public void shouldReturnObjectForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - GetQuery getQuery = new GetQuery(); - getQuery.setId(documentId); - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); - // then - assertNotNull("not null....", sampleEntity1); - assertEquals(sampleEntity, sampleEntity1); - } - - @Test - public void shouldReturnPageForGivenSearchQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities, is(notNullValue())); - assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); - } - - @Test - public void shouldDoBulkIndex() { - // given - List indexQueries = new ArrayList(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("some 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("some message"); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - - indexQueries.add(indexQuery2); - // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class, true); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); - } - - @Test - public void shouldDeleteDocumentForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - elasticsearchTemplate.delete("test-index", "test-type", documentId); - elasticsearchTemplate.refresh(SampleEntity.class, true); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldDeleteEntityForGivenId() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - elasticsearchTemplate.delete(SampleEntity.class, documentId); - elasticsearchTemplate.refresh(SampleEntity.class, true); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldDeleteDocumentForGivenQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - // when - DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(fieldQuery("id", documentId)); - elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); - // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - assertThat(sampleEntities.getTotalElements(), equalTo(0L)); - } - - @Test - public void shouldFilterSearchResultsForGivenFilter() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFilter(boolFilter().must(termFilter("id", documentId))).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldSortResultsGivenSortCriteria() { - // given - List indexQueries = new ArrayList(); - // first document - String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId); - sampleEntity1.setMessage("abc"); - sampleEntity1.setRate(10); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId); - indexQuery1.setObject(sampleEntity1); - - // second document - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage("xyz"); - sampleEntity2.setRate(5); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - - // third document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setMessage("xyz"); - sampleEntity3.setRate(15); - sampleEntity3.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery3 = new IndexQuery(); - indexQuery3.setId(documentId3); - indexQuery3.setObject(sampleEntity3); - - indexQueries.add(indexQuery1); - indexQueries.add(indexQuery2); - indexQueries.add(indexQuery3); - - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withSort(new FieldSortBuilder("rate").ignoreUnmapped(true).order(SortOrder.ASC)).build(); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(3L)); - assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); - } - - @Test - public void shouldExecuteStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), equalTo(1L)); - } - - @Test - public void shouldReturnPageableResultsGivenStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10)); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - - // then - assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - @Ignore("By default, the search request will fail if there is no mapping associated with a field. The ignore_unmapped option allows to ignore fields that have no mapping and not sort by them") - public void shouldReturnSortedPageableResultsGivenStringQuery() { - // todo - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10), new Sort( - new Sort.Order(Sort.Direction.ASC, "messsage"))); - // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); - } - - @Test - public void shouldReturnObjectMatchingGivenStringQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - StringQuery stringQuery = new StringQuery(fieldQuery("id", documentId).toString()); - // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); - // then - assertThat(sampleEntity1, is(notNullValue())); - assertThat(sampleEntity1.getId(), is(equalTo(documentId))); - } - - @Test - public void shouldCreateIndexGivenEntityClass() { - // when - boolean created = elasticsearchTemplate.createIndex(SampleEntity.class); - // then - assertThat(created, is(true)); - } - - @Test - public void shouldExecuteGivenCriteriaQuery() { - // given - String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage("some test message"); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); - - // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); - // then - assertThat(sampleEntity1, is(notNullValue())); - } - - @Test - public void shouldReturnSpecifiedFields() { - // given - String documentId = randomNumeric(5); - String message = "some test message"; - SampleEntity sampleEntity = new SampleEntity(); - sampleEntity.setId(documentId); - sampleEntity.setMessage(message); - sampleEntity.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(documentId); - indexQuery.setObject(sampleEntity); - - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(SampleEntity.class, true); - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index") - .withTypes("test-type").withFields("message").build(); - // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, new ResultsMapper() { - @Override - public FacetedPage mapResults(SearchResponse response) { - List values = new ArrayList(); - for (SearchHit searchHit : response.getHits()) { - values.add((String) searchHit.field("message").value()); - } - return new FacetedPageImpl(values); - } - }); - // then - assertThat(page, is(notNullValue())); - assertThat(page.getTotalElements(), is(equalTo(1L))); - assertThat(page.getContent().get(0), is(message)); - } - - @Test - public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { - // given - String sampleMessage = "So we build a web site or an application and want to add search to it, " - + "and then it hits us: getting search working is hard. We want our search solution to be fast," - + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " - + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " - + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; - - String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntity(); - sampleEntity1.setId(documentId1); - sampleEntity1.setMessage(sampleMessage); - sampleEntity1.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery1 = new IndexQuery(); - indexQuery1.setId(documentId1); - indexQuery1.setObject(sampleEntity1); - - elasticsearchTemplate.index(indexQuery1); - - String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntity(); - sampleEntity2.setId(documentId2); - sampleEntity2.setMessage(sampleMessage); - sampleEntity2.setVersion(System.currentTimeMillis()); - - IndexQuery indexQuery2 = new IndexQuery(); - indexQuery2.setId(documentId2); - indexQuery2.setObject(sampleEntity2); - - elasticsearchTemplate.index(indexQuery2); - elasticsearchTemplate.refresh(SampleEntity.class, true); - - MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); - moreLikeThisQuery.setId(documentId2); - moreLikeThisQuery.addFields("message"); - moreLikeThisQuery.setMinDocFreq(1); - // when - Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class); - - // then - assertThat(sampleEntities.getTotalElements(), is(equalTo(1L))); - assertThat(sampleEntities.getContent(), hasItem(sampleEntity1)); - } - - @Test - public void shouldReturnResultsWithScanAndScroll() { - //given - List entities = createSampleEntitiesWithMessage("Test message", 30); - // when - elasticsearchTemplate.bulkIndex(entities); - elasticsearchTemplate.refresh(SampleEntity.class, true); - // then - - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index") - .withTypes("test-type").withPageable(new PageRequest(0, 10)).build(); - - String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false); - List sampleEntities = new ArrayList(); - boolean hasRecords = true; + @Test + public void shouldReturnCountForGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + // when + long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class); + // then + assertThat(count, is(equalTo(1L))); + } + + @Test + public void shouldReturnObjectForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + GetQuery getQuery = new GetQuery(); + getQuery.setId(documentId); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + // then + assertNotNull("not null....", sampleEntity1); + assertEquals(sampleEntity, sampleEntity1); + } + + @Test + public void shouldReturnPageForGivenSearchQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities, is(notNullValue())); + assertThat(sampleEntities.getTotalElements(), greaterThanOrEqualTo(1L)); + } + + @Test + public void shouldDoBulkIndex() { + // given + List indexQueries = new ArrayList(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("some 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("some message"); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + indexQueries.add(indexQuery2); + // when + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class, true); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), is(equalTo(2L))); + } + + @Test + public void shouldDeleteDocumentForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + elasticsearchTemplate.delete("test-index", "test-type", documentId); + elasticsearchTemplate.refresh(SampleEntity.class, true); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldDeleteEntityForGivenId() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + elasticsearchTemplate.delete(SampleEntity.class, documentId); + elasticsearchTemplate.refresh(SampleEntity.class, true); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldDeleteDocumentForGivenQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + // when + DeleteQuery deleteQuery = new DeleteQuery(); + deleteQuery.setQuery(fieldQuery("id", documentId)); + elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); + // then + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + + @Test + public void shouldFilterSearchResultsForGivenFilter() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withFilter(boolFilter().must(termFilter("id", documentId))).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldSortResultsGivenSortCriteria() { + // given + List indexQueries = new ArrayList(); + // first document + String documentId = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId); + sampleEntity1.setMessage("abc"); + sampleEntity1.setRate(10); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId); + indexQuery1.setObject(sampleEntity1); + + // second document + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage("xyz"); + sampleEntity2.setRate(5); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + // third document + String documentId3 = randomNumeric(5); + SampleEntity sampleEntity3 = new SampleEntity(); + sampleEntity3.setId(documentId3); + sampleEntity3.setMessage("xyz"); + sampleEntity3.setRate(15); + sampleEntity3.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery3 = new IndexQuery(); + indexQuery3.setId(documentId3); + indexQuery3.setObject(sampleEntity3); + + indexQueries.add(indexQuery1); + indexQueries.add(indexQuery2); + indexQueries.add(indexQuery3); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) + .withSort(new FieldSortBuilder("rate").ignoreUnmapped(true).order(SortOrder.ASC)).build(); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(3L)); + assertThat(sampleEntities.getContent().get(0).getRate(), is(sampleEntity2.getRate())); + } + + @Test + public void shouldExecuteStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), equalTo(1L)); + } + + @Test + public void shouldReturnPageableResultsGivenStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10)); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + + // then + assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + @Ignore("By default, the search request will fail if there is no mapping associated with a field. The ignore_unmapped option allows to ignore fields that have no mapping and not sort by them") + public void shouldReturnSortedPageableResultsGivenStringQuery() { + // todo + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), new PageRequest(0, 10), new Sort( + new Sort.Order(Sort.Direction.ASC, "messsage"))); + // when + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntities.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + @Test + public void shouldReturnObjectMatchingGivenStringQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + StringQuery stringQuery = new StringQuery(fieldQuery("id", documentId).toString()); + // when + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); + // then + assertThat(sampleEntity1, is(notNullValue())); + assertThat(sampleEntity1.getId(), is(equalTo(documentId))); + } + + @Test + public void shouldCreateIndexGivenEntityClass() { + // when + boolean created = elasticsearchTemplate.createIndex(SampleEntity.class); + // then + assertThat(created, is(true)); + } + + @Test + public void shouldExecuteGivenCriteriaQuery() { + // given + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage("some test message"); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); + + // when + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + // then + assertThat(sampleEntity1, is(notNullValue())); + } + + @Test + public void shouldReturnSpecifiedFields() { + // given + String documentId = randomNumeric(5); + String message = "some test message"; + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage(message); + sampleEntity.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId(documentId); + indexQuery.setObject(sampleEntity); + + elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.refresh(SampleEntity.class, true); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index") + .withTypes("test-type").withFields("message").build(); + // when + Page page = elasticsearchTemplate.queryForPage(searchQuery, String.class, new SearchResultMapper() { + @Override + public FacetedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { + List values = new ArrayList(); + for (SearchHit searchHit : response.getHits()) { + values.add((String) searchHit.field("message").value()); + } + return new FacetedPageImpl((List) values); + } + }); + // then + assertThat(page, is(notNullValue())); + assertThat(page.getTotalElements(), is(equalTo(1L))); + assertThat(page.getContent().get(0), is(message)); + } + + @Test + public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { + // given + String sampleMessage = "So we build a web site or an application and want to add search to it, " + + "and then it hits us: getting search working is hard. We want our search solution to be fast," + + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " + + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " + + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; + + String documentId1 = randomNumeric(5); + SampleEntity sampleEntity1 = new SampleEntity(); + sampleEntity1.setId(documentId1); + sampleEntity1.setMessage(sampleMessage); + sampleEntity1.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery1 = new IndexQuery(); + indexQuery1.setId(documentId1); + indexQuery1.setObject(sampleEntity1); + + elasticsearchTemplate.index(indexQuery1); + + String documentId2 = randomNumeric(5); + SampleEntity sampleEntity2 = new SampleEntity(); + sampleEntity2.setId(documentId2); + sampleEntity2.setMessage(sampleMessage); + sampleEntity2.setVersion(System.currentTimeMillis()); + + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); + + elasticsearchTemplate.index(indexQuery2); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); + moreLikeThisQuery.setId(documentId2); + moreLikeThisQuery.addFields("message"); + moreLikeThisQuery.setMinDocFreq(1); + // when + Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class); + + // then + assertThat(sampleEntities.getTotalElements(), is(equalTo(1L))); + assertThat(sampleEntities.getContent(), hasItem(sampleEntity1)); + } + + @Test + public void shouldReturnResultsWithScanAndScroll() { + //given + List entities = createSampleEntitiesWithMessage("Test message", 30); + // when + elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.refresh(SampleEntity.class, true); + // then + + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices("test-index") + .withTypes("test-type").withPageable(new PageRequest(0, 10)).build(); + + String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false); + List sampleEntities = new ArrayList(); + boolean hasRecords = true; while (hasRecords) { - Page page = elasticsearchTemplate.scroll(scrollId, 5000L, new ResultsMapper() { - @Override - public FacetedPage mapResults(SearchResponse response) { - List chunk = new ArrayList(); - for (SearchHit searchHit : response.getHits()) { - if (response.getHits().getHits().length <= 0) { - return null; - } - SampleEntity user = new SampleEntity(); - user.setId(searchHit.getId()); - user.setMessage((String) searchHit.getSource().get("message")); - chunk.add(user); - } - if(chunk.size() > 0){ - - return new FacetedPageImpl(chunk); - } - return null; - } - - }); - if (page != null) { - sampleEntities.addAll(page.getContent()); + Page page = elasticsearchTemplate.scroll(scrollId, 5000L, SampleEntity.class); + if (page.hasContent()) { + sampleEntities.addAll(page.getContent()); } else { hasRecords = false; } - } - assertThat(sampleEntities.size(), is(equalTo(30))); - } + } + assertThat(sampleEntities.size(), is(equalTo(30))); + } private static List createSampleEntitiesWithMessage(String message, int numberOfEntities) { List indexQueries = new ArrayList(); @@ -591,132 +572,132 @@ public class ElasticsearchTemplateTests { return indexQueries; } - @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()); + @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); + 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()); + // 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); + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); + indexQueries.add(indexQuery2); - // second document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setMessage("some message"); - sampleEntity3.setVersion(System.currentTimeMillis()); + // 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); + 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)); - } + 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()); + @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); + 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()); + // 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); + IndexQuery indexQuery2 = new IndexQuery(); + indexQuery2.setId(documentId2); + indexQuery2.setObject(sampleEntity2); - indexQueries.add(indexQuery2); + indexQueries.add(indexQuery2); - // second document - String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntity(); - sampleEntity3.setId(documentId3); - sampleEntity3.setMessage("some message"); - sampleEntity3.setVersion(System.currentTimeMillis()); + // 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); + 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)); - } + 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 - Class entity = SampleMappingEntity.class; - elasticsearchTemplate.createIndex(entity); - // when - assertThat(elasticsearchTemplate.putMapping(entity), is(true)); - } + @Test + public void shouldPutMappingForGivenEntity() throws Exception { + // given + Class entity = SampleMappingEntity.class; + elasticsearchTemplate.createIndex(entity); + // when + assertThat(elasticsearchTemplate.putMapping(entity), is(true)); + } - @Test - public void shouldDeleteIndexForGivenEntity() { - // given - Class clazz = SampleEntity.class; - // when - elasticsearchTemplate.deleteIndex(clazz); - // then - assertThat(elasticsearchTemplate.indexExists(clazz), is(false)); - } + @Test + public void shouldDeleteIndexForGivenEntity() { + // given + Class clazz = SampleEntity.class; + // when + elasticsearchTemplate.deleteIndex(clazz); + // then + assertThat(elasticsearchTemplate.indexExists(clazz), is(false)); + } @Test public void shouldDoPartialUpdateForExistingDocument() { @@ -751,7 +732,7 @@ public class ElasticsearchTemplateTests { } @Test(expected = DocumentMissingException.class) - public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate(){ + public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { // when IndexRequest indexRequest = new IndexRequest(); UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)) @@ -760,7 +741,7 @@ public class ElasticsearchTemplateTests { } @Test - public void shouldDoUpsertIfDocumentDoesNotExist(){ + public void shouldDoUpsertIfDocumentDoesNotExist() { //given String documentId = randomNumeric(5); String message = "test message"; @@ -779,7 +760,7 @@ public class ElasticsearchTemplateTests { } @Test - public void shouldReturnHighlightedFieldsForGivenQueryAndFields(){ + public void shouldReturnHighlightedFieldsForGivenQueryAndFields() { //given String documentId = randomNumeric(5); @@ -803,9 +784,9 @@ public class ElasticsearchTemplateTests { .withHighlightFields(new HighlightBuilder.Field("message")) .build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, new ResultsMapper() { + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() { @Override - public FacetedPage mapResults(SearchResponse response) { + public FacetedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) { List chunk = new ArrayList(); for (SearchHit searchHit : response.getHits()) { if (response.getHits().getHits().length <= 0) { @@ -817,8 +798,8 @@ public class ElasticsearchTemplateTests { user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString()); chunk.add(user); } - if(chunk.size() > 0){ - return new FacetedPageImpl(chunk); + if (chunk.size() > 0) { + return new FacetedPageImpl((List) chunk); } return null; } @@ -844,7 +825,7 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.index(indexQuery); // when - elasticsearchTemplate.deleteType("test-index","test-type"); + elasticsearchTemplate.deleteType("test-index", "test-type"); //then boolean typeExists = elasticsearchTemplate.typeExists("test-index", "test-type"); @@ -852,7 +833,7 @@ public class ElasticsearchTemplateTests { } @Test - public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery(){ + public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { // given String documentId = randomNumeric(5); SampleEntity sampleEntity = new SampleEntity(); diff --git a/src/test/resources/elasticsearch-template-custom-mapper.xml b/src/test/resources/elasticsearch-template-custom-mapper.xml index d3712b8f5..57e9877e4 100644 --- a/src/test/resources/elasticsearch-template-custom-mapper.xml +++ b/src/test/resources/elasticsearch-template-custom-mapper.xml @@ -10,9 +10,13 @@ - + + + + + \ No newline at end of file