Skip to content

Commit c2a5371

Browse files
committed
DATAES-52 - Support Get & Multi Get
Removed getObject() as it was already implemented using queryForObject() Changed Method name to multiGet() from getObjects() Made method to accept searchQuery instead of individual params
1 parent ab7c01b commit c2a5371

File tree

6 files changed

+141
-112
lines changed

6 files changed

+141
-112
lines changed

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java

100644100755
Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core;
1717

18-
import java.util.Collection;
1918
import java.util.LinkedList;
2019
import java.util.List;
2120
import java.util.Set;
@@ -183,27 +182,16 @@ public interface ElasticsearchOperations {
183182
*/
184183
<T> long count(SearchQuery query, Class<T> clazz);
185184

186-
/**
187-
* Execute a multiget against elasticsearch for the given ids
188-
*
189-
* @param ids
190-
* @param route
191-
* @param clazz
192-
* @return
193-
*/
194-
<T> LinkedList<T> getObjects(Collection<String> ids, String route, Class<T> clazz);
195-
196-
/**
197-
* Execute a get against elasticsearch for the given id
198-
*
199-
* @param id
200-
* @param route
201-
* @param clazz
202-
* @return
203-
*/
204-
<T> T getObject(String id, String route, Class<T> clazz);
205-
206-
/**
185+
/**
186+
* Execute a multiget against elasticsearch for the given ids
187+
*
188+
* @param searchQuery
189+
* @param clazz
190+
* @return
191+
*/
192+
<T> LinkedList<T> multiGet(SearchQuery searchQuery, Class<T> clazz);
193+
194+
/**
207195
* Index an object. Will do save or update
208196
*
209197
* @param query

src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java

100644100755
Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -246,36 +246,37 @@ public <T> long count(SearchQuery query, Class<T> clazz) {
246246
return countRequestBuilder.execute().actionGet().getCount();
247247
}
248248

249-
@Override
250-
public <T> LinkedList<T> getObjects(Collection<String> ids, String route, Class<T> clazz) {
251-
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
252-
MultiGetRequestBuilder builder = client.prepareMultiGet();
253-
for (String id : ids) {
254-
builder.add(new MultiGetRequest.Item(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).routing(route));
255-
}
256-
MultiGetResponse responses = builder.execute().actionGet();
257-
final LinkedList<T> result = new LinkedList<T>();
258-
for (MultiGetItemResponse response : responses.getResponses()) {
259-
if (!response.isFailed() && response.getResponse().isExists()) {
260-
result.add(resultsMapper.mapResult(response.getResponse(), clazz));
261-
}
262-
}
263-
return result;
264-
}
265-
266-
@Override
267-
public <T> T getObject(String id, String route, Class<T> clazz) {
268-
if (id != null) {
269-
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
270-
GetResponse response = client
271-
.prepareGet(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id).setRouting(route)
272-
.execute().actionGet();
273-
return resultsMapper.mapResult(response, clazz);
274-
}
275-
return null;
276-
}
277-
278-
@Override
249+
@Override
250+
public <T> LinkedList<T> multiGet(SearchQuery searchQuery, Class<T> clazz) {
251+
252+
ElasticsearchPersistentEntity<T> persistentEntity = getPersistentEntityFor(clazz);
253+
254+
MultiGetRequestBuilder builder = client.prepareMultiGet();
255+
256+
for (String id : searchQuery.getIds()) {
257+
258+
MultiGetRequest.Item item = new MultiGetRequest.Item(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id);
259+
260+
if (searchQuery.getRoute() != null) {
261+
item = item.routing(searchQuery.getRoute());
262+
}
263+
264+
if (searchQuery.getFields() != null && !searchQuery.getFields().isEmpty()) {
265+
item = item.fields(toArray(searchQuery.getFields()));
266+
}
267+
builder.add(item);
268+
}
269+
MultiGetResponse responses = builder.execute().actionGet();
270+
final LinkedList<T> result = new LinkedList<T>();
271+
for (MultiGetItemResponse response : responses.getResponses()) {
272+
if (!response.isFailed() && response.getResponse().isExists()) {
273+
result.add(resultsMapper.mapResult(response.getResponse(), clazz));
274+
}
275+
}
276+
return result;
277+
}
278+
279+
@Override
279280
public String index(IndexQuery query) {
280281
String documentId = prepareIndex(query).execute().actionGet().getId();
281282
// We should call this because we are not going through a mapper.

src/main/java/org/springframework/data/elasticsearch/core/query/AbstractQuery.java

100644100755
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.apache.commons.collections.CollectionUtils.*;
1919

2020
import java.util.ArrayList;
21+
import java.util.Collection;
2122
import java.util.List;
2223

2324
import org.springframework.data.domain.Pageable;
@@ -38,6 +39,8 @@ abstract class AbstractQuery implements Query {
3839
protected List<String> types = new ArrayList<String>();
3940
protected List<String> fields = new ArrayList<String>();
4041
protected float minScore;
42+
protected Collection<String> ids;
43+
protected String route;
4144

4245
@Override
4346
public Sort getSort() {
@@ -108,4 +111,20 @@ public float getMinScore() {
108111
public void setMinScore(float minScore) {
109112
this.minScore = minScore;
110113
}
114+
115+
public Collection<String> getIds() {
116+
return ids;
117+
}
118+
119+
public void setIds(Collection<String> ids) {
120+
this.ids = ids;
121+
}
122+
123+
public String getRoute() {
124+
return route;
125+
}
126+
127+
public void setRoute(String route) {
128+
this.route = route;
129+
}
111130
}

src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java

100644100755
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.elasticsearch.core.query;
1717

1818
import java.util.ArrayList;
19+
import java.util.Collection;
1920
import java.util.List;
2021

2122
import org.apache.commons.collections.CollectionUtils;
@@ -46,6 +47,8 @@ public class NativeSearchQueryBuilder {
4647
private String[] types;
4748
private String[] fields;
4849
private float minScore;
50+
private Collection<String> ids;
51+
private String route;
4952

5053
public NativeSearchQueryBuilder withQuery(QueryBuilder queryBuilder) {
5154
this.queryBuilder = queryBuilder;
@@ -97,27 +100,50 @@ public NativeSearchQueryBuilder withMinScore(float minScore) {
97100
return this;
98101
}
99102

103+
public NativeSearchQueryBuilder withIds(Collection<String> ids) {
104+
this.ids = ids;
105+
return this;
106+
}
107+
108+
public NativeSearchQueryBuilder withRoute(String route) {
109+
this.route = route;
110+
return this;
111+
}
112+
100113
public NativeSearchQuery build() {
101114
NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilders, highlightFields);
102115
if (pageable != null) {
103116
nativeSearchQuery.setPageable(pageable);
104117
}
118+
105119
if (indices != null) {
106120
nativeSearchQuery.addIndices(indices);
107121
}
122+
108123
if (types != null) {
109124
nativeSearchQuery.addTypes(types);
110125
}
126+
111127
if (fields != null) {
112128
nativeSearchQuery.addFields(fields);
113129
}
130+
114131
if (CollectionUtils.isNotEmpty(facetRequests)) {
115132
nativeSearchQuery.setFacets(facetRequests);
116133
}
117134

118135
if (minScore > 0) {
119136
nativeSearchQuery.setMinScore(minScore);
120137
}
138+
139+
if (ids != null) {
140+
nativeSearchQuery.setIds(ids);
141+
}
142+
143+
if (route != null) {
144+
nativeSearchQuery.setRoute(route);
145+
}
146+
121147
return nativeSearchQuery;
122148
}
123149
}

src/main/java/org/springframework/data/elasticsearch/core/query/Query.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.elasticsearch.core.query;
1717

18+
import java.util.Collection;
1819
import java.util.List;
1920

2021
import org.springframework.data.domain.PageRequest;
@@ -115,4 +116,18 @@ public interface Query {
115116
* @return
116117
*/
117118
float getMinScore();
119+
120+
/**
121+
* Get Ids
122+
*
123+
* @return
124+
*/
125+
Collection<String> getIds();
126+
127+
/**
128+
* Get route
129+
*
130+
* @return
131+
*/
132+
String getRoute();
118133
}

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

