Skip to content

Commit 9386129

Browse files
committed
DATAES-31 : Add the ability to index arbitrary JSON strings
1 parent a833c89 commit 9386129

File tree

3 files changed

+91
-2
lines changed

3 files changed

+91
-2
lines changed

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,9 +531,16 @@ private IndexRequestBuilder prepareIndex(IndexQuery query) {
531531
String type = isBlank(query.getType()) ? retrieveTypeFromPersistentEntity(query.getObject().getClass())[0]
532532
: query.getType();
533533

534-
IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(
535-
resultsMapper.getEntityMapper().mapToString(query.getObject()));
534+
IndexRequestBuilder indexRequestBuilder = null;
536535

536+
if(query.getObject() != null) {
537+
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(
538+
resultsMapper.getEntityMapper().mapToString(query.getObject()));
539+
} else if(query.getSource() != null) {
540+
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource());
541+
} else {
542+
throw new ElasticsearchException("object or source is null, failed to index the document [id: " + query.getId() + "]");
543+
}
537544
if (query.getVersion() != null) {
538545
indexRequestBuilder.setVersion(query.getVersion());
539546
indexRequestBuilder.setVersionType(EXTERNAL);
@@ -544,16 +551,19 @@ private IndexRequestBuilder prepareIndex(IndexQuery query) {
544551
}
545552
}
546553

554+
@Override
547555
public void refresh(String indexName, boolean waitForOperation) {
548556
client.admin().indices().refresh(refreshRequest(indexName).force(waitForOperation)).actionGet();
549557
}
550558

559+
@Override
551560
public <T> void refresh(Class<T> clazz, boolean waitForOperation) {
552561
ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz);
553562
client.admin().indices()
554563
.refresh(refreshRequest(persistentEntity.getIndexName()).force(waitForOperation)).actionGet();
555564
}
556565

566+
@Override
557567
public Boolean addAlias(AliasQuery query) {
558568
Assert.notNull(query.getIndexName(), "No index defined for Alias");
559569
Assert.notNull(query.getAliasName(), "No alias defined");
@@ -568,13 +578,15 @@ public Boolean addAlias(AliasQuery query) {
568578
return indicesAliasesRequestBuilder.execute().actionGet().isAcknowledged();
569579
}
570580

581+
@Override
571582
public Boolean removeAlias(AliasQuery query) {
572583
Assert.notNull(query.getIndexName(), "No index defined for Alias");
573584
Assert.notNull(query.getAliasName(), "No alias defined");
574585
return client.admin().indices().prepareAliases().removeAlias(query.getIndexName(), query.getAliasName())
575586
.execute().actionGet().isAcknowledged();
576587
}
577588

589+
@Override
578590
public Set<String> queryForAlias(String indexName) {
579591
ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest()
580592
.filterRoutingTable(true)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class IndexQuery {
2929
private Long version;
3030
private String indexName;
3131
private String type;
32+
private String source;
3233

3334
public String getId() {
3435
return id;
@@ -69,4 +70,12 @@ public String getType() {
6970
public void setType(String type) {
7071
this.type = type;
7172
}
73+
74+
public String getSource() {
75+
return source;
76+
}
77+
78+
public void setSource(String source) {
79+
this.source = source;
80+
}
7281
}

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.data.domain.PageRequest;
3232
import org.springframework.data.domain.Pageable;
3333
import org.springframework.data.domain.Sort;
34+
import org.springframework.data.elasticsearch.ElasticsearchException;
3435
import org.springframework.data.elasticsearch.SampleEntity;
3536
import org.springframework.data.elasticsearch.SampleMappingEntity;
3637
import org.springframework.data.elasticsearch.core.query.*;
@@ -939,4 +940,71 @@ public void shouldRemoveAlias(){
939940
assertThat(aliases.size(), is(0));
940941
}
941942

943+
944+
@Test
945+
public void shouldIndexDocumentForSpecifiedSource(){
946+
947+
// given
948+
String documentSource = "{\"id\":\"2333343434\",\"type\":null,\"message\":\"some message\",\"rate\":0,\"available\":false,\"highlightedMessage\":null,\"version\":1385208779482}";
949+
IndexQuery indexQuery = new IndexQuery();
950+
indexQuery.setId("2333343434");
951+
indexQuery.setSource(documentSource);
952+
indexQuery.setIndexName("test-index");
953+
indexQuery.setType("test-type");
954+
// when
955+
elasticsearchTemplate.index(indexQuery);
956+
elasticsearchTemplate.refresh(SampleEntity.class, true);
957+
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id",indexQuery.getId()))
958+
.withIndices("test-index")
959+
.withTypes("test-type")
960+
.build();
961+
// then
962+
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, new SearchResultMapper() {
963+
@Override
964+
public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
965+
List<SampleEntity> values = new ArrayList<SampleEntity>();
966+
for (SearchHit searchHit : response.getHits()) {
967+
SampleEntity sampleEntity = new SampleEntity();
968+
sampleEntity.setId(searchHit.getId());
969+
sampleEntity.setMessage((String) searchHit.getSource().get("message"));
970+
values.add(sampleEntity);
971+
}
972+
return new FacetedPageImpl<T>((List<T>) values);
973+
}
974+
});
975+
assertThat(page, is(notNullValue()));
976+
assertThat(page.getContent().size(), is(1));
977+
assertThat(page.getContent().get(0).getId(), is(indexQuery.getId()));
978+
}
979+
980+
@Test (expected = ElasticsearchException.class)
981+
public void shouldThrowElasticsearchExceptionWhenNoDocumentSpecified(){
982+
// given
983+
IndexQuery indexQuery = new IndexQuery();
984+
indexQuery.setId("2333343434");
985+
indexQuery.setIndexName("test-index");
986+
indexQuery.setType("test-type");
987+
988+
//when
989+
elasticsearchTemplate.index(indexQuery);
990+
}
991+
992+
@Test
993+
public void shouldReturnIds(){
994+
//given
995+
List<IndexQuery> entities = createSampleEntitiesWithMessage("Test message", 30);
996+
// when
997+
elasticsearchTemplate.bulkIndex(entities);
998+
elasticsearchTemplate.refresh(SampleEntity.class, true);
999+
SearchQuery searchQuery = new NativeSearchQueryBuilder()
1000+
.withQuery(termQuery("message", "message"))
1001+
.withIndices("test-index")
1002+
.withTypes("test-type")
1003+
.withPageable(new PageRequest(0,100))
1004+
.build();
1005+
// then
1006+
List<String> ids = elasticsearchTemplate.queryForIds(searchQuery);
1007+
assertThat(ids, is(notNullValue()));
1008+
assertThat(ids.size(), is(30));
1009+
}
9421010
}

0 commit comments

Comments
 (0)