diff --git a/pom.xml b/pom.xml index 51d100828..b74901c26 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 3.2.1 2.6 - 0.90.0 + 0.90.2 1.9.2 1.6.0.BUILD-SNAPSHOT diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java b/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java index 4073d78bb..ef982b601 100644 --- a/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java +++ b/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java @@ -3,5 +3,5 @@ package org.springframework.data.elasticsearch.annotations; /** */ public enum FieldType { - String, Integer, Long, Date, Object, Auto + String, Integer, Long, Date, Float, Double, Boolean, Object, Auto } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java index f2868d234..f7a175409 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java @@ -42,7 +42,6 @@ public class TransportClientFactoryBean implements FactoryBean, private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class); private String clusterNodes; private String clusterName; - private Boolean enableHttp; private Boolean clientTransportSniff; private TransportClient client; private Properties properties; @@ -102,7 +101,6 @@ public class TransportClientFactoryBean implements FactoryBean, return settingsBuilder() .put("cluster.name", clusterName) .put("client.transport.sniff", clientTransportSniff) - .put("http.enabled", enableHttp) .build(); } @@ -114,10 +112,6 @@ public class TransportClientFactoryBean implements FactoryBean, this.clusterName = clusterName; } - public void setEnableHttp(Boolean enableHttp) { - this.enableHttp = enableHttp; - } - public void setClientTransportSniff(Boolean clientTransportSniff) { this.clientTransportSniff = clientTransportSniff; } diff --git a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java index b51b26040..5b0475c40 100644 --- a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java @@ -43,7 +43,6 @@ public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionP private void setClusterNodes(Element element, BeanDefinitionBuilder builder) { builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes")); builder.addPropertyValue("clusterName", element.getAttribute("cluster-name")); - builder.addPropertyValue("enableHttp", Boolean.valueOf(element.getAttribute("http-enabled"))); builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff"))); } 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 4db37b176..bae6e6848 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,7 @@ */ package org.springframework.data.elasticsearch.core; +import org.elasticsearch.action.update.UpdateResponse; import org.springframework.data.domain.Page; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.query.*; @@ -168,6 +169,14 @@ public interface ElasticsearchOperations { */ String index(IndexQuery query); + /** + * Partial update of the document + * + * @param updateQuery + * @return + */ + UpdateResponse update(UpdateQuery updateQuery); + /** * Bulk index all objects. Will do save or update * @@ -202,15 +211,30 @@ public interface ElasticsearchOperations { */ void delete(DeleteQuery query, Class clazz); + /** + * Delete all records matching the query + * + * @param query + */ + void delete(DeleteQuery query); + /** * Deletes an index for given entity - * + * * @param clazz * @param * @return */ boolean deleteIndex(Class clazz); + /** + * Deletes a type in an index + * + * @param index + * @param type + */ + void deleteType(String index, String type); + /** * check if index is exists * @@ -220,6 +244,15 @@ public interface ElasticsearchOperations { */ boolean indexExists(Class clazz); + /** + * check if type is exists in an index + * + * @param index + * @param type + * @return + */ + boolean typeExists(String index, String type); + /** * refresh the index * 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 4d6bb04eb..87976af0b 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -19,6 +19,7 @@ import org.apache.commons.collections.CollectionUtils; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; @@ -29,6 +30,8 @@ import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.mlt.MoreLikeThisRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.update.UpdateRequestBuilder; +import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.common.collect.MapBuilder; @@ -40,6 +43,7 @@ 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; @@ -101,7 +105,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public boolean createIndex(Class clazz) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); return createIndexIfNotCreated(clazz); } @@ -227,6 +230,25 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return prepareIndex(query).execute().actionGet().getId(); } + @Override + public UpdateResponse update(UpdateQuery query) { + String indexName = isNotBlank(query.getIndexName()) ? query.getIndexName() : getPersistentEntityFor(query.getClazz()).getIndexName(); + String type = isNotBlank(query.getType()) ? query.getType() : getPersistentEntityFor(query.getClazz()).getIndexType(); + Assert.notNull(indexName, "No index defined for Query"); + Assert.notNull(type, "No type define for Query"); + Assert.notNull(query.getId(), "No Id define for Query"); + Assert.notNull(query.getIndexRequest(), "No IndexRequest define for Query"); + UpdateRequestBuilder updateRequestBuilder = client.prepareUpdate(indexName, type, query.getId()); + if(query.DoUpsert()){ + updateRequestBuilder.setDocAsUpsert(true) + .setUpsertRequest(query.getIndexRequest()).setDoc(query.getIndexRequest()); + } else { + updateRequestBuilder.setDoc(query.getIndexRequest()); + } + return updateRequestBuilder.execute().actionGet(); + } + + @Override public void bulkIndex(List queries) { BulkRequestBuilder bulkRequest = client.prepareBulk(); @@ -251,6 +273,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return indexExists(getPersistentEntityFor(clazz).getIndexName()); } + @Override + public boolean typeExists(String index, String type) { + return client.admin().cluster().prepareState().execute().actionGet() + .getState().metaData().index(index).mappings().containsKey(type); + } + @Override public boolean deleteIndex(Class clazz) { String indexName = getPersistentEntityFor(clazz).getIndexName(); @@ -260,6 +288,15 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { return false; } + @Override + public void deleteType(String index, String type){ + Map mappings = client.admin().cluster().prepareState().execute().actionGet() + .getState().metaData().index(index).mappings(); + if (mappings.containsKey(type)) { + client.admin().indices().deleteMapping(new DeleteMappingRequest(index).type(type)).actionGet(); + } + } + @Override public String delete(String indexName, String type, String id) { return client.prepareDelete(indexName, type, id).execute().actionGet().getId(); @@ -278,6 +315,14 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { .setQuery(deleteQuery.getQuery()).execute().actionGet(); } + @Override + public void delete(DeleteQuery deleteQuery) { + Assert.notNull(deleteQuery.getIndex(), "No index defined for Query"); + Assert.notNull(deleteQuery.getType(), "No type define for Query"); + client.prepareDeleteByQuery(deleteQuery.getIndex()).setTypes(deleteQuery.getType()) + .setQuery(deleteQuery.getQuery()).execute().actionGet(); + } + @Override public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noFields) { Assert.notNull(searchQuery.getIndices(), "No index defined for Query"); @@ -388,6 +433,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } } + if(searchQuery.getHighlightFields() != null) { + for(HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()){ + searchRequest.addHighlightedField(highlightField); + } + } + return searchRequest.setQuery(searchQuery.getQuery()).execute().actionGet(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java deleted file mode 100644 index cc59ded31..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.springframework.data.elasticsearch.core; - -import org.apache.commons.collections.CollectionUtils; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.facet.FacetResult; - -import java.util.List; -import java.util.Map; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -public class FactedPageImpl extends PageImpl implements FacetedPage { - - private List facets; - private Map mapOfFacets; - - public FactedPageImpl(List content) { - super(content); - } - - public FactedPageImpl(List content, Pageable pageable, long total) { - super(content, pageable, total); - } - - public FactedPageImpl(List content, Pageable pageable, long total, List facets) { - super(content, pageable, total); - this.facets = facets; - for (FacetResult facet : facets) { - mapOfFacets.put(facet.getName(), facet); - } - } - - @Override - public boolean hasFacets() { - return CollectionUtils.isNotEmpty(facets); - } - - @Override - public List getFacets() { - return facets; - } - - @Override - public FacetResult getFacet(String name) { - return mapOfFacets.get(name); - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java index 4578c834c..b02c773fc 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java @@ -19,13 +19,15 @@ import org.elasticsearch.index.query.QueryBuilder; /** * DeleteQuery - * + * * @author Rizwan Idrees * @author Mohsin Husen */ public class DeleteQuery { private QueryBuilder query; + private String index; + private String type; public QueryBuilder getQuery() { return query; @@ -33,5 +35,21 @@ public class DeleteQuery { public void setQuery(QueryBuilder query) { this.query = query; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java index 46f80e264..0b4ca5121 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java @@ -17,7 +17,7 @@ package org.springframework.data.elasticsearch.core.query; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.facet.FacetBuilder; +import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.springframework.data.elasticsearch.core.facet.FacetRequest; @@ -37,6 +37,7 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery { private FilterBuilder filter; private SortBuilder sort; private List facets; + private HighlightBuilder.Field[] highlightFields; public NativeSearchQuery(QueryBuilder query) { @@ -54,6 +55,13 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery { this.sort = sort; } + public NativeSearchQuery(QueryBuilder query, FilterBuilder filter, SortBuilder sort, HighlightBuilder.Field[] highlightFields) { + this.query = query; + this.filter = filter; + this.sort = sort; + this.highlightFields = highlightFields; + } + public QueryBuilder getQuery() { return query; } @@ -64,6 +72,11 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery { public SortBuilder getElasticsearchSort() { return sort; + } + + @Override + public HighlightBuilder.Field[] getHighlightFields() { + return highlightFields; } public void addFacet(FacetRequest facetRequest){ diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java index 6d8e354c4..db667a245 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java @@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.core.query; import org.apache.commons.collections.CollectionUtils; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.facet.FacetRequest; @@ -39,6 +40,7 @@ public class NativeSearchQueryBuilder { private FilterBuilder filterBuilder; private SortBuilder sortBuilder; private List facetRequests = new ArrayList(); + private HighlightBuilder.Field[] highlightFields; private Pageable pageable; private String[] indices; private String[] types; @@ -64,6 +66,11 @@ public class NativeSearchQueryBuilder { return this; } + public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields){ + this.highlightFields = highlightFields; + return this; + } + public NativeSearchQueryBuilder withPageable(Pageable pageable) { this.pageable = pageable; return this; @@ -85,7 +92,7 @@ public class NativeSearchQueryBuilder { } public NativeSearchQuery build() { - NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilder); + NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilder, highlightFields); if (pageable != null) { nativeSearchQuery.setPageable(pageable); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java index e625c968a..2d823d720 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java @@ -17,6 +17,7 @@ package org.springframework.data.elasticsearch.core.query; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.springframework.data.elasticsearch.core.facet.FacetRequest; @@ -37,4 +38,6 @@ public interface SearchQuery extends Query { SortBuilder getElasticsearchSort(); List getFacets(); + + HighlightBuilder.Field[] getHighlightFields(); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java new file mode 100644 index 000000000..2eca04462 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java @@ -0,0 +1,80 @@ +/* + * 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.core.query; + +import org.elasticsearch.action.index.IndexRequest; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class UpdateQuery { + + private String id; + private IndexRequest indexRequest; + private String indexName; + private String type; + private Class clazz; + private boolean doUpsert; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public IndexRequest getIndexRequest() { + return indexRequest; + } + + public void setIndexRequest(IndexRequest indexRequest) { + this.indexRequest = indexRequest; + } + + public String getIndexName() { + return indexName; + } + + public void setIndexName(String indexName) { + this.indexName = indexName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } + + public boolean DoUpsert() { + return doUpsert; + } + + public void setDoUpsert(boolean doUpsert) { + this.doUpsert = doUpsert; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java new file mode 100644 index 000000000..773a645cf --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java @@ -0,0 +1,73 @@ +/* + * 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.core.query; + +import org.elasticsearch.action.index.IndexRequest; + +/** + * @author Rizwan Idrees + * @author Mohsin Husen + */ +public class UpdateQueryBuilder { + + private String id; + private IndexRequest indexRequest; + private String indexName; + private String type; + private Class clazz; + private boolean doUpsert; + + public UpdateQueryBuilder withId(String id){ + this.id = id; + return this; + } + + public UpdateQueryBuilder withIndexRequest(IndexRequest indexRequest){ + this.indexRequest = indexRequest; + return this; + } + + public UpdateQueryBuilder withIndexName(String indexName){ + this.indexName = indexName; + return this; + } + + public UpdateQueryBuilder withType(String type){ + this.type = type; + return this; + } + + public UpdateQueryBuilder withClass(Class clazz){ + this.clazz = clazz; + return this; + } + + public UpdateQueryBuilder withDoUpsert(boolean doUpsert){ + this.doUpsert = doUpsert; + return this; + } + + public UpdateQuery build(){ + UpdateQuery updateQuery = new UpdateQuery(); + updateQuery.setId(id); + updateQuery.setIndexName(indexName); + updateQuery.setType(type); + updateQuery.setClazz(clazz); + updateQuery.setIndexRequest(indexRequest); + updateQuery.setDoUpsert(doUpsert); + return updateQuery; + } +} diff --git a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd index 668aa618a..22b9d2f0f 100644 --- a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd +++ b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd @@ -84,11 +84,6 @@ - - - - - diff --git a/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java b/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java index dc890d840..aceb9588a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java @@ -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; } 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 06bc93ad1..6cdc46204 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -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 test 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 sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, 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")); + user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString()); + chunk.add(user); + } + if(chunk.size() > 0){ + return new FacetedPageImpl(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 sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + assertThat(sampleEntities.getTotalElements(), equalTo(0L)); + } + } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java index 77847b317..6d6c1df1d 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java @@ -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 diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java index d2222b158..1d22b4bfc 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java @@ -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 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