From dd0ce8a947a08262a979573682013010b2c47c32 Mon Sep 17 00:00:00 2001 From: Ryan Murfitt Date: Tue, 11 Feb 2014 19:52:59 +1000 Subject: [PATCH] DATAES-52 - Implement elastic search get and multi get with routing support --- .../core/ElasticsearchOperations.java | 24 +++++++- .../core/ElasticsearchTemplate.java | 33 +++++++++- .../core/ElasticsearchTemplateTests.java | 61 +++++++++++++++++++ 3 files changed, 115 insertions(+), 3 deletions(-) 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 b10fc2ad4..4f0529597 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -15,6 +15,8 @@ */ package org.springframework.data.elasticsearch.core; +import java.util.Collection; +import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -181,7 +183,27 @@ public interface ElasticsearchOperations { */ long count(SearchQuery query, Class clazz); - /** + /** + * Execute a multiget against elasticsearch for the given ids + * + * @param ids + * @param route + * @param clazz + * @return + */ + LinkedList getObjects(Collection ids, String route, Class clazz); + + /** + * Execute a get against elasticsearch for the given id + * + * @param id + * @param route + * @param clazz + * @return + */ + T getObject(String id, String route, Class clazz); + + /** * Index an object. Will do save or update * * @param query 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 b82969477..7c8ec944c 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -37,7 +37,7 @@ import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.count.CountRequestBuilder; -import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.get.*; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.mlt.MoreLikeThisRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder; @@ -246,7 +246,36 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return countRequestBuilder.execute().actionGet().getCount(); } - @Override + @Override + public LinkedList getObjects(Collection ids, String route, Class clazz) { + ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); + MultiGetRequestBuilder builder = client.prepareMultiGet(); + for (String id : ids) { + builder.add(new MultiGetRequest.Item(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).routing(route)); + } + MultiGetResponse responses = builder.execute().actionGet(); + final LinkedList result = new LinkedList(); + for (MultiGetItemResponse response : responses.getResponses()) { + if (!response.isFailed() && response.getResponse().isExists()) { + result.add(resultsMapper.mapResult(response.getResponse(), clazz)); + } + } + return result; + } + + @Override + public T getObject(String id, String route, Class clazz) { + if (id != null) { + ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); + GetResponse response = client + .prepareGet(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).setRouting(route) + .execute().actionGet(); + return resultsMapper.mapResult(response, clazz); + } + return null; + } + + @Override public String index(IndexQuery query) { String documentId = prepareIndex(query).execute().actionGet().getId(); // We should call this because we are not going through a mapper. 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 7f9451d11..c328460df 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -112,6 +112,67 @@ public class ElasticsearchTemplateTests { assertEquals(sampleEntity, sampleEntity1); } + @Test + public void shouldReturnObjectForGivenIdUsingGet() { + // 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 + SampleEntity sampleEntity1 = elasticsearchTemplate.getObject(documentId, "", SampleEntity.class); + // then + assertNotNull("not null....", sampleEntity1); + assertEquals(sampleEntity, sampleEntity1); + } + + @Test + public void shouldReturnObjectsForGivenIdsUsingMultiGet() { + // 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); + + elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.refresh(SampleEntity.class, true); + + // when + LinkedList sampleEntities = elasticsearchTemplate.getObjects(Arrays.asList(documentId, documentId2), "", SampleEntity.class); + // then + assertThat(sampleEntities.size(), is(equalTo(2))); + assertEquals(sampleEntities.get(0), sampleEntity1); + assertEquals(sampleEntities.get(1), sampleEntity2); + } + @Test public void shouldReturnPageForGivenSearchQuery() { // given