100644100755
Lines changed: 40 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -112,66 +112,46 @@ public void shouldReturnObjectForGivenId() {
112112
assertEquals(sampleEntity, sampleEntity1);
113113
}
114114

115-
@Test
116-
public void shouldReturnObjectForGivenIdUsingGet() {
117-
// given
118-
String documentId = randomNumeric(5);
119-
SampleEntity sampleEntity = new SampleEntity();
120-
sampleEntity.setId(documentId);
121-
sampleEntity.setMessage("some message");
122-
sampleEntity.setVersion(System.currentTimeMillis());
123-
124-
IndexQuery indexQuery = new IndexQuery();
125-
indexQuery.setId(documentId);
126-
indexQuery.setObject(sampleEntity);
127-
128-
elasticsearchTemplate.index(indexQuery);
129-
// when
130-
SampleEntity sampleEntity1 = elasticsearchTemplate.getObject(documentId, "", SampleEntity.class);
131-
// then
132-
assertNotNull("not null....", sampleEntity1);
133-
assertEquals(sampleEntity, sampleEntity1);
134-
}
135-
136-
@Test
137-
public void shouldReturnObjectsForGivenIdsUsingMultiGet() {
138-
// given
139-
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
140-
// first document
141-
String documentId = randomNumeric(5);
142-
SampleEntity sampleEntity1 = new SampleEntity();
143-
sampleEntity1.setId(documentId);
144-
sampleEntity1.setMessage("some message");
145-
sampleEntity1.setVersion(System.currentTimeMillis());
146-
147-
IndexQuery indexQuery1 = new IndexQuery();
148-
indexQuery1.setId(documentId);
149-
indexQuery1.setObject(sampleEntity1);
150-
indexQueries.add(indexQuery1);
151-
152-
// second document
153-
String documentId2 = randomNumeric(5);
154-
SampleEntity sampleEntity2 = new SampleEntity();
155-
sampleEntity2.setId(documentId2);
156-
sampleEntity2.setMessage("some message");
157-
sampleEntity2.setVersion(System.currentTimeMillis());
158-
159-
IndexQuery indexQuery2 = new IndexQuery();
160-
indexQuery2.setId(documentId2);
161-
indexQuery2.setObject(sampleEntity2);
162-
163-
indexQueries.add(indexQuery2);
164-
165-
elasticsearchTemplate.bulkIndex(indexQueries);
166-
elasticsearchTemplate.refresh(SampleEntity.class, true);
167-
168-
// when
169-
LinkedList<SampleEntity> sampleEntities = elasticsearchTemplate.getObjects(Arrays.asList(documentId, documentId2), "", SampleEntity.class);
170-
// then
171-
assertThat(sampleEntities.size(), is(equalTo(2)));
172-
assertEquals(sampleEntities.get(0), sampleEntity1);
173-
assertEquals(sampleEntities.get(1), sampleEntity2);
174-
}
115+
@Test
116+
public void shouldReturnObjectsForGivenIdsUsingMultiGet() {
117+
// given
118+
List<IndexQuery> indexQueries = new ArrayList<IndexQuery>();
119+
// first document
120+
String documentId = randomNumeric(5);
121+
SampleEntity sampleEntity1 = new SampleEntity();
122+
sampleEntity1.setId(documentId);
123+
sampleEntity1.setMessage("some message");
124+
sampleEntity1.setVersion(System.currentTimeMillis());
125+
126+
IndexQuery indexQuery1 = new IndexQuery();
127+
indexQuery1.setId(documentId);
128+
indexQuery1.setObject(sampleEntity1);
129+
indexQueries.add(indexQuery1);
130+
131+
// second document
132+
String documentId2 = randomNumeric(5);
133+
SampleEntity sampleEntity2 = new SampleEntity();
134+
sampleEntity2.setId(documentId2);
135+
sampleEntity2.setMessage("some message");
136+
sampleEntity2.setVersion(System.currentTimeMillis());
137+
138+
IndexQuery indexQuery2 = new IndexQuery();
139+
indexQuery2.setId(documentId2);
140+
indexQuery2.setObject(sampleEntity2);
141+
142+
indexQueries.add(indexQuery2);
143+
144+
elasticsearchTemplate.bulkIndex(indexQueries);
145+
elasticsearchTemplate.refresh(SampleEntity.class, true);
146+
147+
// when
148+
SearchQuery query = new NativeSearchQueryBuilder().withIds(Arrays.asList(documentId, documentId2)).build();
149+
LinkedList<SampleEntity> sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class);
150+
// then
151+
assertThat(sampleEntities.size(), is(equalTo(2)));
152+
assertEquals(sampleEntities.get(0), sampleEntity1);
153+
assertEquals(sampleEntities.get(1), sampleEntity2);
154+
}
175155

176156
@Test
177157
public void shouldReturnPageForGivenSearchQuery() {

0 commit comments

Comments
 (0)