Merge branch 'master' into geo_location

This commit is contained in:
Artur Konczak
2013-08-14 22:38:50 +01:00
parent 5a499315e8
commit 714bcf87fe
18 changed files with 462 additions and 81 deletions

View File

@@ -34,6 +34,7 @@ public class SampleEntity {
private String message;
private int rate;
private boolean available;
private String highlightedMessage;
@Version
private Long version;
@@ -77,6 +78,14 @@ public class SampleEntity {
this.available = available;
}
public String getHighlightedMessage() {
return highlightedMessage;
}
public void setHighlightedMessage(String highlightedMessage) {
this.highlightedMessage = highlightedMessage;
}
public Long getVersion() {
return version;
}

View File

@@ -15,8 +15,11 @@
*/
package org.springframework.data.elasticsearch.core;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.engine.DocumentMissingException;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Before;
@@ -39,12 +42,9 @@ import java.util.List;
import static org.apache.commons.lang.RandomStringUtils.randomNumeric;
import static org.elasticsearch.index.query.FilterBuilders.boolFilter;
import static org.elasticsearch.index.query.FilterBuilders.termFilter;
import static org.elasticsearch.index.query.QueryBuilders.fieldQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.*;
/**
* @author Rizwan Idrees
@@ -717,4 +717,164 @@ public class ElasticsearchTemplateTests {
// then
assertThat(elasticsearchTemplate.indexExists(clazz), is(false));
}
@Test
public void shouldDoPartialUpdateForExistingDocument() {
//given
String documentId = randomNumeric(5);
String messageBeforeUpdate = "some test message";
String messageAfterUpdate = "test message";
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage(messageBeforeUpdate);
sampleEntity.setVersion(System.currentTimeMillis());
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(documentId);
indexQuery.setObject(sampleEntity);
elasticsearchTemplate.index(indexQuery);
elasticsearchTemplate.refresh(SampleEntity.class, true);
IndexRequest indexRequest = new IndexRequest();
indexRequest.source("message", messageAfterUpdate);
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId)
.withClass(SampleEntity.class).withIndexRequest(indexRequest).build();
// when
elasticsearchTemplate.update(updateQuery);
//then
GetQuery getQuery = new GetQuery();
getQuery.setId(documentId);
SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class);
assertThat(indexedEntity.getMessage(), is(messageAfterUpdate));
}
@Test(expected = DocumentMissingException.class)
public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate(){
// when
IndexRequest indexRequest = new IndexRequest();
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5))
.withClass(SampleEntity.class).withIndexRequest(indexRequest).build();
elasticsearchTemplate.update(updateQuery);
}
@Test
public void shouldDoUpsertIfDocumentDoesNotExist(){
//given
String documentId = randomNumeric(5);
String message = "test message";
IndexRequest indexRequest = new IndexRequest();
indexRequest.source("message", message);
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId)
.withDoUpsert(true).withClass(SampleEntity.class)
.withIndexRequest(indexRequest).build();
//when
elasticsearchTemplate.update(updateQuery);
//then
GetQuery getQuery = new GetQuery();
getQuery.setId(documentId);
SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class);
assertThat(indexedEntity.getMessage(), is(message));
}
@Test
public void shouldReturnHighlightedFieldsForGivenQueryAndFields(){
//given
String documentId = randomNumeric(5);
String actualMessage = "some test message";
String highlightedMessage = "some <em>test</em> message";
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage(actualMessage);
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(termQuery("message", "test"))
.withHighlightFields(new HighlightBuilder.Field("message"))
.build();
Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, new ResultsMapper<SampleEntity>() {
@Override
public FacetedPage<SampleEntity> mapResults(SearchResponse response) {
List<SampleEntity> chunk = new ArrayList<SampleEntity>();
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"));
user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString());
chunk.add(user);
}
if(chunk.size() > 0){
return new FacetedPageImpl<SampleEntity>(chunk);
}
return null;
}
});
assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage));
}
@Test
public void shouldDeleteSpecifiedTypeFromAnIndex() {
// 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.deleteType("test-index","test-type");
//then
boolean typeExists = elasticsearchTemplate.typeExists("test-index", "test-type");
assertThat(typeExists, is(false));
}
@Test
public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery(){
// 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));
deleteQuery.setIndex("test-index");
deleteQuery.setType("test-type");
elasticsearchTemplate.delete(deleteQuery);
// then
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build();
Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class);
assertThat(sampleEntities.getTotalElements(), equalTo(0L));
}
}

View File

@@ -14,7 +14,7 @@ import static org.springframework.data.elasticsearch.annotations.FieldType.Strin
/**
* Simple type to test facets
*/
@Document(indexName = "articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
@Document(indexName = "articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1", indexStoreType = "memory")
public class ArticleEntity {
@Id

View File

@@ -77,7 +77,7 @@ public class ElasticsearchTemplateGeoTests {
double[] latLonArray = {0.100000, 51.000000};
String lonLatString = "51.000000, 0.100000";
String geohash = "u1044k2bd6u";
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("2").name("Mohsin Husen").location(geohash.substring(3)).additionalLocation(latLonArray).buildIndex());
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("2").name("Mohsin Husen").location(geohash.substring(0,5)).additionalLocation(latLonArray).buildIndex());
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("1").name("Artur Konczak").location(lonLatString).additionalLocation(latLonArray).buildIndex());
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("3").name("Rizwan Idrees").location(geohash).additionalLocation(latLonArray).buildIndex());
@@ -132,9 +132,7 @@ public class ElasticsearchTemplateGeoTests {
List<AuthorMarkerAnnotatedEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, AuthorMarkerAnnotatedEntity.class);
//then
assertThat(geoAuthorsForGeoCriteria.size(), is(1));
//TODO: result should be 3 not 1 - geohash points don't work
assertEquals("Artur Konczak", geoAuthorsForGeoCriteria.get(0).getName());
assertThat(geoAuthorsForGeoCriteria.size(), is(3));
}
@Test