diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java index d11a3e02c..83ee37678 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java @@ -1,13 +1,43 @@ package org.springframework.data.elasticsearch.core; +import static org.springframework.util.StringUtils.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.elasticsearch.action.bulk.BulkItemResponse; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.search.MultiSearchRequest; +import org.elasticsearch.action.search.MultiSearchResponse; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.common.collect.MapBuilder; +import org.elasticsearch.index.query.MoreLikeThisQueryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.data.domain.Page; import org.springframework.data.elasticsearch.ElasticsearchException; +import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Mapping; +import org.springframework.data.elasticsearch.annotations.Setting; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; +import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse; import org.springframework.data.elasticsearch.core.index.MappingBuilder; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; +import org.springframework.data.elasticsearch.core.query.DeleteQuery; +import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** @@ -16,11 +46,22 @@ * @author Sascha Woo * @author Peter-Josef Meisch */ -public abstract class AbstractElasticsearchTemplate implements ElasticsearchOperations { +public abstract class AbstractElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractElasticsearchTemplate.class); protected ElasticsearchConverter elasticsearchConverter; + protected RequestFactory requestFactory; + + public RequestFactory getRequestFactory() { + return requestFactory; + } + + protected void initialize(ElasticsearchConverter elasticsearchConverter) { + Assert.notNull(elasticsearchConverter, "elasticsearchConverter must not be null."); + this.elasticsearchConverter = elasticsearchConverter; + this.requestFactory = new RequestFactory(elasticsearchConverter); + } protected ElasticsearchConverter createElasticsearchConverter() { MappingElasticsearchConverter mappingElasticsearchConverter = new MappingElasticsearchConverter( @@ -29,6 +70,13 @@ protected ElasticsearchConverter createElasticsearchConverter() { return mappingElasticsearchConverter; } + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException { + if (elasticsearchConverter instanceof ApplicationContextAware) { + ((ApplicationContextAware) elasticsearchConverter).setApplicationContext(context); + } + } + protected String buildMapping(Class clazz) { // load mapping specified in Mapping annotation if present @@ -53,8 +101,208 @@ protected String buildMapping(Class clazz) { } } + @Override + public boolean createIndex(String indexName) { + return createIndexIfNotCreated(indexName); + } + + private boolean createIndexIfNotCreated(String indexName) { + return indexExists(indexName) || createIndex(indexName, null); + } + + @Override + public boolean createIndex(Class clazz) { + return createIndexIfNotCreated(clazz); + } + + private boolean createIndexIfNotCreated(Class clazz) { + return indexExists(getPersistentEntityFor(clazz).getIndexName()) || createIndexWithSettings(clazz); + } + + private boolean createIndexWithSettings(Class clazz) { + if (clazz.isAnnotationPresent(Setting.class)) { + String settingPath = clazz.getAnnotation(Setting.class).settingPath(); + if (hasText(settingPath)) { + String settings = ResourceUtil.readFileFromClasspath(settingPath); + if (hasText(settings)) { + return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); + } + } else { + LOGGER.info("settingPath in @Setting has to be defined. Using default instead."); + } + } + return createIndex(getPersistentEntityFor(clazz).getIndexName(), getDefaultSettings(getPersistentEntityFor(clazz))); + } + + @Override + public boolean createIndex(Class clazz, Object settings) { + return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); + } + + @Override + public void delete(Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(query, "Query must not be null."); + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); + DeleteQuery deleteQuery = new DeleteQuery(); + deleteQuery.setQuery(searchRequest.source().query()); + delete(deleteQuery, index); + } + + @Override + public Page moreLikeThis(MoreLikeThisQuery query, Class clazz, IndexCoordinates index) { + Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery"); + MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = requestFactory.moreLikeThisQueryBuilder(query, index); + return queryForPage(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index); + } + + protected static String[] toArray(List values) { + String[] valuesAsArray = new String[values.size()]; + return values.toArray(valuesAsArray); + } + @Override public ElasticsearchConverter getElasticsearchConverter() { return elasticsearchConverter; } + + @Override + public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) { + Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName() + + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); + return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz); + } + + private Map getDefaultSettings(ElasticsearchPersistentEntity persistentEntity) { + + if (persistentEntity.isUseServerConfiguration()) + return new HashMap(); + + return new MapBuilder().put("index.number_of_shards", String.valueOf(persistentEntity.getShards())) + .put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas())) + .put("index.refresh_interval", persistentEntity.getRefreshInterval()) + .put("index.store.type", persistentEntity.getIndexStoreType()).map(); + } + + protected void checkForBulkOperationFailure(BulkResponse bulkResponse) { + if (bulkResponse.hasFailures()) { + Map failedDocuments = new HashMap<>(); + for (BulkItemResponse item : bulkResponse.getItems()) { + if (item.isFailed()) + failedDocuments.put(item.getId(), item.getFailureMessage()); + } + throw new ElasticsearchException( + "Bulk operation has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [" + + failedDocuments + "]", + failedDocuments); + } + } + + /** + * @param query + * @param clazz + * @deprecated index names and types should not be set in query + */ + @Deprecated + protected void setPersistentEntityIndexAndType(Query query, Class clazz) { + if (query.getIndices().isEmpty()) { + String[] indices = retrieveIndexNameFromPersistentEntity(clazz); + + if (indices != null) { + query.addIndices(indices); + } + } + if (query.getTypes().isEmpty()) { + String[] types = retrieveTypeFromPersistentEntity(clazz); + + if (types != null) { + query.addTypes(types); + } + } + } + + private String[] retrieveIndexNameFromPersistentEntity(Class clazz) { + if (clazz != null) { + return new String[] { getPersistentEntityFor(clazz).getIndexName() }; + } + return null; + } + + private String[] retrieveTypeFromPersistentEntity(Class clazz) { + if (clazz != null) { + return new String[] { getPersistentEntityFor(clazz).getIndexType() }; + } + return null; + } + + @Override + public List> queryForPage(List queries, Class clazz, IndexCoordinates index) { + MultiSearchRequest request = new MultiSearchRequest(); + for (Query query : queries) { + request.add(requestFactory.searchRequest(query, clazz, index)); + } + return doMultiSearch(queries, clazz, request); + } + + @Override + public List> queryForPage(List queries, List> classes, IndexCoordinates index) { + MultiSearchRequest request = new MultiSearchRequest(); + Iterator> it = classes.iterator(); + for (Query query : queries) { + request.add(requestFactory.searchRequest(query, it.next(), index)); + } + return doMultiSearch(queries, classes, request); + } + + private List> doMultiSearch(List queries, Class clazz, MultiSearchRequest request) { + MultiSearchResponse.Item[] items = getMultiSearchResult(request); + List> res = new ArrayList<>(queries.size()); + int c = 0; + for (Query query : queries) { + res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), clazz, + query.getPageable())); + } + return res; + } + + private List> doMultiSearch(List queries, List> classes, + MultiSearchRequest request) { + MultiSearchResponse.Item[] items = getMultiSearchResult(request); + List> res = new ArrayList<>(queries.size()); + int c = 0; + Iterator> it = classes.iterator(); + for (Query query : queries) { + res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), it.next(), + query.getPageable())); + } + return res; + } + + @Override + public boolean putMapping(Class clazz) { + return putMapping(clazz, buildMapping(clazz)); + } + + @Override + public boolean putMapping(Class clazz, Object mapping) { + return putMapping(getIndexCoordinatesFor(clazz), mapping); + } + + @Override + public boolean putMapping(IndexCoordinates index, Class clazz) { + return putMapping(index, buildMapping(clazz)); + } + + abstract protected MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request); + + protected void setPersistentEntityId(Object entity, String id) { + + ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(entity.getClass()); + ElasticsearchPersistentProperty idProperty = persistentEntity.getIdProperty(); + + // Only deal with text because ES generated Ids are strings ! + + if (idProperty != null && idProperty.getType().isAssignableFrom(String.class)) { + persistentEntity.getPropertyAccessor(entity).setProperty(idProperty, id); + } + } } 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 cff479445..88625292a 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java @@ -22,9 +22,17 @@ import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.cluster.metadata.AliasMetaData; import org.springframework.data.domain.Page; +import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.query.*; +import org.springframework.data.elasticsearch.core.query.AliasQuery; +import org.springframework.data.elasticsearch.core.query.BulkOptions; +import org.springframework.data.elasticsearch.core.query.DeleteQuery; +import org.springframework.data.elasticsearch.core.query.GetQuery; +import org.springframework.data.elasticsearch.core.query.IndexQuery; +import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery; +import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.util.CloseableIterator; import org.springframework.lang.Nullable; @@ -44,28 +52,22 @@ public interface ElasticsearchOperations { * adding new alias * * @param query + * @param index * @return */ - boolean addAlias(AliasQuery query); + boolean addAlias(AliasQuery query, IndexCoordinates index); /** * removing previously created alias * * @param query + * @param index * @return */ - boolean removeAlias(AliasQuery query); + boolean removeAlias(AliasQuery query, IndexCoordinates index); /** - * Create an index for a class - * - * @param clazz - * @param - */ - boolean createIndex(Class clazz); - - /** - * Create an index for given indexName + * Create an index for given indexName if it does not already exist * * @param indexName */ @@ -79,6 +81,14 @@ public interface ElasticsearchOperations { */ boolean createIndex(String indexName, Object settings); + /** + * Create an index for a class if it does not already exist + * + * @param clazz + * @param + */ + boolean createIndex(Class clazz); + /** * Create an index for given class and Settings * @@ -96,23 +106,21 @@ public interface ElasticsearchOperations { boolean putMapping(Class clazz); /** - * Create mapping for the given class and put the mapping to the given indexName and type. + * Create mapping for the given class and put the mapping to the given index * - * @param indexName - * @param type + * @param index * @param clazz * @since 3.2 */ - boolean putMapping(String indexName, String type, Class clazz); + boolean putMapping(IndexCoordinates index, Class clazz); /** - * Create mapping for a given indexName and type - * - * @param indexName - * @param type + * Create mapping for a given index + * @param index * @param mappings + * @param index */ - boolean putMapping(String indexName, String type, Object mappings); + boolean putMapping(IndexCoordinates index, Object mappings); /** * Create mapping for a class @@ -126,17 +134,17 @@ public interface ElasticsearchOperations { * Get mapping for a class * * @param clazz - * @param */ - Map getMapping(Class clazz); + default Map getMapping(Class clazz) { + return getMapping(getIndexCoordinatesFor(clazz)); + } /** - * Get mapping for a given indexName and type + * Get mapping for a given index coordinates * - * @param indexName - * @param type + * @param index */ - Map getMapping(String indexName, String type); + Map getMapping(IndexCoordinates index); /** * Get settings for a given indexName @@ -160,34 +168,30 @@ public interface ElasticsearchOperations { */ List queryForAlias(String indexName); - T query(NativeSearchQuery query, ResultsExtractor resultsExtractor); + T query(Query query, ResultsExtractor resultsExtractor, Class clazz, IndexCoordinates index); /** - * Execute the query against elasticsearch and return the first returned object + * Retrieves an object from an index * - * @param query - * @param clazz - * @return the first matching object + * @param query the query defining the id of the object to get + * @param clazz the type of the object to be returned + * @param index the index from which the object is read. + * @return the found object */ - T queryForObject(GetQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return the first returned object - * - * @param query - * @param clazz - * @return the first matching object - */ - T queryForObject(CriteriaQuery query, Class clazz); + T get(GetQuery query, Class clazz, IndexCoordinates index); /** * Execute the query against elasticsearch and return the first returned object * * @param query * @param clazz + * @param index * @return the first matching object */ - T queryForObject(StringQuery query, Class clazz); + default T queryForObject(Query query, Class clazz, IndexCoordinates index) { + List content = queryForPage(query, clazz, index).getContent(); + return content.isEmpty() ? null : content.get(0); + } /** * Execute the query against elasticsearch and return result as {@link Page} @@ -196,60 +200,30 @@ public interface ElasticsearchOperations { * @param clazz * @return */ - Page queryForPage(NativeSearchQuery query, Class clazz); + AggregatedPage queryForPage(Query query, Class clazz, IndexCoordinates index); /** * Execute the multi-search against elasticsearch and return result as {@link List} of {@link Page} * * @param queries * @param clazz + * @param index * @return */ - List> queryForPage(List queries, Class clazz); + List> queryForPage(List queries, Class clazz, IndexCoordinates index); /** * Execute the multi-search against elasticsearch and return result as {@link List} of {@link Page} * * @param queries * @param classes + * @param index * @return */ - List> queryForPage(List queries, List> classes); - - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(CriteriaQuery query, Class clazz); - - /** - * Execute the query against elasticsearch and return result as {@link Page} - * - * @param query - * @param clazz - * @return - */ - Page queryForPage(StringQuery query, Class clazz); - - /** - * Executes the given {@link CriteriaQuery} against elasticsearch and return result as {@link CloseableIterator}. - *

- * Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of - * error. - * - * @param element return type - * @param query - * @param clazz - * @return - * @since 1.3 - */ - CloseableIterator stream(CriteriaQuery query, Class clazz); + List> queryForPage(List queries, List> classes, IndexCoordinates index); /** - * Executes the given {@link NativeSearchQuery} against elasticsearch and return result as {@link CloseableIterator}. + * Executes the given {@link Query} against elasticsearch and return result as {@link CloseableIterator}. *

* Returns a {@link CloseableIterator} that wraps an Elasticsearch scroll context that needs to be closed in case of * error. @@ -257,51 +231,34 @@ public interface ElasticsearchOperations { * @param element return type * @param query * @param clazz + * @param index * @return * @since 1.3 */ - CloseableIterator stream(NativeSearchQuery query, Class clazz); + CloseableIterator stream(Query query, Class clazz, IndexCoordinates index); /** * Execute the criteria query against elasticsearch and return result as {@link List} * * @param query * @param clazz + * @param index * @param * @return */ - List queryForList(CriteriaQuery query, Class clazz); - - /** - * Execute the string query against elasticsearch and return result as {@link List} - * - * @param query - * @param clazz - * @param - * @return - */ - List queryForList(StringQuery query, Class clazz); - - /** - * Execute the search query against elasticsearch and return result as {@link List} - * - * @param query - * @param clazz - * @param - * @return - */ - List queryForList(NativeSearchQuery query, Class clazz); + List queryForList(Query query, Class clazz, IndexCoordinates index); /** * Execute the multi search query against elasticsearch and return result as {@link List} * + * @param * @param queries * @param clazz - * @param + * @param index * @return */ - default List> queryForList(List queries, Class clazz) { - return queryForPage(queries, clazz).stream().map(Page::getContent).collect(Collectors.toList()); + default List> queryForList(List queries, Class clazz, IndexCoordinates index) { + return queryForPage(queries, clazz, index).stream().map(Page::getContent).collect(Collectors.toList()); } /** @@ -309,62 +266,53 @@ default List> queryForList(List queries, Class * * @param queries * @param classes + * @param index * @return */ - default List> queryForList(List queries, List> classes) { - return queryForPage(queries, classes).stream().map(Page::getContent).collect(Collectors.toList()); + default List> queryForList(List queries, List> classes, IndexCoordinates index) { + return queryForPage(queries, classes, index).stream().map(Page::getContent).collect(Collectors.toList()); } /** * Execute the query against elasticsearch and return ids * * @param query - * @return - */ - List queryForIds(NativeSearchQuery query); - - /** - * return number of elements found by given query - * - * @param query * @param clazz + * @param index * @return */ - long count(CriteriaQuery query, Class clazz); - - /** - * return number of elements found by given query - * - * @param query - * @return - */ - long count(CriteriaQuery query); + List queryForIds(Query query, Class clazz, IndexCoordinates index); /** * return number of elements found by given query * - * @param query - * @param clazz - * @return + * @param query the query to execute + * @param index the index to run the query against + * @return count */ - long count(NativeSearchQuery query, Class clazz); + default long count(Query query, IndexCoordinates index) { + return count(query, null, index); + } /** * return number of elements found by given query * - * @param query - * @return + * @param query the query to execute + * @param clazz the entity clazz used for property mapping + * @param index the index to run the query against + * @return count */ - long count(NativeSearchQuery query); + long count(Query query, @Nullable Class clazz, IndexCoordinates index); /** * Execute a multiGet against elasticsearch for the given ids * - * @param searchQuery + * @param query * @param clazz + * @param index * @return */ - List multiGet(NativeSearchQuery searchQuery, Class clazz); + List multiGet(Query query, Class clazz, IndexCoordinates index); /** * Index an object. Will do save or update @@ -372,7 +320,7 @@ default List> queryForList(List queries, List> queryForList(List queries, List queries) { - bulkIndex(queries, BulkOptions.defaultOptions()); + default void bulkIndex(List queries, IndexCoordinates index) { + bulkIndex(queries, BulkOptions.defaultOptions(), index); } /** @@ -398,15 +346,15 @@ default void bulkIndex(List queries) { * @param bulkOptions options to be added to the bulk request * @since 3.2 */ - void bulkIndex(List queries, BulkOptions bulkOptions); + void bulkIndex(List queries, BulkOptions bulkOptions, IndexCoordinates index); /** * Bulk update all objects. Will do update * * @param queries the queries to execute in bulk */ - default void bulkUpdate(List queries) { - bulkUpdate(queries, BulkOptions.defaultOptions()); + default void bulkUpdate(List queries, IndexCoordinates index) { + bulkUpdate(queries, BulkOptions.defaultOptions(), index); } /** @@ -416,58 +364,43 @@ default void bulkUpdate(List queries) { * @param bulkOptions options to be added to the bulk request * @since 3.2 */ - void bulkUpdate(List queries, BulkOptions bulkOptions); + void bulkUpdate(List queries, BulkOptions bulkOptions, IndexCoordinates index); /** - * Delete the one object with provided id + * Delete the one object with provided id. * - * @param indexName - * @param type - * @param id + * @param id the document ot delete + * @param index the index from which to delete * @return documentId of the document deleted */ - String delete(String indexName, String type, String id); + String delete(String id, IndexCoordinates index); /** * Delete all records matching the criteria - * - * @param clazz - * @param criteriaQuery - */ - void delete(CriteriaQuery criteriaQuery, Class clazz); - - /** - * Delete the one object with provided id - * - * @param clazz - * @param id - * @return documentId of the document deleted - */ - String delete(Class clazz, String id); - - /** - * Delete all records matching the query - * - * @param clazz + * * @param query + * @param clazz + * @param index */ - void delete(DeleteQuery query, Class clazz); + void delete(Query query, Class clazz, IndexCoordinates index); /** * Delete all records matching the query * * @param query + * @param index the index where to delete the records */ - void delete(DeleteQuery query); + void delete(DeleteQuery query, IndexCoordinates index); /** * Deletes an index for given entity * * @param clazz - * @param * @return */ - boolean deleteIndex(Class clazz); + default boolean deleteIndex(Class clazz) { + return deleteIndex(getPersistentEntityFor(clazz).getIndexName()); + } /** * Deletes an index for given indexName @@ -481,10 +414,11 @@ default void bulkUpdate(List queries) { * check if index is exists * * @param clazz - * @param * @return */ - boolean indexExists(Class clazz); + default boolean indexExists(Class clazz) { + return indexExists(getIndexCoordinatesFor(clazz).getIndexName()); + } /** * check if index is exists for given IndexName @@ -495,49 +429,32 @@ default void bulkUpdate(List queries) { boolean indexExists(String indexName); /** - * check if type is exists in an index + * refresh the index(es) * * @param index - * @param type - * @return - */ - boolean typeExists(String index, String type); - - /** - * refresh the index - * - * @param indexName */ - void refresh(String indexName); + void refresh(IndexCoordinates index); /** * refresh the index * * @param clazz */ - void refresh(Class clazz); - - /** - * Returns scrolled page for given query - * - * @param query The search query. - * @param scrollTimeInMillis The time in millisecond for scroll feature - * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. - * @param clazz The class of entity to retrieve. - * @return The scan id for input query. - */ - ScrolledPage startScroll(long scrollTimeInMillis, NativeSearchQuery query, Class clazz); + default void refresh(Class clazz) { + refresh(getIndexCoordinatesFor(clazz)); + } /** * Returns scrolled page for given query * - * @param criteriaQuery The search query. * @param scrollTimeInMillis The time in millisecond for scroll feature * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}. + * @param query The search query. * @param clazz The class of entity to retrieve. + * @param index * @return The scan id for input query. */ - ScrolledPage startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz); + ScrolledPage startScroll(long scrollTimeInMillis, Query query, Class clazz, IndexCoordinates index); ScrolledPage continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz); @@ -546,17 +463,18 @@ default void bulkUpdate(List queries) { * * @param scrollId */ - void clearScroll(String scrollId); + void clearScroll(String scrollId); /** * more like this query to search for documents that are "like" a specific document. * * @param query * @param clazz + * @param index * @param * @return */ - Page moreLikeThis(MoreLikeThisQuery query, Class clazz); + Page moreLikeThis(MoreLikeThisQuery query, Class clazz, IndexCoordinates index); ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz); @@ -564,4 +482,20 @@ default void bulkUpdate(List queries) { * @return Converter in use */ ElasticsearchConverter getElasticsearchConverter(); + + /** + * @since 4.0 + */ + RequestFactory getRequestFactory(); + + /** + * @param clazz + * @return the IndexCoordinates defined on the entity. + * @since 4.0 + */ + default IndexCoordinates getIndexCoordinatesFor(Class clazz) { + ElasticsearchPersistentEntity entity = getPersistentEntityFor(clazz); + return IndexCoordinates.of(entity.getIndexName()).withTypes(entity.getIndexType()); + } + } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java index e30081661..6b37bb967 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplate.java @@ -16,31 +16,21 @@ package org.springframework.data.elasticsearch.core; import static org.elasticsearch.client.Requests.*; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.springframework.util.CollectionUtils.isEmpty; -import static org.springframework.util.StringUtils.*; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import org.apache.http.util.EntityUtils; -import org.elasticsearch.action.ActionFuture; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; -import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.admin.indices.get.GetIndexRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; @@ -48,7 +38,6 @@ import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.ClearScrollRequest; -import org.elasticsearch.action.search.ClearScrollResponse; import org.elasticsearch.action.search.MultiSearchRequest; import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.action.search.SearchRequest; @@ -58,58 +47,34 @@ import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Request; import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.Requests; import org.elasticsearch.client.Response; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.cluster.metadata.AliasMetaData; -import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.DeprecationHandler; import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.VersionType; -import org.elasticsearch.index.query.MoreLikeThisQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.ScoreSortBuilder; -import org.elasticsearch.search.sort.SortBuilder; -import org.elasticsearch.search.sort.SortBuilders; -import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.suggest.SuggestBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.ElasticsearchException; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Setting; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.client.support.AliasData; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.document.DocumentAdapters; import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.elasticsearch.support.SearchHitsUtil; import org.springframework.data.util.CloseableIterator; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; @@ -147,13 +112,9 @@ * @author Gyula Attila Csorogi * @author Massimiliano Poggi */ -public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate - implements EsClient, ApplicationContextAware { - - private static final Logger logger = LoggerFactory.getLogger(ElasticsearchRestTemplate.class); +public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate { private RestHighLevelClient client; - private String searchTimeout; public ElasticsearchRestTemplate(RestHighLevelClient client) { initialize(client, createElasticsearchConverter()); @@ -164,44 +125,14 @@ public ElasticsearchRestTemplate(RestHighLevelClient client, ElasticsearchConver } private void initialize(RestHighLevelClient client, ElasticsearchConverter elasticsearchConverter) { - Assert.notNull(client, "Client must not be null!"); - Assert.notNull(elasticsearchConverter, "ElasticsearchConverter must not be null."); - this.client = client; - this.elasticsearchConverter = elasticsearchConverter; - } - - @Override - public RestHighLevelClient getClient() { - return client; - } - - public void setSearchTimeout(String searchTimeout) { - this.searchTimeout = searchTimeout; + initialize(elasticsearchConverter); } @Override - public boolean addAlias(AliasQuery query) { - Assert.notNull(query.getIndexName(), "No index defined for Alias"); - Assert.notNull(query.getAliasName(), "No alias defined"); - IndicesAliasesRequest.AliasActions aliasAction = IndicesAliasesRequest.AliasActions.add() - .alias(query.getAliasName()).index(query.getIndexName()); - - if (query.getFilterBuilder() != null) { - aliasAction.filter(query.getFilterBuilder()); - } else if (query.getFilter() != null) { - aliasAction.filter(query.getFilter()); - } else if (hasText(query.getRouting())) { - aliasAction.routing(query.getRouting()); - } else if (hasText(query.getSearchRouting())) { - aliasAction.searchRouting(query.getSearchRouting()); - } else if (hasText(query.getIndexRouting())) { - aliasAction.indexRouting(query.getIndexRouting()); - } - - IndicesAliasesRequest request = new IndicesAliasesRequest(); - request.addAliasAction(aliasAction); + public boolean addAlias(AliasQuery query, IndexCoordinates index) { + IndicesAliasesRequest request = requestFactory.indicesAddAliasesRequest(query, index); try { return client.indices().updateAliases(request, RequestOptions.DEFAULT).isAcknowledged(); } catch (IOException e) { @@ -210,95 +141,52 @@ public boolean addAlias(AliasQuery query) { } @Override - public boolean removeAlias(AliasQuery query) { - - Assert.notNull(query.getIndexName(), "No index defined for Alias"); + public boolean removeAlias(AliasQuery query, IndexCoordinates index) { + Assert.notNull(index, "No index defined for Alias"); Assert.notNull(query.getAliasName(), "No alias defined"); - AliasActions aliasAction = IndicesAliasesRequest.AliasActions.remove() // - .index(query.getIndexName()) // - .alias(query.getAliasName()); - - IndicesAliasesRequest request = Requests.indexAliasesRequest() // - .addAliasAction(aliasAction); - + IndicesAliasesRequest indicesAliasesRequest = requestFactory.indicesRemoveAliasesRequest(query, index); try { - return client.indices().updateAliases(request, RequestOptions.DEFAULT).isAcknowledged(); + return client.indices().updateAliases(indicesAliasesRequest, RequestOptions.DEFAULT).isAcknowledged(); } catch (IOException e) { - throw new ElasticsearchException("failed to update aliases with request: " + request, e); + throw new ElasticsearchException("failed to update aliases with indicesRemoveAliasesRequest: " + indicesAliasesRequest, e); } } @Override - public boolean createIndex(Class clazz) { - return createIndexIfNotCreated(clazz); - } - - @Override - public boolean createIndex(String indexName) { - Assert.notNull(indexName, "No index defined for Query"); + public boolean createIndex(String indexName, Object settings) { + CreateIndexRequest request = requestFactory.createIndexRequest(indexName, settings); try { - return client.indices().create(createIndexRequest(indexName), RequestOptions.DEFAULT).isAcknowledged(); - } catch (Exception e) { - throw new ElasticsearchException("Failed to create index " + indexName, e); + return client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged(); + } catch (IOException e) { + throw new ElasticsearchException("Error for creating index: " + request.toString(), e); } } @Override - public boolean putMapping(Class clazz) { - return putMapping(clazz, buildMapping(clazz)); - } - - @Override - public boolean putMapping(Class clazz, Object mapping) { - return putMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType(), - mapping); - } - - @Override - public boolean putMapping(String indexName, String type, Class clazz) { - return putMapping(indexName, type, buildMapping(clazz)); - } - - @Override - public boolean putMapping(String indexName, String type, Object mapping) { - Assert.notNull(indexName, "No index defined for putMapping()"); - Assert.notNull(type, "No type defined for putMapping()"); - PutMappingRequest request = new PutMappingRequest(indexName).type(type); - if (mapping instanceof String) { - request.source(String.valueOf(mapping), XContentType.JSON); - } else if (mapping instanceof Map) { - request.source((Map) mapping); - } else if (mapping instanceof XContentBuilder) { - request.source((XContentBuilder) mapping); - } + public boolean putMapping(IndexCoordinates index, Object mapping) { + Assert.notNull(index, "No index defined for putMapping()"); + PutMappingRequest request = requestFactory.putMappingRequest(index, mapping); try { return client.indices().putMapping(request, RequestOptions.DEFAULT).isAcknowledged(); } catch (IOException e) { - throw new ElasticsearchException("Failed to put mapping for " + indexName, e); + throw new ElasticsearchException("Failed to put mapping for " + index.getIndexName(), e); } } @Override - public Map getMapping(String indexName, String type) { - Assert.notNull(indexName, "No index defined for getMapping()"); - Assert.notNull(type, "No type defined for getMapping()"); - Map mappings = null; + public Map getMapping(IndexCoordinates index) { + Assert.notNull(index, "No index defined for getMapping()"); RestClient restClient = client.getLowLevelClient(); try { - Request request = new Request("GET", '/' + indexName + "/_mapping/" + type + "?include_type_name=true"); + Request request = new Request("GET", + '/' + index.getIndexName() + "/_mapping/" + index.getTypeName() + "?include_type_name=true"); Response response = restClient.performRequest(request); - mappings = convertMappingResponse(EntityUtils.toString(response.getEntity()), type); + return convertMappingResponse(EntityUtils.toString(response.getEntity()), index.getTypeName()); } catch (Exception e) { - throw new ElasticsearchException( - "Error while getting mapping for indexName : " + indexName + " type : " + type + " ", e); + throw new ElasticsearchException("Error while getting mapping for indexName : " + index.getIndexName() + + " type : " + index.getTypeName() + ' ', e); } - return mappings; - } - - @Override - public Map getMapping(Class clazz) { - return getMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType()); } private Map convertMappingResponse(String mappingResponse, String type) { @@ -319,29 +207,16 @@ private Map convertMappingResponse(String mappingResponse, Strin } @Override - public T queryForObject(GetQuery query, Class clazz) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - GetRequest request = new GetRequest(persistentEntity.getIndexName(), persistentEntity.getIndexType(), - query.getId()); - GetResponse response; + public T get(GetQuery query, Class clazz, IndexCoordinates index) { + GetRequest request = requestFactory.getRequest(query, index); try { - response = client.get(request, RequestOptions.DEFAULT); + GetResponse response = client.get(request, RequestOptions.DEFAULT); return elasticsearchConverter.mapDocument(DocumentAdapters.from(response), clazz); } catch (IOException e) { throw new ElasticsearchException("Error while getting for request: " + request.toString(), e); } } - @Override - public T queryForObject(CriteriaQuery query, Class clazz) { - return getObjectFromPage(queryForPage(query, clazz)); - } - - @Override - public T queryForObject(StringQuery query, Class clazz) { - return getObjectFromPage(queryForPage(query, clazz)); - } - @Nullable private T getObjectFromPage(Page page) { int contentSize = page.getContent().size(); @@ -350,36 +225,7 @@ private T getObjectFromPage(Page page) { } @Override - public AggregatedPage queryForPage(NativeSearchQuery query, Class clazz) { - SearchResponse response = doSearch(prepareSearch(query, clazz), query); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); - } - - private List> doMultiSearch(List queries, Class clazz, MultiSearchRequest request) { - MultiSearchResponse.Item[] items = getMultiSearchResult(request); - List> res = new ArrayList<>(queries.size()); - int c = 0; - for (NativeSearchQuery query : queries) { - res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), clazz, - query.getPageable())); - } - return res; - } - - private List> doMultiSearch(List queries, List> classes, - MultiSearchRequest request) { - MultiSearchResponse.Item[] items = getMultiSearchResult(request); - List> res = new ArrayList<>(queries.size()); - int c = 0; - Iterator> it = classes.iterator(); - for (NativeSearchQuery query : queries) { - res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), it.next(), - query.getPageable())); - } - return res; - } - - private MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request) { + protected MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request) { MultiSearchResponse response; try { response = client.multiSearch(request, RequestOptions.DEFAULT); @@ -392,121 +238,48 @@ private MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest reque } @Override - public List> queryForPage(List queries, Class clazz) { - MultiSearchRequest request = new MultiSearchRequest(); - for (NativeSearchQuery query : queries) { - request.add(prepareSearch(prepareSearch(query, clazz), query)); - } - return doMultiSearch(queries, clazz, request); - } - - @Override - public List> queryForPage(List queries, List> classes) { - MultiSearchRequest request = new MultiSearchRequest(); - Iterator> it = classes.iterator(); - for (NativeSearchQuery query : queries) { - request.add(prepareSearch(prepareSearch(query, it.next()), query)); - } - return doMultiSearch(queries, classes, request); - } - - @Override - public T query(NativeSearchQuery query, ResultsExtractor resultsExtractor) { - SearchResponse response = doSearch(prepareSearch(query, Optional.ofNullable(query.getQuery()), null), query); - return resultsExtractor.extract(response); - } - - @Override - public List queryForList(CriteriaQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); - } - - @Override - public List queryForList(StringQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); - } - - @Override - public List queryForList(NativeSearchQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); - } - - @Override - public List queryForIds(NativeSearchQuery query) { - SearchRequest request = prepareSearch(query, Optional.ofNullable(query.getQuery()), null); - request.source().query(query.getQuery()); - if (query.getFilter() != null) { - request.source().postFilter(query.getFilter()); - } + public AggregatedPage queryForPage(Query query, Class clazz, IndexCoordinates index) { + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); SearchResponse response; try { - response = client.search(request, RequestOptions.DEFAULT); + response = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { - throw new ElasticsearchException("Error for search request: " + request.toString(), e); + throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e); } - return extractIds(response); + return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); } @Override - public Page queryForPage(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - SearchRequest request = prepareSearch(criteriaQuery, clazz); - SearchSourceBuilder sourceBuilder = request.source(); - - if (elasticsearchQuery != null) { - sourceBuilder.query(elasticsearchQuery); - } else { - sourceBuilder.query(QueryBuilders.matchAllQuery()); - } - - if (criteriaQuery.isLimiting()) { - sourceBuilder.size(criteriaQuery.getMaxResults()); - } - - if (criteriaQuery.getMinScore() > 0) { - sourceBuilder.minScore(criteriaQuery.getMinScore()); - } - - if (elasticsearchFilter != null) - sourceBuilder.postFilter(elasticsearchFilter); - if (logger.isDebugEnabled()) { - logger.debug("doSearch query:\n" + request.toString()); - } - - SearchResponse response; + public T query(Query query, ResultsExtractor resultsExtractor, @Nullable Class clazz, IndexCoordinates index) { + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); try { - response = client.search(request, RequestOptions.DEFAULT); + SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT); + return resultsExtractor.extract(result); } catch (IOException e) { - throw new ElasticsearchException("Error for search request: " + request.toString(), e); + throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e); } - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, criteriaQuery.getPageable()); } @Override - public Page queryForPage(StringQuery query, Class clazz) { - SearchRequest request = prepareSearch(query, clazz); - request.source().query((wrapperQuery(query.getSource()))); - SearchResponse response; - try { - response = client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new ElasticsearchException("Error for search request: " + request.toString(), e); - } - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); + public List queryForList(Query query, Class clazz, IndexCoordinates index) { + return queryForPage(query, clazz, index).getContent(); } @Override - public CloseableIterator stream(CriteriaQuery query, Class clazz) { - long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis(); - return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz), clazz); + public List queryForIds(Query query, Class clazz, IndexCoordinates index) { + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); + try { + SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + return extractIds(response); + } catch (IOException e) { + throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e); + } } @Override - public CloseableIterator stream(NativeSearchQuery query, Class clazz) { + public CloseableIterator stream(Query query, Class clazz, IndexCoordinates index) { long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis(); - return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz), clazz); + return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz, index), clazz); } private CloseableIterator doStream(long scrollTimeInMillis, ScrolledPage page, Class clazz) { @@ -515,149 +288,50 @@ private CloseableIterator doStream(long scrollTimeInMillis, ScrolledPage< } @Override - public long count(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - - if (elasticsearchFilter == null) { - return doCount(prepareCount(criteriaQuery, clazz), elasticsearchQuery); - } else { - // filter could not be set into CountRequestBuilder, convert request into search request - return doCount(prepareSearch(criteriaQuery, clazz), elasticsearchQuery, elasticsearchFilter); - } - } - - @Override - public long count(NativeSearchQuery searchQuery, Class clazz) { - QueryBuilder elasticsearchQuery = searchQuery.getQuery(); - QueryBuilder elasticsearchFilter = searchQuery.getFilter(); - - if (elasticsearchFilter == null) { - return doCount(prepareCount(searchQuery, clazz), elasticsearchQuery); - } else { - // filter could not be set into CountRequestBuilder, convert request into search request - return doCount(prepareSearch(searchQuery, clazz), elasticsearchQuery, elasticsearchFilter); - } - } + public long count(Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(index, "index must not be null"); + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); + searchRequest.source().size(0); - @Override - public long count(CriteriaQuery query) { - return count(query, null); - } - - @Override - public long count(NativeSearchQuery query) { - return count(query, null); - } - - private long doCount(SearchRequest countRequest, QueryBuilder elasticsearchQuery) { - SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); - if (elasticsearchQuery != null) { - sourceBuilder.query(elasticsearchQuery); - } - countRequest.source(sourceBuilder); - - try { - return SearchHitsUtil.getTotalCount(client.search(countRequest, RequestOptions.DEFAULT).getHits()); - } catch (IOException e) { - throw new ElasticsearchException("Error while searching for request: " + countRequest.toString(), e); - } - } - - private long doCount(SearchRequest searchRequest, QueryBuilder elasticsearchQuery, QueryBuilder elasticsearchFilter) { - if (elasticsearchQuery != null) { - searchRequest.source().query(elasticsearchQuery); - } else { - searchRequest.source().query(QueryBuilders.matchAllQuery()); - } - if (elasticsearchFilter != null) { - searchRequest.source().postFilter(elasticsearchFilter); - } - SearchResponse response; try { - response = client.search(searchRequest, RequestOptions.DEFAULT); + return SearchHitsUtil.getTotalCount(client.search(searchRequest, RequestOptions.DEFAULT).getHits()); } catch (IOException e) { throw new ElasticsearchException("Error for search request: " + searchRequest.toString(), e); } - return SearchHitsUtil.getTotalCount(response.getHits()); - } - - private SearchRequest prepareCount(Query query, Class clazz) { - String[] indexName = !isEmpty(query.getIndices()) - ? query.getIndices().toArray(new String[query.getIndices().size()]) - : retrieveIndexNameFromPersistentEntity(clazz); - String[] types = !isEmpty(query.getTypes()) ? query.getTypes().toArray(new String[query.getTypes().size()]) - : retrieveTypeFromPersistentEntity(clazz); - - Assert.notNull(indexName, "No index defined for Query"); - - SearchRequest countRequestBuilder = new SearchRequest(indexName); - - if (types != null) { - countRequestBuilder.types(types); - } - return countRequestBuilder; } @Override - public List multiGet(NativeSearchQuery searchQuery, Class clazz) { - return elasticsearchConverter.mapDocuments(DocumentAdapters.from(getMultiResponse(searchQuery, clazz)), clazz); - } - - private MultiGetResponse getMultiResponse(Query searchQuery, Class clazz) { - - String indexName = !isEmpty(searchQuery.getIndices()) ? searchQuery.getIndices().get(0) - : getPersistentEntityFor(clazz).getIndexName(); - String type = !isEmpty(searchQuery.getTypes()) ? searchQuery.getTypes().get(0) - : getPersistentEntityFor(clazz).getIndexType(); - - Assert.notNull(indexName, "No index defined for Query"); - Assert.notNull(type, "No type define for Query"); - Assert.notEmpty(searchQuery.getIds(), "No Id define for Query"); - - MultiGetRequest request = new MultiGetRequest(); - - if (searchQuery.getFields() != null && !searchQuery.getFields().isEmpty()) { - searchQuery.addSourceFilter(new FetchSourceFilter(toArray(searchQuery.getFields()), null)); - } - - for (String id : searchQuery.getIds()) { - - MultiGetRequest.Item item = new MultiGetRequest.Item(indexName, type, id); - - if (searchQuery.getRoute() != null) { - item = item.routing(searchQuery.getRoute()); - } - - request.add(item); - } + public List multiGet(Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(index, "index must not be null"); + Assert.notEmpty(query.getIds(), "No Id define for Query"); + MultiGetRequest request = requestFactory.multiGetRequest(query, index); try { - return client.multiGet(request, RequestOptions.DEFAULT); + MultiGetResponse result = client.mget(request, RequestOptions.DEFAULT); + return elasticsearchConverter.mapDocuments(DocumentAdapters.from(result), clazz); } catch (IOException e) { throw new ElasticsearchException("Error while multiget for request: " + request.toString(), e); } } @Override - public String index(IndexQuery query) { - String documentId; - IndexRequest request = prepareIndex(query); + public String index(IndexQuery query, IndexCoordinates index) { + IndexRequest request = requestFactory.indexRequest(query, index); try { - documentId = client.index(request, RequestOptions.DEFAULT).getId(); + String documentId = client.index(request, RequestOptions.DEFAULT).getId(); + + // We should call this because we are not going through a mapper. + if (query.getObject() != null) { + setPersistentEntityId(query.getObject(), documentId); + } + return documentId; } catch (IOException e) { throw new ElasticsearchException("Error while index for request: " + request.toString(), e); } - // We should call this because we are not going through a mapper. - if (query.getObject() != null) { - setPersistentEntityId(query.getObject(), documentId); - } - return documentId; } @Override - public UpdateResponse update(UpdateQuery query) { - UpdateRequest request = prepareUpdate(query); + public UpdateResponse update(UpdateQuery query, IndexCoordinates index) { + UpdateRequest request = requestFactory.updateRequest(query, index); try { return client.update(request, RequestOptions.DEFAULT); } catch (IOException e) { @@ -665,128 +339,34 @@ public UpdateResponse update(UpdateQuery query) { } } - private UpdateRequest prepareUpdate(UpdateQuery query) { - - String indexName = hasText(query.getIndexName()) ? query.getIndexName() - : getPersistentEntityFor(query.getClazz()).getIndexName(); - String type = hasText(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.getUpdateRequest(), "No UpdateRequest define for Query"); - - UpdateRequest queryUpdateRequest = query.getUpdateRequest(); - - UpdateRequest updateRequest = new UpdateRequest(indexName, type, query.getId()) // - .routing(queryUpdateRequest.routing()) // - .retryOnConflict(queryUpdateRequest.retryOnConflict()) // - .timeout(queryUpdateRequest.timeout()) // - .waitForActiveShards(queryUpdateRequest.waitForActiveShards()) // - .setRefreshPolicy(queryUpdateRequest.getRefreshPolicy()) // - .waitForActiveShards(queryUpdateRequest.waitForActiveShards()) // - .scriptedUpsert(queryUpdateRequest.scriptedUpsert()) // - .docAsUpsert(queryUpdateRequest.docAsUpsert()) // - .fetchSource(queryUpdateRequest.fetchSource()); - - if (query.DoUpsert()) { - updateRequest.docAsUpsert(true); - } - if (queryUpdateRequest.script() != null) { - updateRequest.script(queryUpdateRequest.script()); - } - if (queryUpdateRequest.doc() != null) { - updateRequest.doc(queryUpdateRequest.doc()); - } - if (queryUpdateRequest.upsertRequest() != null) { - updateRequest.upsert(queryUpdateRequest.upsertRequest()); - } - - return updateRequest; - } - @Override - public void bulkIndex(List queries, BulkOptions bulkOptions) { - + public void bulkIndex(List queries, BulkOptions bulkOptions, IndexCoordinates index) { Assert.notNull(queries, "List of IndexQuery must not be null"); Assert.notNull(bulkOptions, "BulkOptions must not be null"); - BulkRequest bulkRequest = new BulkRequest(); - setBulkOptions(bulkRequest, bulkOptions); - for (IndexQuery query : queries) { - bulkRequest.add(prepareIndex(query)); - } - try { - checkForBulkUpdateFailure(client.bulk(bulkRequest, RequestOptions.DEFAULT)); - } catch (IOException e) { - throw new ElasticsearchException("Error while bulk for request: " + bulkRequest.toString(), e); - } + doBulkOperation(queries, bulkOptions, index); } @Override - public void bulkUpdate(List queries, BulkOptions bulkOptions) { - + public void bulkUpdate(List queries, BulkOptions bulkOptions, IndexCoordinates index) { Assert.notNull(queries, "List of UpdateQuery must not be null"); Assert.notNull(bulkOptions, "BulkOptions must not be null"); - BulkRequest bulkRequest = new BulkRequest(); - setBulkOptions(bulkRequest, bulkOptions); - for (UpdateQuery query : queries) { - bulkRequest.add(prepareUpdate(query)); - } + doBulkOperation(queries, bulkOptions, index); + } + + private void doBulkOperation(List queries, BulkOptions bulkOptions, IndexCoordinates index) { + BulkRequest bulkRequest = requestFactory.bulkRequest(queries, bulkOptions, index); try { - checkForBulkUpdateFailure(client.bulk(bulkRequest, RequestOptions.DEFAULT)); + checkForBulkOperationFailure(client.bulk(bulkRequest, RequestOptions.DEFAULT)); } catch (IOException e) { throw new ElasticsearchException("Error while bulk for request: " + bulkRequest.toString(), e); } } - private static void setBulkOptions(BulkRequest bulkRequest, BulkOptions bulkOptions) { - - if (bulkOptions.getTimeout() != null) { - bulkRequest.timeout(bulkOptions.getTimeout()); - } - - if (bulkOptions.getRefreshPolicy() != null) { - bulkRequest.setRefreshPolicy(bulkOptions.getRefreshPolicy()); - } - - if (bulkOptions.getWaitForActiveShards() != null) { - bulkRequest.waitForActiveShards(bulkOptions.getWaitForActiveShards()); - } - - if (bulkOptions.getPipeline() != null) { - bulkRequest.pipeline(bulkOptions.getPipeline()); - } - - if (bulkOptions.getRoutingId() != null) { - bulkRequest.routing(bulkOptions.getRoutingId()); - } - } - - private void checkForBulkUpdateFailure(BulkResponse bulkResponse) { - if (bulkResponse.hasFailures()) { - Map failedDocuments = new HashMap<>(); - for (BulkItemResponse item : bulkResponse.getItems()) { - if (item.isFailed()) - failedDocuments.put(item.getId(), item.getFailureMessage()); - } - throw new ElasticsearchException( - "Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [" - + failedDocuments + "]", - failedDocuments); - } - } - - @Override - public boolean indexExists(Class clazz) { - return indexExists(getPersistentEntityFor(clazz).getIndexName()); - } - @Override public boolean indexExists(String indexName) { - GetIndexRequest request = new GetIndexRequest(); - request.indices(indexName); + GetIndexRequest request = new GetIndexRequest(indexName); try { return client.indices().exists(request, RequestOptions.DEFAULT); } catch (IOException e) { @@ -794,23 +374,6 @@ public boolean indexExists(String indexName) { } } - @Override - public boolean typeExists(String index, String type) { - RestClient restClient = client.getLowLevelClient(); - try { - Response response = restClient.performRequest(new Request("HEAD", index + "/_mapping/" + type)); - return (response.getStatusLine().getStatusCode() == 200); - } catch (Exception e) { - throw new ElasticsearchException("Error while checking type exists for index: " + index + " type : " + type + " ", - e); - } - } - - @Override - public boolean deleteIndex(Class clazz) { - return deleteIndex(getPersistentEntityFor(clazz).getIndexName()); - } - @Override public boolean deleteIndex(String indexName) { Assert.notNull(indexName, "No index defined for delete operation"); @@ -826,8 +389,8 @@ public boolean deleteIndex(String indexName) { } @Override - public String delete(String indexName, String type, String id) { - DeleteRequest request = new DeleteRequest(indexName, type, id); + public String delete(String id, IndexCoordinates index) { + DeleteRequest request = new DeleteRequest(index.getIndexName(), index.getTypeName(), id); try { return client.delete(request, RequestOptions.DEFAULT).getId(); } catch (IOException e) { @@ -836,31 +399,8 @@ public String delete(String indexName, String type, String id) { } @Override - public String delete(Class clazz, String id) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - return delete(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id); - } - - @Override - public void delete(DeleteQuery deleteQuery, Class clazz) { - - String indexName = hasText(deleteQuery.getIndex()) ? deleteQuery.getIndex() - : getPersistentEntityFor(clazz).getIndexName(); - String typeName = hasText(deleteQuery.getType()) ? deleteQuery.getType() - : getPersistentEntityFor(clazz).getIndexType(); - - DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName) // - .setDocTypes(typeName) // - .setQuery(deleteQuery.getQuery()) // - .setAbortOnVersionConflict(false) // - .setRefresh(true); - - if (deleteQuery.getPageSize() != null) - deleteByQueryRequest.setBatchSize(deleteQuery.getPageSize()); - - if (deleteQuery.getScrollTimeInMillis() != null) - deleteByQueryRequest.setScroll(TimeValue.timeValueMillis(deleteQuery.getScrollTimeInMillis())); - + public void delete(DeleteQuery deleteQuery, IndexCoordinates index) { + DeleteByQueryRequest deleteByQueryRequest = requestFactory.deleteByQueryRequest(deleteQuery, index); try { client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); } catch (IOException e) { @@ -869,144 +409,19 @@ public void delete(DeleteQuery deleteQuery, Class clazz) { } @Override - public void delete(DeleteQuery deleteQuery) { - Assert.notNull(deleteQuery.getIndex(), "No index defined for Query"); - Assert.notNull(deleteQuery.getType(), "No type define for Query"); - delete(deleteQuery, null); - } - - @Override - public void delete(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - Assert.notNull(elasticsearchQuery, "Query can not be null."); - DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(elasticsearchQuery); - delete(deleteQuery, clazz); - } - - private SearchRequest prepareScroll(Query query, long scrollTimeInMillis, Class clazz) { - setPersistentEntityIndexAndType(query, clazz); - ElasticsearchPersistentEntity entity = getPersistentEntity(clazz); - return prepareScroll(query, scrollTimeInMillis, entity); - } - - private SearchRequest prepareScroll(Query query, long scrollTimeInMillis, - @Nullable ElasticsearchPersistentEntity entity) { - SearchRequest request = new SearchRequest(toArray(query.getIndices())); - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - request.types(toArray(query.getTypes())); - request.scroll(TimeValue.timeValueMillis(scrollTimeInMillis)); - - if (query.getPageable().isPaged()) { - searchSourceBuilder.size(query.getPageable().getPageSize()); - } - - if (query.getSourceFilter() != null) { - SourceFilter sourceFilter = query.getSourceFilter(); - searchSourceBuilder.fetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); - } - - if (!isEmpty(query.getFields())) { - searchSourceBuilder.fetchSource(toArray(query.getFields()), null); - } - - if (query.getSort() != null) { - prepareSort(query, searchSourceBuilder, entity); - } - - if (query.getIndicesOptions() != null) { - request.indicesOptions(query.getIndicesOptions()); - } - - if (query instanceof NativeSearchQuery) { - NativeSearchQuery searchQuery = (NativeSearchQuery) query; - - if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) { - HighlightBuilder highlightBuilder = searchQuery.getHighlightBuilder(); - if (highlightBuilder == null) { - highlightBuilder = new HighlightBuilder(); - } - if (searchQuery.getHighlightFields() != null) { - for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { - highlightBuilder.field(highlightField); - } - } - searchSourceBuilder.highlighter(highlightBuilder); - } - } - - request.source(searchSourceBuilder); - return request; - } - - private SearchResponse doScroll(SearchRequest request, CriteriaQuery criteriaQuery) { - Assert.notNull(criteriaQuery.getIndices(), "No index defined for Query"); - Assert.notNull(criteriaQuery.getTypes(), "No type define for Query"); - Assert.notNull(criteriaQuery.getPageable(), "Query.pageable is required for scan & scroll"); - - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - - if (elasticsearchQuery != null) { - request.source().query(elasticsearchQuery); - } else { - request.source().query(QueryBuilders.matchAllQuery()); - } - - if (elasticsearchFilter != null) { - request.source().postFilter(elasticsearchFilter); - } - request.source().version(true); + public ScrolledPage startScroll(long scrollTimeInMillis, Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(query.getPageable(), "Query.pageable is required for scan & scroll"); + SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); + searchRequest.scroll(TimeValue.timeValueMillis(scrollTimeInMillis)); try { - return client.search(request, RequestOptions.DEFAULT); + SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT); + return elasticsearchConverter.mapResults(SearchDocumentResponse.from(result), clazz, null); } catch (IOException e) { - throw new ElasticsearchException("Error for search request with scroll: " + request.toString(), e); - } - } - - private SearchResponse doScroll(SearchRequest request, NativeSearchQuery searchQuery) { - Assert.notNull(searchQuery.getIndices(), "No index defined for Query"); - Assert.notNull(searchQuery.getTypes(), "No type define for Query"); - Assert.notNull(searchQuery.getPageable(), "Query.pageable is required for scan & scroll"); - - if (searchQuery.getQuery() != null) { - request.source().query(searchQuery.getQuery()); - } else { - request.source().query(QueryBuilders.matchAllQuery()); - } - - if (searchQuery.getFilter() != null) { - request.source().postFilter(searchQuery.getFilter()); - } - request.source().version(true); - - if (!isEmpty(searchQuery.getElasticsearchSorts())) { - for (SortBuilder sort : searchQuery.getElasticsearchSorts()) { - request.source().sort(sort); - } - } - - try { - return client.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new ElasticsearchException("Error for search request with scroll: " + request.toString(), e); + throw new ElasticsearchException("Error for search request with scroll: " + searchRequest.toString(), e); } } - @Override - public ScrolledPage startScroll(long scrollTimeInMillis, NativeSearchQuery searchQuery, Class clazz) { - SearchResponse response = doScroll(prepareScroll(searchQuery, scrollTimeInMillis, clazz), searchQuery); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, null); - } - - @Override - public ScrolledPage startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz) { - SearchResponse response = doScroll(prepareScroll(criteriaQuery, scrollTimeInMillis, clazz), criteriaQuery); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, null); - } - @Override public ScrolledPage continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz) { SearchScrollRequest request = new SearchScrollRequest(scrollId); @@ -1025,177 +440,12 @@ public void clearScroll(String scrollId) { ClearScrollRequest request = new ClearScrollRequest(); request.addScrollId(scrollId); try { - // TODO: Something useful with the response. - ClearScrollResponse response = client.clearScroll(request, RequestOptions.DEFAULT); + client.clearScroll(request, RequestOptions.DEFAULT); } catch (IOException e) { throw new ElasticsearchException("Error for search request with scroll: " + request.toString(), e); } } - @Override - public Page moreLikeThis(MoreLikeThisQuery query, Class clazz) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - String indexName = hasText(query.getIndexName()) ? query.getIndexName() : persistentEntity.getIndexName(); - String type = hasText(query.getType()) ? query.getType() : persistentEntity.getIndexType(); - - Assert.notNull(indexName, "No 'indexName' defined for MoreLikeThisQuery"); - Assert.notNull(type, "No 'type' defined for MoreLikeThisQuery"); - Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery"); - - MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = moreLikeThisQuery( - toArray(new MoreLikeThisQueryBuilder.Item(indexName, type, query.getId()))); - - if (query.getMinTermFreq() != null) { - moreLikeThisQueryBuilder.minTermFreq(query.getMinTermFreq()); - } - if (query.getMaxQueryTerms() != null) { - moreLikeThisQueryBuilder.maxQueryTerms(query.getMaxQueryTerms()); - } - if (!isEmpty(query.getStopWords())) { - moreLikeThisQueryBuilder.stopWords(toArray(query.getStopWords())); - } - if (query.getMinDocFreq() != null) { - moreLikeThisQueryBuilder.minDocFreq(query.getMinDocFreq()); - } - if (query.getMaxDocFreq() != null) { - moreLikeThisQueryBuilder.maxDocFreq(query.getMaxDocFreq()); - } - if (query.getMinWordLen() != null) { - moreLikeThisQueryBuilder.minWordLength(query.getMinWordLen()); - } - if (query.getMaxWordLen() != null) { - moreLikeThisQueryBuilder.maxWordLength(query.getMaxWordLen()); - } - if (query.getBoostTerms() != null) { - moreLikeThisQueryBuilder.boostTerms(query.getBoostTerms()); - } - - return queryForPage(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz); - } - - private SearchResponse doSearch(SearchRequest searchRequest, NativeSearchQuery searchQuery) { - prepareSearch(searchRequest, searchQuery); - - try { - return client.search(searchRequest, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new ElasticsearchException("Error for search request with scroll: " + searchRequest.toString(), e); - } - } - - private SearchRequest prepareSearch(SearchRequest searchRequest, NativeSearchQuery searchQuery) { - if (searchQuery.getFilter() != null) { - searchRequest.source().postFilter(searchQuery.getFilter()); - } - - if (!isEmpty(searchQuery.getElasticsearchSorts())) { - for (SortBuilder sort : searchQuery.getElasticsearchSorts()) { - searchRequest.source().sort(sort); - } - } - - if (!searchQuery.getScriptFields().isEmpty()) { - // _source should be return all the time - // searchRequest.addStoredField("_source"); - for (ScriptField scriptedField : searchQuery.getScriptFields()) { - searchRequest.source().scriptField(scriptedField.fieldName(), scriptedField.script()); - } - } - - if (searchQuery.getCollapseBuilder() != null) { - searchRequest.source().collapse(searchQuery.getCollapseBuilder()); - } - - if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) { - HighlightBuilder highlightBuilder = searchQuery.getHighlightBuilder(); - if (highlightBuilder == null) { - highlightBuilder = new HighlightBuilder(); - } - if (searchQuery.getHighlightFields() != null) { - for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { - highlightBuilder.field(highlightField); - } - } - searchRequest.source().highlighter(highlightBuilder); - } - - if (!isEmpty(searchQuery.getIndicesBoost())) { - for (IndexBoost indexBoost : searchQuery.getIndicesBoost()) { - searchRequest.source().indexBoost(indexBoost.getIndexName(), indexBoost.getBoost()); - } - } - - if (!isEmpty(searchQuery.getAggregations())) { - for (AbstractAggregationBuilder aggregationBuilder : searchQuery.getAggregations()) { - searchRequest.source().aggregation(aggregationBuilder); - } - } - - if (!isEmpty(searchQuery.getFacets())) { - for (FacetRequest aggregatedFacet : searchQuery.getFacets()) { - searchRequest.source().aggregation(aggregatedFacet.getFacet()); - } - } - return searchRequest; - } - - private SearchResponse getSearchResponse(ActionFuture response) { - return searchTimeout == null ? response.actionGet() : response.actionGet(searchTimeout); - } - - private boolean createIndexIfNotCreated(Class clazz) { - return indexExists(getPersistentEntityFor(clazz).getIndexName()) || createIndexWithSettings(clazz); - } - - private boolean createIndexWithSettings(Class clazz) { - if (clazz.isAnnotationPresent(Setting.class)) { - String settingPath = clazz.getAnnotation(Setting.class).settingPath(); - if (hasText(settingPath)) { - String settings = ResourceUtil.readFileFromClasspath(settingPath); - if (hasText(settings)) { - return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); - } - } else { - logger.info("settingPath in @Setting has to be defined. Using default instead."); - } - } - return createIndex(getPersistentEntityFor(clazz).getIndexName(), getDefaultSettings(getPersistentEntityFor(clazz))); - } - - @Override - public boolean createIndex(String indexName, Object settings) { - CreateIndexRequest request = new CreateIndexRequest(indexName); - if (settings instanceof String) { - request.settings(String.valueOf(settings), Requests.INDEX_CONTENT_TYPE); - } else if (settings instanceof Map) { - request.settings((Map) settings); - } else if (settings instanceof XContentBuilder) { - request.settings((XContentBuilder) settings); - } - try { - return client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged(); - } catch (IOException e) { - throw new ElasticsearchException("Error for creating index: " + request.toString(), e); - } - } - - @Override - public boolean createIndex(Class clazz, Object settings) { - return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); - } - - private Map getDefaultSettings(ElasticsearchPersistentEntity persistentEntity) { - - if (persistentEntity.isUseServerConfiguration()) - return new HashMap(); - - return new MapBuilder().put("index.number_of_shards", String.valueOf(persistentEntity.getShards())) - .put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas())) - .put("index.refresh_interval", persistentEntity.getRefreshInterval()) - .put("index.store.type", persistentEntity.getIndexStoreType()).map(); - } - @Override public Map getSetting(Class clazz) { return getSetting(getPersistentEntityFor(clazz).getIndexName()); @@ -1237,154 +487,16 @@ private Map convertSettingResponse(String settingResponse, Strin } - private SearchRequest prepareSearch(Query query, Class clazz) { - setPersistentEntityIndexAndType(query, clazz); - return prepareSearch(query, Optional.empty(), clazz); - } - - private SearchRequest prepareSearch(NativeSearchQuery query, Class clazz) { - setPersistentEntityIndexAndType(query, clazz); - return prepareSearch(query, Optional.ofNullable(query.getQuery()), clazz); - } - - private SearchRequest prepareSearch(Query query, Optional builder, @Nullable Class clazz) { - Assert.notNull(query.getIndices(), "No index defined for Query"); - Assert.notNull(query.getTypes(), "No type defined for Query"); - - int startRecord = 0; - SearchRequest request = new SearchRequest(toArray(query.getIndices())); - SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); - request.types(toArray(query.getTypes())); - sourceBuilder.version(true); - sourceBuilder.trackScores(query.getTrackScores()); - - if (builder.isPresent()) { - sourceBuilder.query(builder.get()); - } - - if (query.getSourceFilter() != null) { - SourceFilter sourceFilter = query.getSourceFilter(); - sourceBuilder.fetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); - } - - if (query.getPageable().isPaged()) { - startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); - sourceBuilder.size(query.getPageable().getPageSize()); - } - sourceBuilder.from(startRecord); - - if (!query.getFields().isEmpty()) { - sourceBuilder.fetchSource(toArray(query.getFields()), null); - } - - if (query.getIndicesOptions() != null) { - request.indicesOptions(query.getIndicesOptions()); - } - - if (query.getSort() != null) { - prepareSort(query, sourceBuilder, getPersistentEntity(clazz)); - } - - if (query.getMinScore() > 0) { - sourceBuilder.minScore(query.getMinScore()); - } - - if (query.getPreference() != null) { - request.preference(query.getPreference()); - } - - if (query.getSearchType() != null) { - request.searchType(query.getSearchType()); - } - - request.source(sourceBuilder); - return request; - } - - private void prepareSort(Query query, SearchSourceBuilder sourceBuilder, - @Nullable ElasticsearchPersistentEntity entity) { - - for (Sort.Order order : query.getSort()) { - SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC; - - if (ScoreSortBuilder.NAME.equals(order.getProperty())) { - ScoreSortBuilder sort = SortBuilders // - .scoreSort() // - .order(sortOrder); - - sourceBuilder.sort(sort); - } else { - ElasticsearchPersistentProperty property = (entity != null) // - ? entity.getPersistentProperty(order.getProperty()) // - : null; - String fieldName = property != null ? property.getFieldName() : order.getProperty(); - - FieldSortBuilder sort = SortBuilders // - .fieldSort(fieldName) // - .order(sortOrder); - - if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) { - sort.missing("_first"); - } else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) { - sort.missing("_last"); - } - - sourceBuilder.sort(sort); - } - } - } - - private IndexRequest prepareIndex(IndexQuery query) { - String indexName = StringUtils.isEmpty(query.getIndexName()) - ? retrieveIndexNameFromPersistentEntity(query.getObject().getClass())[0] - : query.getIndexName(); - String type = StringUtils.isEmpty(query.getType()) - ? retrieveTypeFromPersistentEntity(query.getObject().getClass())[0] - : query.getType(); - - IndexRequest indexRequest = null; - - if (query.getObject() != null) { - String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); - // If we have a query id and a document id, do not ask ES to generate one. - if (id != null) { - indexRequest = new IndexRequest(indexName, type, id); - } else { - indexRequest = new IndexRequest(indexName, type); - } - indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE); - } else if (query.getSource() != null) { - indexRequest = new IndexRequest(indexName, type, query.getId()).source(query.getSource(), - Requests.INDEX_CONTENT_TYPE); - } else { - throw new ElasticsearchException( - "object or source is null, failed to index the document [id: " + query.getId() + "]"); - } - if (query.getVersion() != null) { - indexRequest.version(query.getVersion()); - VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); - indexRequest.versionType(versionType); - } - - return indexRequest; - } - @Override - public void refresh(String indexName) { - Assert.notNull(indexName, "No index defined for refresh()"); + public void refresh(IndexCoordinates index) { + Assert.notNull(index, "No index defined for refresh()"); try { - // TODO: Do something with the response. - client.indices().refresh(refreshRequest(indexName), RequestOptions.DEFAULT); + client.indices().refresh(refreshRequest(index.getIndexNames()), RequestOptions.DEFAULT); } catch (IOException e) { - throw new ElasticsearchException("failed to refresh index: " + indexName, e); + throw new ElasticsearchException("failed to refresh index: " + index, e); } } - @Override - public void refresh(Class clazz) { - refresh(getPersistentEntityFor(clazz).getIndexName()); - } - @Override public List queryForAlias(String indexName) { List aliases = null; @@ -1393,7 +505,7 @@ public List queryForAlias(String indexName) { String aliasResponse; try { - response = restClient.performRequest(new Request("GET", "/" + indexName + "/_alias/*")); + response = restClient.performRequest(new Request("GET", '/' + indexName + "/_alias/*")); aliasResponse = EntityUtils.toString(response.getEntity()); } catch (Exception e) { throw new ElasticsearchException("Error while getting mapping for indexName : " + indexName, e); @@ -1438,72 +550,6 @@ private List convertAliasResponse(String aliasResponse) { } } - @Nullable - private ElasticsearchPersistentEntity getPersistentEntity(@Nullable Class clazz) { - return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null; - } - - @Override - public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) { - Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName() - + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); - return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz); - } - - private String getPersistentEntityId(Object entity) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(entity.getClass()); - Object identifier = persistentEntity.getIdentifierAccessor(entity).getIdentifier(); - - if (identifier != null) { - return identifier.toString(); - } - - return null; - } - - private void setPersistentEntityId(Object entity, String id) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(entity.getClass()); - ElasticsearchPersistentProperty idProperty = persistentEntity.getIdProperty(); - - // Only deal with text because ES generated Ids are strings ! - - if (idProperty != null && idProperty.getType().isAssignableFrom(String.class)) { - persistentEntity.getPropertyAccessor(entity).setProperty(idProperty, id); - } - } - - private void setPersistentEntityIndexAndType(Query query, Class clazz) { - if (query.getIndices().isEmpty()) { - query.addIndices(retrieveIndexNameFromPersistentEntity(clazz)); - } - if (query.getTypes().isEmpty()) { - query.addTypes(retrieveTypeFromPersistentEntity(clazz)); - } - } - - private String[] retrieveIndexNameFromPersistentEntity(Class clazz) { - if (clazz != null) { - return new String[] { getPersistentEntityFor(clazz).getIndexName() }; - } - return null; - } - - private String[] retrieveTypeFromPersistentEntity(Class clazz) { - if (clazz != null) { - return new String[] { getPersistentEntityFor(clazz).getIndexType() }; - } - return null; - } - - private VersionType retrieveVersionTypeFromPersistentEntity(Class clazz) { - if (clazz != null) { - return getPersistentEntityFor(clazz).getVersionType(); - } - return VersionType.EXTERNAL; - } - private List extractIds(SearchResponse response) { List ids = new ArrayList<>(); for (SearchHit hit : response.getHits()) { @@ -1514,29 +560,8 @@ private List extractIds(SearchResponse response) { return ids; } - @Override - public void setApplicationContext(ApplicationContext context) throws BeansException { - if (elasticsearchConverter instanceof ApplicationContextAware) { - ((ApplicationContextAware) elasticsearchConverter).setApplicationContext(context); - } - } - - private static String[] toArray(List values) { - String[] valuesAsArray = new String[values.size()]; - return values.toArray(valuesAsArray); - } - - private static MoreLikeThisQueryBuilder.Item[] toArray(MoreLikeThisQueryBuilder.Item... values) { - return values; - } - - @Deprecated - public static String readFileFromClasspath(String url) { - return ResourceUtil.readFileFromClasspath(url); - } - - public SearchResponse suggest(SuggestBuilder suggestion, String... indices) { - SearchRequest searchRequest = new SearchRequest(indices); + public SearchResponse suggest(SuggestBuilder suggestion, IndexCoordinates index) { + SearchRequest searchRequest = new SearchRequest(index.getIndexNames()); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.suggest(suggestion); searchRequest.source(sourceBuilder); @@ -1547,9 +572,4 @@ public SearchResponse suggest(SuggestBuilder suggestion, String... indices) { throw new ElasticsearchException("Could not execute search request : " + searchRequest.toString(), e); } } - - public SearchResponse suggest(SuggestBuilder suggestion, Class clazz) { - return suggest(suggestion, retrieveIndexNameFromPersistentEntity(clazz)); - } - } 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 593fdf418..7a8ddade5 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -16,12 +16,8 @@ package org.springframework.data.elasticsearch.core; import static org.elasticsearch.client.Requests.*; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.springframework.util.CollectionUtils.*; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -34,68 +30,45 @@ import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest; -import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; -import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.get.GetRequestBuilder; import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.get.MultiGetRequest; import org.elasticsearch.action.get.MultiGetRequestBuilder; -import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.search.MultiSearchRequest; import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.update.UpdateRequest; 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.cluster.metadata.AliasMetaData; -import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.VersionType; -import org.elasticsearch.index.query.MoreLikeThisQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.reindex.DeleteByQueryAction; -import org.elasticsearch.index.reindex.DeleteByQueryRequestBuilder; import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.ScoreSortBuilder; -import org.elasticsearch.search.sort.SortBuilder; -import org.elasticsearch.search.sort.SortBuilders; -import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.suggest.SuggestBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.ElasticsearchException; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Setting; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.document.DocumentAdapters; import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; -import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; -import org.springframework.data.elasticsearch.core.query.*; +import org.springframework.data.elasticsearch.core.query.AliasQuery; +import org.springframework.data.elasticsearch.core.query.BulkOptions; +import org.springframework.data.elasticsearch.core.query.DeleteQuery; +import org.springframework.data.elasticsearch.core.query.GetQuery; +import org.springframework.data.elasticsearch.core.query.IndexQuery; +import org.springframework.data.elasticsearch.core.query.Query; +import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.support.SearchHitsUtil; import org.springframework.data.util.CloseableIterator; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.StringUtils; /** * ElasticsearchTemplate @@ -126,12 +99,10 @@ * @deprecated as of 4.0 */ @Deprecated -public class ElasticsearchTemplate extends AbstractElasticsearchTemplate - implements EsClient, ApplicationContextAware { +public class ElasticsearchTemplate extends AbstractElasticsearchTemplate { private static final Logger QUERY_LOGGER = LoggerFactory .getLogger("org.springframework.data.elasticsearch.core.QUERY"); - private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchTemplate.class); private Client client; private String searchTimeout; @@ -146,15 +117,8 @@ public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearch private void initialize(Client client, ElasticsearchConverter elasticsearchConverter) { Assert.notNull(client, "Client must not be null!"); - Assert.notNull(elasticsearchConverter, "elasticsearchConverter must not be null."); - this.client = client; - this.elasticsearchConverter = elasticsearchConverter; - } - - @Override - public Client getClient() { - return client; + initialize(elasticsearchConverter); } public void setSearchTimeout(String searchTimeout) { @@ -162,117 +126,54 @@ public void setSearchTimeout(String searchTimeout) { } @Override - public boolean addAlias(AliasQuery query) { - Assert.notNull(query.getIndexName(), "No index defined for Alias"); - Assert.notNull(query.getAliasName(), "No alias defined"); - IndicesAliasesRequest.AliasActions aliasAction = IndicesAliasesRequest.AliasActions.add() - .alias(query.getAliasName()).index(query.getIndexName()); - - if (query.getFilterBuilder() != null) { - aliasAction.filter(query.getFilterBuilder()); - } else if (query.getFilter() != null) { - aliasAction.filter(query.getFilter()); - } else if (!StringUtils.isEmpty(query.getRouting())) { - aliasAction.routing(query.getRouting()); - } else if (!StringUtils.isEmpty(query.getSearchRouting())) { - aliasAction.searchRouting(query.getSearchRouting()); - } else if (!StringUtils.isEmpty(query.getIndexRouting())) { - aliasAction.indexRouting(query.getIndexRouting()); - } + public boolean addAlias(AliasQuery query, IndexCoordinates index) { + IndicesAliasesRequest.AliasActions aliasAction = requestFactory.aliasAction(query, index); return client.admin().indices().prepareAliases().addAliasAction(aliasAction).execute().actionGet().isAcknowledged(); } @Override - public boolean removeAlias(AliasQuery query) { - Assert.notNull(query.getIndexName(), "No index defined for Alias"); + public boolean removeAlias(AliasQuery query, IndexCoordinates index) { + Assert.notNull(index, "No index defined for Alias"); Assert.notNull(query.getAliasName(), "No alias defined"); - return client.admin().indices().prepareAliases().removeAlias(query.getIndexName(), query.getAliasName()).execute() + return client.admin().indices().prepareAliases().removeAlias(index.getIndexName(), query.getAliasName()).execute() .actionGet().isAcknowledged(); } @Override - public boolean createIndex(Class clazz) { - return createIndexIfNotCreated(clazz); - } - - @Override - public boolean createIndex(String indexName) { - Assert.notNull(indexName, "No index defined for Query"); - return client.admin().indices().create(Requests.createIndexRequest(indexName)).actionGet().isAcknowledged(); - } - - @Override - public boolean putMapping(Class clazz) { - return putMapping(clazz, buildMapping(clazz)); - } - - @Override - public boolean putMapping(Class clazz, Object mapping) { - return putMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType(), - mapping); - } - - @Override - public boolean putMapping(String indexName, String type, Class clazz) { - return putMapping(indexName, type, buildMapping(clazz)); + public boolean createIndex(String indexName, Object settings) { + CreateIndexRequestBuilder createIndexRequestBuilder = requestFactory.createIndexRequestBuilder(client, indexName, + settings); + return createIndexRequestBuilder.execute().actionGet().isAcknowledged(); } @Override - public boolean putMapping(String indexName, String type, Object mapping) { - Assert.notNull(indexName, "No index defined for putMapping()"); - Assert.notNull(type, "No type defined for putMapping()"); - PutMappingRequestBuilder requestBuilder = client.admin().indices().preparePutMapping(indexName).setType(type); - if (mapping instanceof String) { - requestBuilder.setSource(String.valueOf(mapping), XContentType.JSON); - } else if (mapping instanceof Map) { - requestBuilder.setSource((Map) mapping); - } else if (mapping instanceof XContentBuilder) { - requestBuilder.setSource((XContentBuilder) mapping); - } + public boolean putMapping(IndexCoordinates index, Object mapping) { + Assert.notNull(index, "No index defined for putMapping()"); + PutMappingRequestBuilder requestBuilder = requestFactory.putMappingRequestBuilder(client, index, mapping); return requestBuilder.execute().actionGet().isAcknowledged(); } @Override - public Map getMapping(String indexName, String type) { - Assert.notNull(indexName, "No index defined for putMapping()"); - Assert.notNull(type, "No type defined for putMapping()"); - Map mappings = null; + public Map getMapping(IndexCoordinates index) { + Assert.notNull(index, "No index defined for putMapping()"); try { - mappings = client.admin().indices().getMappings(new GetMappingsRequest().indices(indexName).types(type)) - .actionGet().getMappings().get(indexName).get(type).getSourceAsMap(); + return client.admin().indices() + .getMappings(new GetMappingsRequest().indices(index.getIndexNames()).types(index.getTypeNames())).actionGet() + .getMappings().get(index.getIndexName()).get(index.getTypeName()).getSourceAsMap(); } catch (Exception e) { - throw new ElasticsearchException( - "Error while getting mapping for indexName : " + indexName + " type : " + type + " " + e.getMessage()); + throw new ElasticsearchException("Error while getting mapping for indexName : " + index.getIndexName() + + " type : " + index.getTypeName() + ' ' + e.getMessage()); } - return mappings; } @Override - public Map getMapping(Class clazz) { - return getMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType()); - } - - @Override - public T queryForObject(GetQuery query, Class clazz) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - GetResponse response = client - .prepareGet(persistentEntity.getIndexName(), persistentEntity.getIndexType(), query.getId()).execute() - .actionGet(); - + public T get(GetQuery query, Class clazz, IndexCoordinates index) { + GetRequestBuilder getRequestBuilder = requestFactory.getRequestBuilder(client, query, index); + GetResponse response = getRequestBuilder.execute().actionGet(); T entity = elasticsearchConverter.mapDocument(DocumentAdapters.from(response), clazz); return entity; } - @Override - public T queryForObject(CriteriaQuery query, Class clazz) { - return getObjectFromPage(queryForPage(query, clazz)); - } - - @Override - public T queryForObject(StringQuery query, Class clazz) { - return getObjectFromPage(queryForPage(query, clazz)); - } - @Nullable private T getObjectFromPage(Page page) { int contentSize = page.getContent().size(); @@ -281,45 +182,7 @@ private T getObjectFromPage(Page page) { } @Override - public AggregatedPage queryForPage(NativeSearchQuery query, Class clazz) { - SearchResponse response = doSearch(prepareSearch(query, clazz), query); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); - } - - @Override - public List> queryForPage(List queries, Class clazz) { - MultiSearchRequest request = new MultiSearchRequest(); - for (NativeSearchQuery query : queries) { - request.add(prepareSearch(prepareSearch(query, clazz), query)); - } - return doMultiSearch(queries, clazz, request); - } - - private List> doMultiSearch(List queries, Class clazz, MultiSearchRequest request) { - MultiSearchResponse.Item[] items = getMultiSearchResult(request); - List> res = new ArrayList<>(queries.size()); - int c = 0; - for (NativeSearchQuery query : queries) { - res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), clazz, - query.getPageable())); - } - return res; - } - - private List> doMultiSearch(List queries, List> classes, - MultiSearchRequest request) { - MultiSearchResponse.Item[] items = getMultiSearchResult(request); - List> res = new ArrayList<>(queries.size()); - int c = 0; - Iterator> it = classes.iterator(); - for (NativeSearchQuery query : queries) { - res.add(elasticsearchConverter.mapResults(SearchDocumentResponse.from(items[c++].getResponse()), it.next(), - query.getPageable())); - } - return res; - } - - private MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request) { + protected MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest request) { ActionFuture future = client.multiSearch(request); MultiSearchResponse response = future.actionGet(); MultiSearchResponse.Item[] items = response.getResponses(); @@ -328,92 +191,35 @@ private MultiSearchResponse.Item[] getMultiSearchResult(MultiSearchRequest reque } @Override - public List> queryForPage(List queries, List> classes) { - Assert.isTrue(queries.size() == classes.size(), "Queries should have same length with classes"); - MultiSearchRequest request = new MultiSearchRequest(); - Iterator> it = classes.iterator(); - for (NativeSearchQuery query : queries) { - request.add(prepareSearch(prepareSearch(query, it.next()), query)); - } - return doMultiSearch(queries, classes, request); - } - - @Override - public T query(NativeSearchQuery query, ResultsExtractor resultsExtractor) { - SearchResponse response = doSearch(prepareSearch(query, (ElasticsearchPersistentEntity) null), query); + public T query(Query query, ResultsExtractor resultsExtractor, Class clazz, IndexCoordinates index) { + SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); + SearchResponse response = getSearchResponse(searchRequestBuilder); return resultsExtractor.extract(response); } @Override - public List queryForList(CriteriaQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); - } - - @Override - public List queryForList(StringQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); - } - - @Override - public List queryForList(NativeSearchQuery query, Class clazz) { - return queryForPage(query, clazz).getContent(); + public List queryForList(Query query, Class clazz, IndexCoordinates index) { + return queryForPage(query, clazz, index).getContent(); } @Override - public List queryForIds(NativeSearchQuery query) { - SearchRequestBuilder request = prepareSearch(query, (ElasticsearchPersistentEntity) null) - .setQuery(query.getQuery()); - if (query.getFilter() != null) { - request.setPostFilter(query.getFilter()); - } - SearchResponse response = getSearchResponse(request); + public List queryForIds(Query query, Class clazz, IndexCoordinates index) { + SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); + SearchResponse response = getSearchResponse(searchRequestBuilder); return extractIds(response); } @Override - public Page queryForPage(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - SearchRequestBuilder searchRequestBuilder = prepareSearch(criteriaQuery, clazz); - - if (elasticsearchQuery != null) { - searchRequestBuilder.setQuery(elasticsearchQuery); - } else { - searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); - } - - if (criteriaQuery.isLimiting()) { - searchRequestBuilder.setSize(criteriaQuery.getMaxResults()); - } - - if (criteriaQuery.getMinScore() > 0) { - searchRequestBuilder.setMinScore(criteriaQuery.getMinScore()); - } - - if (elasticsearchFilter != null) - searchRequestBuilder.setPostFilter(elasticsearchFilter); - + public AggregatedPage queryForPage(Query query, Class clazz, IndexCoordinates index) { + SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); SearchResponse response = getSearchResponse(searchRequestBuilder); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, criteriaQuery.getPageable()); - } - - @Override - public Page queryForPage(StringQuery query, Class clazz) { - SearchResponse response = getSearchResponse(prepareSearch(query, clazz).setQuery(wrapperQuery(query.getSource()))); return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, query.getPageable()); } @Override - public CloseableIterator stream(CriteriaQuery query, Class clazz) { + public CloseableIterator stream(Query query, Class clazz, IndexCoordinates index) { long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis(); - return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz), clazz); - } - - @Override - public CloseableIterator stream(NativeSearchQuery query, Class clazz) { - long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis(); - return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz), clazz); + return doStream(scrollTimeInMillis, startScroll(scrollTimeInMillis, query, clazz, index), clazz); } private CloseableIterator doStream(long scrollTimeInMillis, ScrolledPage page, Class clazz) { @@ -422,119 +228,26 @@ private CloseableIterator doStream(long scrollTimeInMillis, ScrolledPage< } @Override - public long count(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - - if (elasticsearchFilter == null) { - return doCount(prepareCount(criteriaQuery, clazz), elasticsearchQuery); - } else { - // filter could not be set into CountRequestBuilder, convert request into search request - return doCount(prepareSearch(criteriaQuery, clazz), elasticsearchQuery, elasticsearchFilter); - } - } - - @Override - public long count(NativeSearchQuery searchQuery, Class clazz) { - QueryBuilder elasticsearchQuery = searchQuery.getQuery(); - QueryBuilder elasticsearchFilter = searchQuery.getFilter(); - - if (elasticsearchFilter == null) { - return doCount(prepareCount(searchQuery, clazz), elasticsearchQuery); - } else { - // filter could not be set into CountRequestBuilder, convert request into search request - return doCount(prepareSearch(searchQuery, clazz), elasticsearchQuery, elasticsearchFilter); - } - } - - @Override - public long count(CriteriaQuery query) { - return count(query, null); - } - - @Override - public long count(NativeSearchQuery query) { - return count(query, null); - } - - private long doCount(SearchRequestBuilder countRequestBuilder, QueryBuilder elasticsearchQuery) { + public long count(Query query, @Nullable Class clazz, IndexCoordinates index) { + Assert.notNull(index, "index must not be null"); + SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); + searchRequestBuilder.setSize(0); - if (elasticsearchQuery != null) { - countRequestBuilder.setQuery(elasticsearchQuery); - } - return SearchHitsUtil.getTotalCount(countRequestBuilder.execute().actionGet().getHits()); - } - - private long doCount(SearchRequestBuilder searchRequestBuilder, QueryBuilder elasticsearchQuery, - QueryBuilder elasticsearchFilter) { - if (elasticsearchQuery != null) { - searchRequestBuilder.setQuery(elasticsearchQuery); - } else { - searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); - } - if (elasticsearchFilter != null) { - searchRequestBuilder.setPostFilter(elasticsearchFilter); - } - return SearchHitsUtil.getTotalCount(searchRequestBuilder.execute().actionGet().getHits()); - } - - private SearchRequestBuilder prepareCount(Query query, Class clazz) { - String indexName[] = !isEmpty(query.getIndices()) - ? query.getIndices().toArray(new String[query.getIndices().size()]) - : retrieveIndexNameFromPersistentEntity(clazz); - String types[] = !isEmpty(query.getTypes()) ? query.getTypes().toArray(new String[query.getTypes().size()]) - : retrieveTypeFromPersistentEntity(clazz); - - Assert.notNull(indexName, "No index defined for Query"); - - SearchRequestBuilder countRequestBuilder = client.prepareSearch(indexName); - - if (types != null) { - countRequestBuilder.setTypes(types); - } - countRequestBuilder.setSize(0); - return countRequestBuilder; + return SearchHitsUtil.getTotalCount(getSearchResponse(searchRequestBuilder).getHits()); } @Override - public List multiGet(NativeSearchQuery searchQuery, Class clazz) { - return elasticsearchConverter.mapDocuments(DocumentAdapters.from(getMultiResponse(searchQuery, clazz)), clazz); - } - - private MultiGetResponse getMultiResponse(Query searchQuery, Class clazz) { - - String indexName = !isEmpty(searchQuery.getIndices()) ? searchQuery.getIndices().get(0) - : getPersistentEntityFor(clazz).getIndexName(); - String type = !isEmpty(searchQuery.getTypes()) ? searchQuery.getTypes().get(0) - : getPersistentEntityFor(clazz).getIndexType(); - - Assert.notNull(indexName, "No index defined for Query"); - Assert.notNull(type, "No type define for Query"); - Assert.notEmpty(searchQuery.getIds(), "No Id define for Query"); - - MultiGetRequestBuilder builder = client.prepareMultiGet(); - - if (searchQuery.getFields() != null && !searchQuery.getFields().isEmpty()) { - searchQuery.addSourceFilter(new FetchSourceFilter(toArray(searchQuery.getFields()), null)); - } - - for (String id : searchQuery.getIds()) { - - MultiGetRequest.Item item = new MultiGetRequest.Item(indexName, type, id); - - if (searchQuery.getRoute() != null) { - item = item.routing(searchQuery.getRoute()); - } - - builder.add(item); - } - return builder.execute().actionGet(); + public List multiGet(Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(index, "index must not be null"); + Assert.notEmpty(query.getIds(), "No Id define for Query"); + MultiGetRequestBuilder builder = requestFactory.multiGetRequestBuilder(client, query, index); + return elasticsearchConverter.mapDocuments(DocumentAdapters.from(builder.execute().actionGet()), clazz); } @Override - public String index(IndexQuery query) { - String documentId = prepareIndex(query).execute().actionGet().getId(); + public String index(IndexQuery query, IndexCoordinates index) { + IndexRequestBuilder indexRequestBuilder = requestFactory.indexRequestBuilder(client, query, index); + String documentId = indexRequestBuilder.execute().actionGet().getId(); // We should call this because we are not going through a mapper. if (query.getObject() != null) { setPersistentEntityId(query.getObject(), documentId); @@ -543,118 +256,30 @@ public String index(IndexQuery query) { } @Override - public UpdateResponse update(UpdateQuery query) { - return this.prepareUpdate(query).execute().actionGet(); - } - - private UpdateRequestBuilder prepareUpdate(UpdateQuery query) { - - String indexName = !StringUtils.isEmpty(query.getIndexName()) ? query.getIndexName() - : getPersistentEntityFor(query.getClazz()).getIndexName(); - String type = !StringUtils.isEmpty(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.getUpdateRequest(), "No UpdateRequest define for Query"); - - UpdateRequest queryUpdateRequest = query.getUpdateRequest(); - - UpdateRequestBuilder updateRequestBuilder = client.prepareUpdate(indexName, type, query.getId()) // - .setRouting(queryUpdateRequest.routing()) // - .setRetryOnConflict(queryUpdateRequest.retryOnConflict()) // - .setTimeout(queryUpdateRequest.timeout()) // - .setWaitForActiveShards(queryUpdateRequest.waitForActiveShards()) // - .setRefreshPolicy(queryUpdateRequest.getRefreshPolicy()) // - .setWaitForActiveShards(queryUpdateRequest.waitForActiveShards()) // - .setScriptedUpsert(queryUpdateRequest.scriptedUpsert()) // - .setDocAsUpsert(queryUpdateRequest.docAsUpsert()); - - if (query.DoUpsert()) { - updateRequestBuilder.setDocAsUpsert(true); - } - if (queryUpdateRequest.script() != null) { - updateRequestBuilder.setScript(queryUpdateRequest.script()); - } - if (queryUpdateRequest.doc() != null) { - updateRequestBuilder.setDoc(queryUpdateRequest.doc()); - } - if (queryUpdateRequest.upsertRequest() != null) { - updateRequestBuilder.setUpsert(queryUpdateRequest.upsertRequest()); - } - - return updateRequestBuilder; + public UpdateResponse update(UpdateQuery query, IndexCoordinates index) { + UpdateRequestBuilder updateRequestBuilder = requestFactory.updateRequestBuilderFor(client, query, index); + return updateRequestBuilder.execute().actionGet(); } @Override - public void bulkIndex(List queries, BulkOptions bulkOptions) { - + public void bulkIndex(List queries, BulkOptions bulkOptions, IndexCoordinates index) { Assert.notNull(queries, "List of IndexQuery must not be null"); Assert.notNull(bulkOptions, "BulkOptions must not be null"); - BulkRequestBuilder bulkRequest = client.prepareBulk(); - setBulkOptions(bulkRequest, bulkOptions); - for (IndexQuery query : queries) { - bulkRequest.add(prepareIndex(query)); - } - checkForBulkUpdateFailure(bulkRequest.execute().actionGet()); + doBulkOperation(queries, bulkOptions, index); } @Override - public void bulkUpdate(List queries, BulkOptions bulkOptions) { - + public void bulkUpdate(List queries, BulkOptions bulkOptions, IndexCoordinates index) { Assert.notNull(queries, "List of UpdateQuery must not be null"); Assert.notNull(bulkOptions, "BulkOptions must not be null"); - BulkRequestBuilder bulkRequest = client.prepareBulk(); - setBulkOptions(bulkRequest, bulkOptions); - for (UpdateQuery query : queries) { - bulkRequest.add(prepareUpdate(query)); - } - checkForBulkUpdateFailure(bulkRequest.execute().actionGet()); - } - - private static void setBulkOptions(BulkRequestBuilder bulkRequest, BulkOptions bulkOptions) { - - if (bulkOptions.getTimeout() != null) { - bulkRequest.setTimeout(bulkOptions.getTimeout()); - } - - if (bulkOptions.getRefreshPolicy() != null) { - bulkRequest.setRefreshPolicy(bulkOptions.getRefreshPolicy()); - } - - if (bulkOptions.getWaitForActiveShards() != null) { - bulkRequest.setWaitForActiveShards(bulkOptions.getWaitForActiveShards()); - } - - if (bulkOptions.getPipeline() != null) { - bulkRequest.pipeline(bulkOptions.getPipeline()); - } - - if (bulkOptions.getRoutingId() != null) { - bulkRequest.routing(bulkOptions.getRoutingId()); - } - } - - private void checkForBulkUpdateFailure(BulkResponse bulkResponse) { - if (bulkResponse.hasFailures()) { - Map failedDocuments = new HashMap<>(); - for (BulkItemResponse item : bulkResponse.getItems()) { - if (item.isFailed()) - failedDocuments.put(item.getId(), item.getFailureMessage()); - } - throw new ElasticsearchException( - "Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages [" - + failedDocuments + "]", - failedDocuments); - } + doBulkOperation(queries, bulkOptions, index); } - @Override - public boolean indexExists(Class clazz) { - return indexExists(getPersistentEntityFor(clazz).getIndexName()); + private void doBulkOperation(List queries, BulkOptions bulkOptions, IndexCoordinates index) { + BulkRequestBuilder bulkRequest = requestFactory.bulkRequestBuilder(client, queries, bulkOptions, index); + checkForBulkOperationFailure(bulkRequest.execute().actionGet()); } @Override @@ -662,17 +287,6 @@ public boolean indexExists(String indexName) { return client.admin().indices().exists(indicesExistsRequest(indexName)).actionGet().isExists(); } - @Override - public boolean typeExists(String index, String type) { - return client.admin().cluster().prepareState().execute().actionGet().getState().metaData().index(index) - .getMappings().containsKey(type); - } - - @Override - public boolean deleteIndex(Class clazz) { - return deleteIndex(getPersistentEntityFor(clazz).getIndexName()); - } - @Override public boolean deleteIndex(String indexName) { Assert.notNull(indexName, "No index defined for delete operation"); @@ -683,162 +297,27 @@ public boolean deleteIndex(String indexName) { } @Override - public String delete(String indexName, String type, String id) { - return client.prepareDelete(indexName, type, id).execute().actionGet().getId(); - } - - @Override - public String delete(Class clazz, String id) { - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - return delete(persistentEntity.getIndexName(), persistentEntity.getIndexType(), id); + public String delete(String id, IndexCoordinates index) { + return client.prepareDelete(index.getIndexName(), index.getTypeName(), id).execute().actionGet().getId(); } @Override - public void delete(DeleteQuery deleteQuery, Class clazz) { - - String indexName = !StringUtils.isEmpty(deleteQuery.getIndex()) ? deleteQuery.getIndex() - : getPersistentEntityFor(clazz).getIndexName(); - String typeName = !StringUtils.isEmpty(deleteQuery.getType()) ? deleteQuery.getType() - : getPersistentEntityFor(clazz).getIndexType(); - - DeleteByQueryRequestBuilder requestBuilder = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) // - .source(indexName) // - .filter(deleteQuery.getQuery()) // - .abortOnVersionConflict(false) // - .refresh(true); - - SearchRequestBuilder source = requestBuilder.source() // - .setTypes(typeName); - - if (deleteQuery.getScrollTimeInMillis() != null) - source.setScroll(TimeValue.timeValueMillis(deleteQuery.getScrollTimeInMillis())); - - requestBuilder.get(); + public void delete(DeleteQuery deleteQuery, IndexCoordinates index) { + requestFactory.deleteByQueryRequestBuilder(client, deleteQuery, index).get(); } @Override - public void delete(DeleteQuery deleteQuery) { - Assert.notNull(deleteQuery.getIndex(), "No index defined for Query"); - Assert.notNull(deleteQuery.getType(), "No type define for Query"); - delete(deleteQuery, null); - } - - @Override - public void delete(CriteriaQuery criteriaQuery, Class clazz) { - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - Assert.notNull(elasticsearchQuery, "Query can not be null."); - DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(elasticsearchQuery); - delete(deleteQuery, clazz); - } - - private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis, Class clazz) { - setPersistentEntityIndexAndType(query, clazz); - return prepareScroll(query, scrollTimeInMillis, getPersistentEntity(clazz)); - } - - private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis, - @Nullable ElasticsearchPersistentEntity entity) { - SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(query.getIndices())) - .setTypes(toArray(query.getTypes())).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).setFrom(0) - .setVersion(true); - - if (query.getPageable().isPaged()) { - requestBuilder.setSize(query.getPageable().getPageSize()); - } - - if (query.getSourceFilter() != null) { - SourceFilter sourceFilter = query.getSourceFilter(); - requestBuilder.setFetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); - } - - if (!isEmpty(query.getFields())) { - requestBuilder.setFetchSource(toArray(query.getFields()), null); - } - - if (query.getSort() != null) { - prepareSort(query, requestBuilder, entity); - } - - if (query.getIndicesOptions() != null) { - requestBuilder.setIndicesOptions(query.getIndicesOptions()); - } - - if (query instanceof NativeSearchQuery) { - NativeSearchQuery searchQuery = (NativeSearchQuery) query; - - if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) { - HighlightBuilder highlightBuilder = searchQuery.getHighlightBuilder(); - if (highlightBuilder == null) { - highlightBuilder = new HighlightBuilder(); - } - if (searchQuery.getHighlightFields() != null) { - for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { - highlightBuilder.field(highlightField); - } - } - requestBuilder.highlighter(highlightBuilder); - } - } - - return requestBuilder; - } - - private SearchResponse doScroll(SearchRequestBuilder requestBuilder, CriteriaQuery criteriaQuery) { - Assert.notNull(criteriaQuery.getIndices(), "No index defined for Query"); - Assert.notNull(criteriaQuery.getTypes(), "No type define for Query"); - Assert.notNull(criteriaQuery.getPageable(), "Query.pageable is required for scan & scroll"); - - QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); - QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor() - .createFilterFromCriteria(criteriaQuery.getCriteria()); - - if (elasticsearchQuery != null) { - requestBuilder.setQuery(elasticsearchQuery); - } else { - requestBuilder.setQuery(QueryBuilders.matchAllQuery()); - } - - if (elasticsearchFilter != null) { - requestBuilder.setPostFilter(elasticsearchFilter); - } - - return getSearchResponse(requestBuilder); - } - - private SearchResponse doScroll(SearchRequestBuilder requestBuilder, NativeSearchQuery searchQuery) { - Assert.notNull(searchQuery.getIndices(), "No index defined for Query"); - Assert.notNull(searchQuery.getTypes(), "No type define for Query"); - Assert.notNull(searchQuery.getPageable(), "Query.pageable is required for scan & scroll"); - - if (searchQuery.getFilter() != null) { - requestBuilder.setPostFilter(searchQuery.getFilter()); - } - - if (!isEmpty(searchQuery.getElasticsearchSorts())) { - for (SortBuilder sort : searchQuery.getElasticsearchSorts()) { - requestBuilder.addSort(sort); - } - } - - return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery())); - } - - @Override - public ScrolledPage startScroll(long scrollTimeInMillis, NativeSearchQuery searchQuery, Class clazz) { - SearchResponse response = doScroll(prepareScroll(searchQuery, scrollTimeInMillis, clazz), searchQuery); - return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, null); - } - - @Override - public ScrolledPage startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz) { - SearchResponse response = doScroll(prepareScroll(criteriaQuery, scrollTimeInMillis, clazz), criteriaQuery); + public ScrolledPage startScroll(long scrollTimeInMillis, Query query, Class clazz, IndexCoordinates index) { + Assert.notNull(query.getPageable(), "Query.pageable is required for scan & scroll"); + SearchRequestBuilder searchRequestBuilder = requestFactory.searchRequestBuilder(client, query, clazz, index); + searchRequestBuilder.setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)); + SearchResponse response = getSearchResponse(searchRequestBuilder); return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, null); } @Override public ScrolledPage continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz) { - SearchResponse response = getSearchResponse( + SearchResponse response = getSearchResponseWithTimeout( client.prepareSearchScroll(scrollId).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute()); return elasticsearchConverter.mapResults(SearchDocumentResponse.from(response), clazz, Pageable.unpaged()); } @@ -848,172 +327,18 @@ public void clearScroll(String scrollId) { client.prepareClearScroll().addScrollId(scrollId).execute().actionGet(); } - @Override - public Page moreLikeThis(MoreLikeThisQuery query, Class clazz) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz); - String indexName = !StringUtils.isEmpty(query.getIndexName()) ? query.getIndexName() - : persistentEntity.getIndexName(); - String type = !StringUtils.isEmpty(query.getType()) ? query.getType() : persistentEntity.getIndexType(); - - Assert.notNull(indexName, "No 'indexName' defined for MoreLikeThisQuery"); - Assert.notNull(type, "No 'type' defined for MoreLikeThisQuery"); - Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery"); - - MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = moreLikeThisQuery( - toArray(new MoreLikeThisQueryBuilder.Item(indexName, type, query.getId()))); - - if (query.getMinTermFreq() != null) { - moreLikeThisQueryBuilder.minTermFreq(query.getMinTermFreq()); - } - if (query.getMaxQueryTerms() != null) { - moreLikeThisQueryBuilder.maxQueryTerms(query.getMaxQueryTerms()); - } - if (!isEmpty(query.getStopWords())) { - moreLikeThisQueryBuilder.stopWords(toArray(query.getStopWords())); - } - if (query.getMinDocFreq() != null) { - moreLikeThisQueryBuilder.minDocFreq(query.getMinDocFreq()); - } - if (query.getMaxDocFreq() != null) { - moreLikeThisQueryBuilder.maxDocFreq(query.getMaxDocFreq()); - } - if (query.getMinWordLen() != null) { - moreLikeThisQueryBuilder.minWordLength(query.getMinWordLen()); - } - if (query.getMaxWordLen() != null) { - moreLikeThisQueryBuilder.maxWordLength(query.getMaxWordLen()); - } - if (query.getBoostTerms() != null) { - moreLikeThisQueryBuilder.boostTerms(query.getBoostTerms()); - } - - return queryForPage(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz); - } - - private SearchResponse doSearch(SearchRequestBuilder searchRequest, NativeSearchQuery searchQuery) { - SearchRequestBuilder requestBuilder = prepareSearch(searchRequest, searchQuery); - return getSearchResponse(requestBuilder); - } - - private SearchRequestBuilder prepareSearch(SearchRequestBuilder searchRequest, NativeSearchQuery searchQuery) { - if (searchQuery.getFilter() != null) { - searchRequest.setPostFilter(searchQuery.getFilter()); - } - - if (!isEmpty(searchQuery.getElasticsearchSorts())) { - for (SortBuilder sort : searchQuery.getElasticsearchSorts()) { - searchRequest.addSort(sort); - } - } - - if (!searchQuery.getScriptFields().isEmpty()) { - // _source should be return all the time - // searchRequest.addStoredField("_source"); - for (ScriptField scriptedField : searchQuery.getScriptFields()) { - searchRequest.addScriptField(scriptedField.fieldName(), scriptedField.script()); - } - } - - if (searchQuery.getCollapseBuilder() != null) { - searchRequest.setCollapse(searchQuery.getCollapseBuilder()); - } - - if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) { - HighlightBuilder highlightBuilder = searchQuery.getHighlightBuilder(); - if (highlightBuilder == null) { - highlightBuilder = new HighlightBuilder(); - } - if (searchQuery.getHighlightFields() != null) { - for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { - highlightBuilder.field(highlightField); - } - } - searchRequest.highlighter(highlightBuilder); - } - - if (!isEmpty(searchQuery.getIndicesBoost())) { - for (IndexBoost indexBoost : searchQuery.getIndicesBoost()) { - searchRequest.addIndexBoost(indexBoost.getIndexName(), indexBoost.getBoost()); - } - } - - if (!isEmpty(searchQuery.getAggregations())) { - for (AbstractAggregationBuilder aggregationBuilder : searchQuery.getAggregations()) { - searchRequest.addAggregation(aggregationBuilder); - } - } - - if (!isEmpty(searchQuery.getFacets())) { - for (FacetRequest aggregatedFacet : searchQuery.getFacets()) { - searchRequest.addAggregation(aggregatedFacet.getFacet()); - } - } - - return searchRequest.setQuery(searchQuery.getQuery()); - } - private SearchResponse getSearchResponse(SearchRequestBuilder requestBuilder) { if (QUERY_LOGGER.isDebugEnabled()) { QUERY_LOGGER.debug(requestBuilder.toString()); } - - return getSearchResponse(requestBuilder.execute()); + return getSearchResponseWithTimeout(requestBuilder.execute()); } - private SearchResponse getSearchResponse(ActionFuture response) { + private SearchResponse getSearchResponseWithTimeout(ActionFuture response) { return searchTimeout == null ? response.actionGet() : response.actionGet(searchTimeout); } - private boolean createIndexIfNotCreated(Class clazz) { - return indexExists(getPersistentEntityFor(clazz).getIndexName()) || createIndexWithSettings(clazz); - } - - private boolean createIndexWithSettings(Class clazz) { - if (clazz.isAnnotationPresent(Setting.class)) { - String settingPath = clazz.getAnnotation(Setting.class).settingPath(); - if (!StringUtils.isEmpty(settingPath)) { - String settings = ResourceUtil.readFileFromClasspath(settingPath); - if (!StringUtils.isEmpty(settings)) { - return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); - } - } else { - LOGGER.info("settingPath in @Setting has to be defined. Using default instead."); - } - } - return createIndex(getPersistentEntityFor(clazz).getIndexName(), getDefaultSettings(getPersistentEntityFor(clazz))); - } - - @Override - public boolean createIndex(String indexName, Object settings) { - CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); - if (settings instanceof String) { - createIndexRequestBuilder.setSettings(String.valueOf(settings), Requests.INDEX_CONTENT_TYPE); - } else if (settings instanceof Map) { - createIndexRequestBuilder.setSettings((Map) settings); - } else if (settings instanceof XContentBuilder) { - createIndexRequestBuilder.setSettings((XContentBuilder) settings); - } - return createIndexRequestBuilder.execute().actionGet().isAcknowledged(); - } - - @Override - public boolean createIndex(Class clazz, Object settings) { - return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); - } - - private Map getDefaultSettings(ElasticsearchPersistentEntity persistentEntity) { - - if (persistentEntity.isUseServerConfiguration()) - return new HashMap<>(); - - return new MapBuilder().put("index.number_of_shards", String.valueOf(persistentEntity.getShards())) - .put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas())) - .put("index.refresh_interval", persistentEntity.getRefreshInterval()) - .put("index.store.type", persistentEntity.getIndexStoreType()).map(); - } - @Override public Map getSetting(Class clazz) { return getSetting(getPersistentEntityFor(clazz).getIndexName()); @@ -1027,130 +352,10 @@ public Map getSetting(String indexName) { return settings.keySet().stream().collect(Collectors.toMap((key) -> key, (key) -> settings.get(key))); } - private SearchRequestBuilder prepareSearch(Query query, Class clazz) { - setPersistentEntityIndexAndType(query, clazz); - return prepareSearch(query, getPersistentEntity(clazz)); - } - - private SearchRequestBuilder prepareSearch(Query query, @Nullable ElasticsearchPersistentEntity entity) { - Assert.notNull(query.getIndices(), "No index defined for Query"); - Assert.notNull(query.getTypes(), "No type defined for Query"); - - int startRecord = 0; - SearchRequestBuilder searchRequestBuilder = client.prepareSearch(toArray(query.getIndices())) - .setSearchType(query.getSearchType()).setTypes(toArray(query.getTypes())).setVersion(true) - .setTrackScores(query.getTrackScores()); - - if (query.getSourceFilter() != null) { - SourceFilter sourceFilter = query.getSourceFilter(); - searchRequestBuilder.setFetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); - } - - if (query.getPageable().isPaged()) { - startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); - searchRequestBuilder.setSize(query.getPageable().getPageSize()); - } - searchRequestBuilder.setFrom(startRecord); - - if (!query.getFields().isEmpty()) { - searchRequestBuilder.setFetchSource(toArray(query.getFields()), null); - } - - if (query.getIndicesOptions() != null) { - searchRequestBuilder.setIndicesOptions(query.getIndicesOptions()); - } - - if (query.getSort() != null) { - prepareSort(query, searchRequestBuilder, entity); - } - - if (query.getMinScore() > 0) { - searchRequestBuilder.setMinScore(query.getMinScore()); - } - - if (query.getPreference() != null) { - searchRequestBuilder.setPreference(query.getPreference()); - } - - return searchRequestBuilder; - } - - private void prepareSort(Query query, SearchRequestBuilder searchRequestBuilder, - @Nullable ElasticsearchPersistentEntity entity) { - for (Sort.Order order : query.getSort()) { - SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC; - - if (ScoreSortBuilder.NAME.equals(order.getProperty())) { - ScoreSortBuilder sort = SortBuilders // - .scoreSort() // - .order(sortOrder); - - searchRequestBuilder.addSort(sort); - } else { - ElasticsearchPersistentProperty property = entity != null // - ? entity.getPersistentProperty(order.getProperty()) // - : null; - String fieldName = property != null ? property.getFieldName() : order.getProperty(); - FieldSortBuilder sort = SortBuilders // - .fieldSort(fieldName) // - .order(sortOrder); - - if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) { - sort.missing("_first"); - } else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) { - sort.missing("_last"); - } - - searchRequestBuilder.addSort(sort); - } - } - } - - private IndexRequestBuilder prepareIndex(IndexQuery query) { - String indexName = StringUtils.isEmpty(query.getIndexName()) - ? retrieveIndexNameFromPersistentEntity(query.getObject().getClass())[0] - : query.getIndexName(); - String type = StringUtils.isEmpty(query.getType()) - ? retrieveTypeFromPersistentEntity(query.getObject().getClass())[0] - : query.getType(); - - IndexRequestBuilder indexRequestBuilder = null; - - if (query.getObject() != null) { - String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); - // If we have a query id and a document id, do not ask ES to generate one. - if (id != null) { - indexRequestBuilder = client.prepareIndex(indexName, type, id); - } else { - indexRequestBuilder = client.prepareIndex(indexName, type); - } - indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(), - Requests.INDEX_CONTENT_TYPE); - } else if (query.getSource() != null) { - indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(), - Requests.INDEX_CONTENT_TYPE); - } else { - throw new ElasticsearchException( - "object or source is null, failed to index the document [id: " + query.getId() + "]"); - } - if (query.getVersion() != null) { - indexRequestBuilder.setVersion(query.getVersion()); - VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); - indexRequestBuilder.setVersionType(versionType); - } - - return indexRequestBuilder; - } - - @Override - public void refresh(String indexName) { - Assert.notNull(indexName, "No index defined for refresh()"); - client.admin().indices().refresh(refreshRequest(indexName)).actionGet(); - } - @Override - public void refresh(Class clazz) { - refresh(getPersistentEntityFor(clazz).getIndexName()); + public void refresh(IndexCoordinates index) { + Assert.notNull(index, "No index defined for refresh()"); + client.admin().indices().refresh(refreshRequest(index.getIndexNames())).actionGet(); } @Override @@ -1159,72 +364,6 @@ public List queryForAlias(String indexName) { .get(indexName); } - @Nullable - private ElasticsearchPersistentEntity getPersistentEntity(@Nullable Class clazz) { - return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null; - } - - @Override - public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) { - Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName() - + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); - return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz); - } - - private String getPersistentEntityId(Object entity) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(entity.getClass()); - Object identifier = persistentEntity.getIdentifierAccessor(entity).getIdentifier(); - - if (identifier != null) { - return identifier.toString(); - } - - return null; - } - - private void setPersistentEntityId(Object entity, String id) { - - ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(entity.getClass()); - ElasticsearchPersistentProperty idProperty = persistentEntity.getIdProperty(); - - // Only deal with text because ES generated Ids are strings ! - - if (idProperty != null && idProperty.getType().isAssignableFrom(String.class)) { - persistentEntity.getPropertyAccessor(entity).setProperty(idProperty, id); - } - } - - private void setPersistentEntityIndexAndType(Query query, Class clazz) { - if (query.getIndices().isEmpty()) { - query.addIndices(retrieveIndexNameFromPersistentEntity(clazz)); - } - if (query.getTypes().isEmpty()) { - query.addTypes(retrieveTypeFromPersistentEntity(clazz)); - } - } - - private String[] retrieveIndexNameFromPersistentEntity(Class clazz) { - if (clazz != null) { - return new String[] { getPersistentEntityFor(clazz).getIndexName() }; - } - return null; - } - - private String[] retrieveTypeFromPersistentEntity(Class clazz) { - if (clazz != null) { - return new String[] { getPersistentEntityFor(clazz).getIndexType() }; - } - return null; - } - - private VersionType retrieveVersionTypeFromPersistentEntity(Class clazz) { - if (clazz != null) { - return getPersistentEntityFor(clazz).getVersionType(); - } - return VersionType.EXTERNAL; - } - private List extractIds(SearchResponse response) { List ids = new ArrayList<>(); for (SearchHit hit : response.getHits()) { @@ -1235,33 +374,8 @@ private List extractIds(SearchResponse response) { return ids; } - @Override - public void setApplicationContext(ApplicationContext context) throws BeansException { - if (elasticsearchConverter instanceof ApplicationContextAware) { - ((ApplicationContextAware) elasticsearchConverter).setApplicationContext(context); - } - } - - private static String[] toArray(List values) { - String[] valuesAsArray = new String[values.size()]; - return values.toArray(valuesAsArray); - } - - private static MoreLikeThisQueryBuilder.Item[] toArray(MoreLikeThisQueryBuilder.Item... values) { - return values; - } - - @Deprecated - public static String readFileFromClasspath(String url) { - return ResourceUtil.readFileFromClasspath(url); - } - - public SearchResponse suggest(SuggestBuilder suggestion, String... indices) { - return client.prepareSearch(indices).suggest(suggestion).get(); - } - - public SearchResponse suggest(SuggestBuilder suggestion, Class clazz) { - return suggest(suggestion, retrieveIndexNameFromPersistentEntity(clazz)); + public SearchResponse suggest(SuggestBuilder suggestion, IndexCoordinates index) { + return client.prepareSearch(index.getIndexNames()).suggest(suggestion).get(); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/EntityOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/EntityOperations.java index 2343ea266..f1aebbfc2 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/EntityOperations.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/EntityOperations.java @@ -16,7 +16,6 @@ package org.springframework.data.elasticsearch.core; import lombok.AccessLevel; -import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -38,13 +37,18 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Peter-Josef Meisch * @since 3.2 */ -@RequiredArgsConstructor class EntityOperations { private static final String ID_FIELD = "id"; + public EntityOperations( + @NonNull MappingContext, ElasticsearchPersistentProperty> context) { + this.context = context; + } + private final @NonNull MappingContext, ElasticsearchPersistentProperty> context; /** @@ -116,7 +120,7 @@ IndexCoordinates determineIndex(Entity entity, @Nullable String index, @Nulla */ IndexCoordinates determineIndex(ElasticsearchPersistentEntity persistentEntity, @Nullable String index, @Nullable String type) { - return new IndexCoordinates(indexName(persistentEntity, index), typeName(persistentEntity, type)); + return IndexCoordinates.of(indexName(persistentEntity, index)).withTypes(typeName(persistentEntity, type)); } private static String indexName(@Nullable ElasticsearchPersistentEntity entity, @Nullable String index) { @@ -615,14 +619,4 @@ public T incrementVersion() { } } - /** - * Value object encapsulating index name and index type. - */ - @RequiredArgsConstructor(access = AccessLevel.PROTECTED) - @Getter - static class IndexCoordinates { - - private final String indexName; - private final String typeName; - } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/EsClient.java b/src/main/java/org/springframework/data/elasticsearch/core/EsClient.java deleted file mode 100644 index e29cb8525..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/EsClient.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2018-2019 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 - * - * https://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; - -/** - * EsClient interface. Specify what client an ElasticSearchTemplate will return from getClient(). - * - * @author Don Wellington - * @param - */ -public interface EsClient { - C getClient(); -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPage.java b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPage.java deleted file mode 100644 index c60cd3b3d..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPage.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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; - -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.elasticsearch.core.facet.FacetResult; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public interface FacetedPage extends Page { - - boolean hasFacets(); - - List getFacets(); - - FacetResult getFacet(String name); -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java deleted file mode 100644 index bd47f5df7..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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; - -import static java.util.Optional.*; - -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.elasticsearch.search.aggregations.Aggregation; -import org.elasticsearch.search.aggregations.Aggregations; -import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; -import org.elasticsearch.search.aggregations.bucket.range.Range; -import org.elasticsearch.search.aggregations.bucket.terms.Terms; -import org.elasticsearch.search.aggregations.metrics.ExtendedStats; -import org.elasticsearch.search.aggregations.metrics.Sum; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; -import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; -import org.springframework.data.elasticsearch.core.facet.FacetResult; -import org.springframework.data.elasticsearch.core.facet.request.RangeFacetRequest; -import org.springframework.data.elasticsearch.core.facet.result.HistogramResult; -import org.springframework.data.elasticsearch.core.facet.result.IntervalUnit; -import org.springframework.data.elasticsearch.core.facet.result.RangeResult; -import org.springframework.data.elasticsearch.core.facet.result.StatisticalResult; -import org.springframework.data.elasticsearch.core.facet.result.Term; -import org.springframework.data.elasticsearch.core.facet.result.TermResult; - -/** - * Container for query result and facet results - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - * @author Philipp Kräutli - * @author Remco Zigterman - * @author Peter-Josef Meisch - */ -@Deprecated -public abstract class FacetedPageImpl extends PageImpl implements FacetedPage, AggregatedPage { - - private List facets; - private Map mapOfFacets = new HashMap<>(); - - public FacetedPageImpl(List content) { - super(content); - } - - public FacetedPageImpl(List content, Pageable pageable, long total) { - super(content, ofNullable(pageable).orElse(Pageable.unpaged()), total); - } - - @Override - public boolean hasFacets() { - processAggregations(); - return facets != null && facets.size() > 0; - } - - @Override - public List getFacets() { - processAggregations(); - return facets; - } - - @Override - public FacetResult getFacet(String name) { - processAggregations(); - return mapOfFacets.get(name); - } - - private void addFacet(FacetResult facetResult) { - facets.add(facetResult); - mapOfFacets.put(facetResult.getName(), facetResult); - } - - /** - * Lazy conversion from aggregation to old facets - */ - private void processAggregations() { - if (facets != null) { - return; - } - facets = new ArrayList<>(); - Aggregations aggregations = getAggregations(); - if (aggregations == null) { - return; - } - for (Aggregation agg : aggregations) { - processAggregation(agg); - } - } - - private void processAggregation(Aggregation agg) { - if (agg instanceof Terms) { - processTermAggregation((Terms) agg); - } - if (agg instanceof Range) { - processRangeAggregation((Range) agg); - } - if (agg instanceof ExtendedStats) { - processExtendedStatsAggregation((ExtendedStats) agg); - } - if (agg instanceof Histogram) { - processHistogramAggregation((Histogram) agg); - } - } - - private void processTermAggregation(Terms agg) { - List terms = new ArrayList<>(); - for (Terms.Bucket t : agg.getBuckets()) { - terms.add(new Term(t.getKeyAsString(), t.getDocCount())); - } - addFacet(new TermResult(agg.getName(), terms, terms.size(), agg.getSumOfOtherDocCounts(), 0)); - } - - private void processRangeAggregation(Range agg) { - List buckets = ((Range) agg).getBuckets(); - List ranges = new ArrayList<>(); - for (Range.Bucket b : buckets) { - ExtendedStats rStats = b.getAggregations().get(AbstractFacetRequest.INTERNAL_STATS); - if (rStats != null) { - Sum sum = b.getAggregations().get(RangeFacetRequest.RANGE_INTERNAL_SUM); - ranges.add(new org.springframework.data.elasticsearch.core.facet.result.Range((Double) b.getFrom(), - (Double) b.getTo(), b.getDocCount(), sum != null ? sum.getValue() : rStats.getSum(), rStats.getCount(), - rStats.getMin(), rStats.getMax())); - } else { - ranges.add(new org.springframework.data.elasticsearch.core.facet.result.Range((Double) b.getFrom(), - (Double) b.getTo(), b.getDocCount(), 0, 0, 0, 0)); - } - } - addFacet(new RangeResult(agg.getName(), ranges)); - } - - private void processExtendedStatsAggregation(ExtendedStats agg) { - addFacet(new StatisticalResult(agg.getName(), agg.getCount(), agg.getMax(), agg.getMin(), agg.getAvg(), - agg.getStdDeviation(), agg.getSumOfSquares(), agg.getSum(), agg.getVariance())); - } - - private void processHistogramAggregation(Histogram agg) { - List intervals = new ArrayList<>(); - for (Histogram.Bucket h : agg.getBuckets()) { - ExtendedStats hStats = h.getAggregations().get(AbstractFacetRequest.INTERNAL_STATS); - if (hStats != null) { - intervals.add(new IntervalUnit(((ZonedDateTime) h.getKey()).toInstant().toEpochMilli(), h.getDocCount(), - h.getDocCount(), hStats.getSum(), hStats.getAvg(), hStats.getMin(), hStats.getMax())); - } else { - intervals.add(new IntervalUnit(((ZonedDateTime) h.getKey()).toInstant().toEpochMilli(), h.getDocCount(), - h.getDocCount(), 0, 0, 0, 0)); - } - } - addFacet(new HistogramResult(agg.getName(), intervals)); - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/IndexCoordinates.java b/src/main/java/org/springframework/data/elasticsearch/core/IndexCoordinates.java new file mode 100644 index 000000000..0cf73c76e --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/IndexCoordinates.java @@ -0,0 +1,84 @@ +/* + * Copyright 2019 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 + * + * https://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; + +import java.util.Arrays; + +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + +/** + * Immutable Value object encapsulating index name(s) and index type(s). Type names are supported but deprecated as + * Elasticsearch does not support types anymore. + * + * @author Mark Paluch + * @author Christoph Strobl + * @author Peter-Josef Meisch + * @since 4.0 + */ +public class IndexCoordinates { + + private final String[] indexNames; + private final String[] typeNames; + + public static IndexCoordinates of(String... indexNames) { + Assert.notNull(indexNames, "indexNames must not be null"); + return new IndexCoordinates(indexNames, null); + } + + private IndexCoordinates(String[] indexNames, @Nullable String[] typeNames) { + Assert.notEmpty(indexNames, "indexNames may not be null or empty"); + this.indexNames = indexNames; + this.typeNames = typeNames != null ? typeNames : new String[] {}; + } + + /** + * Using Index types is deprecated in Elasticsearch. + * + * @param typeNames + * @return + */ + @Deprecated + public IndexCoordinates withTypes(String... typeNames) { + Assert.notEmpty(typeNames, "typeNames must not be null"); + return new IndexCoordinates(this.indexNames, typeNames); + } + + public String getIndexName() { + return indexNames[0]; + } + + public String[] getIndexNames() { + return Arrays.copyOf(indexNames, indexNames.length); + } + + @Deprecated + @Nullable + public String getTypeName() { + return typeNames.length > 0 ? typeNames[0] : null; + } + + @Deprecated + public String[] getTypeNames() { + return Arrays.copyOf(typeNames, typeNames.length); + } + + @Override + public String toString() { + return "IndexCoordinates{" + "indexNames=" + Arrays.toString(indexNames) + ", typeNames=" + + Arrays.toString(typeNames) + '}'; + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java index 47e1137af..f837f014f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplate.java @@ -56,7 +56,6 @@ import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient; import org.springframework.data.elasticsearch.core.EntityOperations.AdaptibleEntity; import org.springframework.data.elasticsearch.core.EntityOperations.Entity; -import org.springframework.data.elasticsearch.core.EntityOperations.IndexCoordinates; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.document.DocumentAdapters; @@ -346,6 +345,7 @@ private SearchRequest buildSearchRequest(Query query, ElasticsearchPersistentEnt searchSourceBuilder.size(pageable.getPageSize()); request.source(searchSourceBuilder); + request.source(searchSourceBuilder); } else if (query.isLimiting()) { searchSourceBuilder.from(0); searchSourceBuilder.size(query.getMaxResults()); @@ -356,10 +356,6 @@ private SearchRequest buildSearchRequest(Query query, ElasticsearchPersistentEnt } return request; } - /* - * (non-Javadoc) - * @see org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations#count(Query, Class, String, String) - */ /* * (non-Javadoc) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java new file mode 100644 index 000000000..00e94d0a1 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java @@ -0,0 +1,855 @@ +/* + * Copyright 2019 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 + * + * https://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; + +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.springframework.util.CollectionUtils.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetRequestBuilder; +import org.elasticsearch.action.get.MultiGetRequest; +import org.elasticsearch.action.get.MultiGetRequestBuilder; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.action.update.UpdateRequestBuilder; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.Requests; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.VersionType; +import org.elasticsearch.index.query.MoreLikeThisQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.reindex.DeleteByQueryAction; +import org.elasticsearch.index.reindex.DeleteByQueryRequest; +import org.elasticsearch.index.reindex.DeleteByQueryRequestBuilder; +import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.fetch.subphase.FetchSourceContext; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.ScoreSortBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.ElasticsearchException; +import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; +import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; +import org.springframework.data.elasticsearch.core.query.*; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Factory class to create Elasticsearch request instances from Spring Data Elasticsearch query objects. + * + * @author Peter-Josef Meisch + * @since 4.0 + */ +class RequestFactory { + private final ElasticsearchConverter elasticsearchConverter; + + public RequestFactory(ElasticsearchConverter elasticsearchConverter) { + this.elasticsearchConverter = elasticsearchConverter; + } + + public IndicesAliasesRequest.AliasActions aliasAction(AliasQuery query, IndexCoordinates index) { + Assert.notNull(index, "No index defined for Alias"); + Assert.notNull(query.getAliasName(), "No alias defined"); + IndicesAliasesRequest.AliasActions aliasAction = IndicesAliasesRequest.AliasActions.add() + .alias(query.getAliasName()).index(index.getIndexName()); + + if (query.getFilterBuilder() != null) { + aliasAction.filter(query.getFilterBuilder()); + } else if (query.getFilter() != null) { + aliasAction.filter(query.getFilter()); + } else if (!StringUtils.isEmpty(query.getRouting())) { + aliasAction.routing(query.getRouting()); + } else if (!StringUtils.isEmpty(query.getSearchRouting())) { + aliasAction.searchRouting(query.getSearchRouting()); + } else if (!StringUtils.isEmpty(query.getIndexRouting())) { + aliasAction.indexRouting(query.getIndexRouting()); + } + return aliasAction; + } + + public BulkRequest bulkRequest(List queries, BulkOptions bulkOptions, IndexCoordinates index) { + BulkRequest bulkRequest = new BulkRequest(); + + if (bulkOptions.getTimeout() != null) { + bulkRequest.timeout(bulkOptions.getTimeout()); + } + + if (bulkOptions.getRefreshPolicy() != null) { + bulkRequest.setRefreshPolicy(bulkOptions.getRefreshPolicy()); + } + + if (bulkOptions.getWaitForActiveShards() != null) { + bulkRequest.waitForActiveShards(bulkOptions.getWaitForActiveShards()); + } + + if (bulkOptions.getPipeline() != null) { + bulkRequest.pipeline(bulkOptions.getPipeline()); + } + + if (bulkOptions.getRoutingId() != null) { + bulkRequest.routing(bulkOptions.getRoutingId()); + } + + queries.forEach(query -> { + + if (query instanceof IndexQuery) { + bulkRequest.add(indexRequest((IndexQuery) query, index)); + } else if (query instanceof UpdateQuery) { + bulkRequest.add(updateRequest((UpdateQuery) query, index)); + } + }); + return bulkRequest; + } + + public BulkRequestBuilder bulkRequestBuilder(Client client, List queries, BulkOptions bulkOptions, + IndexCoordinates index) { + BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); + + if (bulkOptions.getTimeout() != null) { + bulkRequestBuilder.setTimeout(bulkOptions.getTimeout()); + } + + if (bulkOptions.getRefreshPolicy() != null) { + bulkRequestBuilder.setRefreshPolicy(bulkOptions.getRefreshPolicy()); + } + + if (bulkOptions.getWaitForActiveShards() != null) { + bulkRequestBuilder.setWaitForActiveShards(bulkOptions.getWaitForActiveShards()); + } + + if (bulkOptions.getPipeline() != null) { + bulkRequestBuilder.pipeline(bulkOptions.getPipeline()); + } + + if (bulkOptions.getRoutingId() != null) { + bulkRequestBuilder.routing(bulkOptions.getRoutingId()); + } + + queries.forEach(query -> { + + if (query instanceof IndexQuery) { + bulkRequestBuilder.add(indexRequestBuilder(client, (IndexQuery) query, index)); + } else if (query instanceof UpdateQuery) { + bulkRequestBuilder.add(updateRequestBuilderFor(client, (UpdateQuery) query, index)); + } + }); + + return bulkRequestBuilder; + } + + public CreateIndexRequest createIndexRequest(String indexName, Object settings) { + CreateIndexRequest request = new CreateIndexRequest(indexName); + if (settings instanceof String) { + request.settings(String.valueOf(settings), Requests.INDEX_CONTENT_TYPE); + } else if (settings instanceof Map) { + request.settings((Map) settings); + } else if (settings instanceof XContentBuilder) { + request.settings((XContentBuilder) settings); + } + return request; + } + + public CreateIndexRequestBuilder createIndexRequestBuilder(Client client, String indexName, Object settings) { + CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName); + if (settings instanceof String) { + createIndexRequestBuilder.setSettings(String.valueOf(settings), Requests.INDEX_CONTENT_TYPE); + } else if (settings instanceof Map) { + createIndexRequestBuilder.setSettings((Map) settings); + } else if (settings instanceof XContentBuilder) { + createIndexRequestBuilder.setSettings((XContentBuilder) settings); + } + return createIndexRequestBuilder; + } + + public DeleteByQueryRequest deleteByQueryRequest(DeleteQuery deleteQuery, IndexCoordinates index) { + DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(index.getIndexNames()) // + .setDocTypes(index.getTypeNames()) // + .setQuery(deleteQuery.getQuery()) // + .setAbortOnVersionConflict(false) // + .setRefresh(true); + + if (deleteQuery.getPageSize() != null) + deleteByQueryRequest.setBatchSize(deleteQuery.getPageSize()); + + if (deleteQuery.getScrollTimeInMillis() != null) + deleteByQueryRequest.setScroll(TimeValue.timeValueMillis(deleteQuery.getScrollTimeInMillis())); + + return deleteByQueryRequest; + } + + public DeleteByQueryRequestBuilder deleteByQueryRequestBuilder(Client client, DeleteQuery deleteQuery, + IndexCoordinates index) { + DeleteByQueryRequestBuilder requestBuilder = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) // + .source(index.getIndexNames()) // + .filter(deleteQuery.getQuery()) // + .abortOnVersionConflict(false) // + .refresh(true); + + SearchRequestBuilder source = requestBuilder.source() // + .setTypes(index.getTypeNames()); + + if (deleteQuery.getScrollTimeInMillis() != null) + source.setScroll(TimeValue.timeValueMillis(deleteQuery.getScrollTimeInMillis())); + + return requestBuilder; + } + + public GetRequest getRequest(GetQuery query, IndexCoordinates index) { + return new GetRequest(index.getIndexName(), index.getTypeName(), query.getId()); + } + + public GetRequestBuilder getRequestBuilder(Client client, GetQuery query, IndexCoordinates index) { + return client.prepareGet(index.getIndexName(), index.getTypeName(), query.getId()); + } + + public HighlightBuilder highlightBuilder(Query query) { + HighlightBuilder highlightBuilder = null; + if (query instanceof NativeSearchQuery) { + NativeSearchQuery searchQuery = (NativeSearchQuery) query; + + if (searchQuery.getHighlightFields() != null || searchQuery.getHighlightBuilder() != null) { + highlightBuilder = searchQuery.getHighlightBuilder(); + + if (highlightBuilder == null) { + highlightBuilder = new HighlightBuilder(); + } + + if (searchQuery.getHighlightFields() != null) { + for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) { + highlightBuilder.field(highlightField); + } + } + } + } + return highlightBuilder; + } + + public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) { + String indexName = index.getIndexName(); + String type = index.getTypeName(); + + IndexRequest indexRequest; + + if (query.getObject() != null) { + String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); + // If we have a query id and a document id, do not ask ES to generate one. + if (id != null) { + indexRequest = new IndexRequest(indexName, type, id); + } else { + indexRequest = new IndexRequest(indexName, type); + } + indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE); + } else if (query.getSource() != null) { + indexRequest = new IndexRequest(indexName, type, query.getId()).source(query.getSource(), + Requests.INDEX_CONTENT_TYPE); + } else { + throw new ElasticsearchException( + "object or source is null, failed to index the document [id: " + query.getId() + "]"); + } + if (query.getVersion() != null) { + indexRequest.version(query.getVersion()); + VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); + indexRequest.versionType(versionType); + } + + return indexRequest; + } + + public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query, IndexCoordinates index) { + String indexName = index.getIndexName(); + String type = index.getTypeName(); + + IndexRequestBuilder indexRequestBuilder; + + if (query.getObject() != null) { + String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); + // If we have a query id and a document id, do not ask ES to generate one. + if (id != null) { + indexRequestBuilder = client.prepareIndex(indexName, type, id); + } else { + indexRequestBuilder = client.prepareIndex(indexName, type); + } + indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(), + Requests.INDEX_CONTENT_TYPE); + } else if (query.getSource() != null) { + indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(), + Requests.INDEX_CONTENT_TYPE); + } else { + throw new ElasticsearchException( + "object or source is null, failed to index the document [id: " + query.getId() + "]"); + } + if (query.getVersion() != null) { + indexRequestBuilder.setVersion(query.getVersion()); + VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); + indexRequestBuilder.setVersionType(versionType); + } + + return indexRequestBuilder; + } + + public MoreLikeThisQueryBuilder moreLikeThisQueryBuilder(MoreLikeThisQuery query, IndexCoordinates index) { + MoreLikeThisQueryBuilder.Item item = new MoreLikeThisQueryBuilder.Item(index.getIndexName(), index.getTypeName(), + query.getId()); + + MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = QueryBuilders + .moreLikeThisQuery(new MoreLikeThisQueryBuilder.Item[] { item }); + + if (query.getMinTermFreq() != null) { + moreLikeThisQueryBuilder.minTermFreq(query.getMinTermFreq()); + } + + if (query.getMaxQueryTerms() != null) { + moreLikeThisQueryBuilder.maxQueryTerms(query.getMaxQueryTerms()); + } + + if (!isEmpty(query.getStopWords())) { + moreLikeThisQueryBuilder.stopWords(query.getStopWords()); + } + + if (query.getMinDocFreq() != null) { + moreLikeThisQueryBuilder.minDocFreq(query.getMinDocFreq()); + } + + if (query.getMaxDocFreq() != null) { + moreLikeThisQueryBuilder.maxDocFreq(query.getMaxDocFreq()); + } + + if (query.getMinWordLen() != null) { + moreLikeThisQueryBuilder.minWordLength(query.getMinWordLen()); + } + + if (query.getMaxWordLen() != null) { + moreLikeThisQueryBuilder.maxWordLength(query.getMaxWordLen()); + } + + if (query.getBoostTerms() != null) { + moreLikeThisQueryBuilder.boostTerms(query.getBoostTerms()); + } + return moreLikeThisQueryBuilder; + } + + public SearchRequest searchRequest(Query query, @Nullable Class clazz, IndexCoordinates index) { + + SearchRequest searchRequest = prepareSearchRequest(query, clazz, index); + QueryBuilder elasticsearchQuery = getQuery(query); + QueryBuilder elasticsearchFilter = getFilter(query); + + if (elasticsearchQuery != null) { + searchRequest.source().query(elasticsearchQuery); + } else { + searchRequest.source().query(QueryBuilders.matchAllQuery()); + } + + if (elasticsearchFilter != null) { + searchRequest.source().postFilter(elasticsearchFilter); + } + + return searchRequest; + + } + + public SearchRequestBuilder searchRequestBuilder(Client client, Query query, @Nullable Class clazz, + IndexCoordinates index) { + + SearchRequestBuilder searchRequestBuilder = prepareSearchRequestBuilder(query, client, clazz, index); + QueryBuilder elasticsearchQuery = getQuery(query); + QueryBuilder elasticsearchFilter = getFilter(query); + + if (elasticsearchQuery != null) { + searchRequestBuilder.setQuery(elasticsearchQuery); + } else { + searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); + } + + if (elasticsearchFilter != null) { + searchRequestBuilder.setPostFilter(elasticsearchFilter); + } + + return searchRequestBuilder; + } + + public UpdateRequest updateRequest(UpdateQuery query, IndexCoordinates index) { + + Assert.notNull(query.getId(), "No Id define for Query"); + Assert.notNull(query.getUpdateRequest(), "No UpdateRequest define for Query"); + + UpdateRequest queryUpdateRequest = query.getUpdateRequest(); + + UpdateRequest updateRequest = new UpdateRequest(index.getIndexName(), index.getTypeName(), query.getId()) // + .routing(queryUpdateRequest.routing()) // + .retryOnConflict(queryUpdateRequest.retryOnConflict()) // + .timeout(queryUpdateRequest.timeout()) // + .waitForActiveShards(queryUpdateRequest.waitForActiveShards()) // + .setRefreshPolicy(queryUpdateRequest.getRefreshPolicy()) // + .waitForActiveShards(queryUpdateRequest.waitForActiveShards()) // + .scriptedUpsert(queryUpdateRequest.scriptedUpsert()) // + .docAsUpsert(queryUpdateRequest.docAsUpsert()); + + if (query.DoUpsert()) { + updateRequest.docAsUpsert(true); + } + + if (queryUpdateRequest.script() != null) { + updateRequest.script(queryUpdateRequest.script()); + } + + if (queryUpdateRequest.doc() != null) { + updateRequest.doc(queryUpdateRequest.doc()); + } + + if (queryUpdateRequest.upsertRequest() != null) { + updateRequest.upsert(queryUpdateRequest.upsertRequest()); + } + + if (queryUpdateRequest.fetchSource() != null) { + updateRequest.fetchSource(queryUpdateRequest.fetchSource()); + } + + return updateRequest; + } + + public UpdateRequestBuilder updateRequestBuilderFor(Client client, UpdateQuery query, IndexCoordinates index) { + + Assert.notNull(query.getId(), "No Id define for Query"); + Assert.notNull(query.getUpdateRequest(), "No UpdateRequest define for Query"); + + UpdateRequest queryUpdateRequest = query.getUpdateRequest(); + + UpdateRequestBuilder updateRequestBuilder = client + .prepareUpdate(index.getIndexName(), index.getTypeName(), query.getId()) // + .setRouting(queryUpdateRequest.routing()) // + .setRetryOnConflict(queryUpdateRequest.retryOnConflict()) // + .setTimeout(queryUpdateRequest.timeout()) // + .setWaitForActiveShards(queryUpdateRequest.waitForActiveShards()) // + .setRefreshPolicy(queryUpdateRequest.getRefreshPolicy()) // + .setWaitForActiveShards(queryUpdateRequest.waitForActiveShards()) // + .setScriptedUpsert(queryUpdateRequest.scriptedUpsert()) // + .setDocAsUpsert(queryUpdateRequest.docAsUpsert()); + + if (query.DoUpsert()) { + updateRequestBuilder.setDocAsUpsert(true); + } + + if (queryUpdateRequest.script() != null) { + updateRequestBuilder.setScript(queryUpdateRequest.script()); + } + + if (queryUpdateRequest.doc() != null) { + updateRequestBuilder.setDoc(queryUpdateRequest.doc()); + } + + if (queryUpdateRequest.upsertRequest() != null) { + updateRequestBuilder.setUpsert(queryUpdateRequest.upsertRequest()); + } + + FetchSourceContext fetchSourceContext = queryUpdateRequest.fetchSource(); + if (fetchSourceContext != null) { + updateRequestBuilder.setFetchSource(fetchSourceContext.includes(), fetchSourceContext.excludes()); + } + + return updateRequestBuilder; + } + + private SearchRequest prepareSearchRequest(Query query, @Nullable Class clazz, IndexCoordinates index) { + return prepareSearchRequest(query, Optional.empty(), clazz, index); + } + + public PutMappingRequest putMappingRequest(IndexCoordinates index, Object mapping) { + PutMappingRequest request = new PutMappingRequest(index.getIndexName()).type(index.getTypeName()); + if (mapping instanceof String) { + request.source(String.valueOf(mapping), XContentType.JSON); + } else if (mapping instanceof Map) { + request.source((Map) mapping); + } else if (mapping instanceof XContentBuilder) { + request.source((XContentBuilder) mapping); + } + return request; + } + + public PutMappingRequestBuilder putMappingRequestBuilder(Client client, IndexCoordinates index, Object mapping) { + PutMappingRequestBuilder requestBuilder = client.admin().indices().preparePutMapping(index.getIndexName()) + .setType(index.getTypeName()); + if (mapping instanceof String) { + requestBuilder.setSource(String.valueOf(mapping), XContentType.JSON); + } else if (mapping instanceof Map) { + requestBuilder.setSource((Map) mapping); + } else if (mapping instanceof XContentBuilder) { + requestBuilder.setSource((XContentBuilder) mapping); + } + return requestBuilder; + } + + public MultiGetRequest multiGetRequest(Query query, IndexCoordinates index) { + MultiGetRequest multiGetRequest = new MultiGetRequest(); + getMultiRequestItems(query, index).forEach(multiGetRequest::add); + return multiGetRequest; + } + + public MultiGetRequestBuilder multiGetRequestBuilder(Client client, Query searchQuery, IndexCoordinates index) { + MultiGetRequestBuilder multiGetRequestBuilder = client.prepareMultiGet(); + getMultiRequestItems(searchQuery, index).forEach(multiGetRequestBuilder::add); + return multiGetRequestBuilder; + } + + private List getMultiRequestItems(Query searchQuery, IndexCoordinates index) { + List items = new ArrayList<>(); + if (!isEmpty(searchQuery.getFields())) { + searchQuery.addSourceFilter(new FetchSourceFilter(toArray(searchQuery.getFields()), null)); + } + + for (String id : searchQuery.getIds()) { + MultiGetRequest.Item item = new MultiGetRequest.Item(index.getIndexName(), index.getTypeName(), id); + + if (searchQuery.getRoute() != null) { + item = item.routing(searchQuery.getRoute()); + } + items.add(item); + } + return items; + } + + private SearchRequest prepareSearchRequest(Query query, Optional builder, @Nullable Class clazz, + IndexCoordinates index) { + Assert.notNull(index.getIndexNames(), "No index defined for Query"); + Assert.notEmpty(index.getIndexNames(), "No index defined for Query"); + Assert.notNull(index.getTypeNames(), "No type defined for Query"); + + int startRecord = 0; + SearchRequest request = new SearchRequest(index.getIndexNames()); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + request.types(index.getTypeNames()); + sourceBuilder.version(true); + sourceBuilder.trackScores(query.getTrackScores()); + + builder.ifPresent(sourceBuilder::query); + + if (query.getSourceFilter() != null) { + SourceFilter sourceFilter = query.getSourceFilter(); + sourceBuilder.fetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); + } + + if (query.getPageable().isPaged()) { + startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); + sourceBuilder.size(query.getPageable().getPageSize()); + } + sourceBuilder.from(startRecord); + + if (!query.getFields().isEmpty()) { + sourceBuilder.fetchSource(query.getFields().toArray(new String[0]), null); + } + + if (query.getIndicesOptions() != null) { + request.indicesOptions(query.getIndicesOptions()); + } + + if (query.isLimiting()) { + sourceBuilder.size(query.getMaxResults()); + } + + if (query.getMinScore() > 0) { + sourceBuilder.minScore(query.getMinScore()); + } + + if (query.getPreference() != null) { + request.preference(query.getPreference()); + } + + if (query.getSearchType() != null) { + request.searchType(query.getSearchType()); + } + + prepareSort(query, sourceBuilder, getPersistentEntity(clazz)); + + HighlightBuilder highlightBuilder = highlightBuilder(query); + + if (highlightBuilder != null) { + sourceBuilder.highlighter(highlightBuilder); + } + + if (query instanceof NativeSearchQuery) { + NativeSearchQuery nativeSearchQuery = (NativeSearchQuery) query; + + if (!nativeSearchQuery.getScriptFields().isEmpty()) { + for (ScriptField scriptedField : nativeSearchQuery.getScriptFields()) { + sourceBuilder.scriptField(scriptedField.fieldName(), scriptedField.script()); + } + } + + if (nativeSearchQuery.getCollapseBuilder() != null) { + sourceBuilder.collapse(nativeSearchQuery.getCollapseBuilder()); + } + + } + + request.source(sourceBuilder); + return request; + } + + private SearchRequestBuilder prepareSearchRequestBuilder(Query query, Client client, + @Nullable ElasticsearchPersistentEntity entity, IndexCoordinates index) { + Assert.notNull(index.getIndexNames(), "No index defined for Query"); + Assert.notEmpty(index.getIndexNames(), "No index defined for Query"); + Assert.notNull(index.getTypeNames(), "No type defined for Query"); + + int startRecord = 0; + SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index.getIndexNames()) // + .setSearchType(query.getSearchType()) // + .setTypes(index.getTypeNames()) // + .setVersion(true) // + .setTrackScores(query.getTrackScores()); + + if (query.getSourceFilter() != null) { + SourceFilter sourceFilter = query.getSourceFilter(); + searchRequestBuilder.setFetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes()); + } + + if (query.getPageable().isPaged()) { + startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); + searchRequestBuilder.setSize(query.getPageable().getPageSize()); + } + searchRequestBuilder.setFrom(startRecord); + + if (!query.getFields().isEmpty()) { + searchRequestBuilder.setFetchSource(query.getFields().toArray(new String[0]), null); + } + + if (query.getIndicesOptions() != null) { + searchRequestBuilder.setIndicesOptions(query.getIndicesOptions()); + } + + if (query.isLimiting()) { + searchRequestBuilder.setSize(query.getMaxResults()); + } + + if (query.getMinScore() > 0) { + searchRequestBuilder.setMinScore(query.getMinScore()); + } + + if (query.getPreference() != null) { + searchRequestBuilder.setPreference(query.getPreference()); + } + + prepareSort(query, searchRequestBuilder, entity); + + HighlightBuilder highlightBuilder = highlightBuilder(query); + + if (highlightBuilder != null) { + searchRequestBuilder.highlighter(highlightBuilder); + } + + if (query instanceof NativeSearchQuery) { + prepareNativeSearch(searchRequestBuilder, (NativeSearchQuery) query); + } + + return searchRequestBuilder; + } + + private void prepareNativeSearch(SearchRequestBuilder searchRequestBuilder, NativeSearchQuery nativeSearchQuery) { + if (!isEmpty(nativeSearchQuery.getScriptFields())) { + for (ScriptField scriptedField : nativeSearchQuery.getScriptFields()) { + searchRequestBuilder.addScriptField(scriptedField.fieldName(), scriptedField.script()); + } + } + + if (nativeSearchQuery.getCollapseBuilder() != null) { + searchRequestBuilder.setCollapse(nativeSearchQuery.getCollapseBuilder()); + } + + if (!isEmpty(nativeSearchQuery.getIndicesBoost())) { + for (IndexBoost indexBoost : nativeSearchQuery.getIndicesBoost()) { + searchRequestBuilder.addIndexBoost(indexBoost.getIndexName(), indexBoost.getBoost()); + } + } + + if (!isEmpty(nativeSearchQuery.getAggregations())) { + for (AbstractAggregationBuilder aggregationBuilder : nativeSearchQuery.getAggregations()) { + searchRequestBuilder.addAggregation(aggregationBuilder); + } + } + } + + private SearchRequestBuilder prepareSearchRequestBuilder(Query query, Client client, @Nullable Class clazz, + IndexCoordinates index) { + return prepareSearchRequestBuilder(query, client, getPersistentEntity(clazz), index); + } + + private void prepareSort(Query query, SearchSourceBuilder sourceBuilder, + @Nullable ElasticsearchPersistentEntity entity) { + + if (query.getSort() != null) { + query.getSort().forEach(order -> sourceBuilder.sort(getSortBuilder(order, entity))); + } + + if (query instanceof NativeSearchQuery) { + NativeSearchQuery nativeSearchQuery = (NativeSearchQuery) query; + List sorts = nativeSearchQuery.getElasticsearchSorts(); + if (sorts != null) { + sorts.forEach(sourceBuilder::sort); + } + } + } + + private void prepareSort(Query query, SearchRequestBuilder searchRequestBuilder, + @Nullable ElasticsearchPersistentEntity entity) { + if (query.getSort() != null) { + query.getSort().forEach(order -> searchRequestBuilder.addSort(getSortBuilder(order, entity))); + } + + if (query instanceof NativeSearchQuery) { + NativeSearchQuery nativeSearchQuery = (NativeSearchQuery) query; + List sorts = nativeSearchQuery.getElasticsearchSorts(); + if (sorts != null) { + sorts.forEach(searchRequestBuilder::addSort); + } + } + } + + private SortBuilder getSortBuilder(Sort.Order order, @Nullable ElasticsearchPersistentEntity entity) { + SortOrder sortOrder = order.getDirection().isDescending() ? SortOrder.DESC : SortOrder.ASC; + + if (ScoreSortBuilder.NAME.equals(order.getProperty())) { + return SortBuilders // + .scoreSort() // + .order(sortOrder); + } else { + ElasticsearchPersistentProperty property = (entity != null) // + ? entity.getPersistentProperty(order.getProperty()) // + : null; + String fieldName = property != null ? property.getFieldName() : order.getProperty(); + + FieldSortBuilder sort = SortBuilders // + .fieldSort(fieldName) // + .order(sortOrder); + + if (order.getNullHandling() == Sort.NullHandling.NULLS_FIRST) { + sort.missing("_first"); + } else if (order.getNullHandling() == Sort.NullHandling.NULLS_LAST) { + sort.missing("_last"); + } + + return sort; + } + } + + private QueryBuilder getQuery(Query query) { + QueryBuilder elasticsearchQuery; + + if (query instanceof NativeSearchQuery) { + NativeSearchQuery searchQuery = (NativeSearchQuery) query; + elasticsearchQuery = searchQuery.getQuery(); + } else if (query instanceof CriteriaQuery) { + CriteriaQuery criteriaQuery = (CriteriaQuery) query; + elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria()); + } else if (query instanceof StringQuery) { + StringQuery stringQuery = (StringQuery) query; + elasticsearchQuery = wrapperQuery(stringQuery.getSource()); + } else { + throw new IllegalArgumentException("unhandled Query implementation " + query.getClass().getName()); + } + + return elasticsearchQuery; + } + + public IndicesAliasesRequest indicesAddAliasesRequest(AliasQuery query, IndexCoordinates index) { + IndicesAliasesRequest.AliasActions aliasAction = aliasAction(query, index); + IndicesAliasesRequest request = new IndicesAliasesRequest(); + request.addAliasAction(aliasAction); + return request; + } + + public IndicesAliasesRequest indicesRemoveAliasesRequest(AliasQuery query, IndexCoordinates index) { + IndicesAliasesRequest.AliasActions aliasAction = IndicesAliasesRequest.AliasActions.remove() // + .index(index.getIndexName()) // + .alias(query.getAliasName()); + + return Requests.indexAliasesRequest() // + .addAliasAction(aliasAction); + } + + private QueryBuilder getFilter(Query query) { + QueryBuilder elasticsearchFilter; + + if (query instanceof NativeSearchQuery) { + NativeSearchQuery searchQuery = (NativeSearchQuery) query; + elasticsearchFilter = searchQuery.getFilter(); + } else if (query instanceof CriteriaQuery) { + CriteriaQuery criteriaQuery = (CriteriaQuery) query; + elasticsearchFilter = new CriteriaFilterProcessor().createFilterFromCriteria(criteriaQuery.getCriteria()); + } else if (query instanceof StringQuery) { + elasticsearchFilter = null; + } else { + throw new IllegalArgumentException("unhandled Query implementation " + query.getClass().getName()); + } + + return elasticsearchFilter; + } + + @Nullable + private ElasticsearchPersistentEntity getPersistentEntity(@Nullable Class clazz) { + return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null; + } + + private String getPersistentEntityId(Object entity) { + + Object identifier = elasticsearchConverter.getMappingContext() // + .getRequiredPersistentEntity(entity.getClass()) // + .getIdentifierAccessor(entity).getIdentifier(); + + if (identifier != null) { + return identifier.toString(); + } + + return null; + } + + private VersionType retrieveVersionTypeFromPersistentEntity(Class clazz) { + + if (clazz != null) { + return elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz).getVersionType(); + } + return VersionType.EXTERNAL; + } + + private String[] toArray(List values) { + String[] valuesAsArray = new String[values.size()]; + return values.toArray(valuesAsArray); + } + +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java index c1ff7500d..617b0ddb3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java @@ -2,15 +2,15 @@ import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.Aggregations; -import org.springframework.data.elasticsearch.core.FacetedPage; import org.springframework.data.elasticsearch.core.ScoredPage; import org.springframework.data.elasticsearch.core.ScrolledPage; /** * @author Petar Tahchiev * @author Sascha Woo + * @author Peter-Josef Meisch */ -public interface AggregatedPage extends FacetedPage, ScrolledPage, ScoredPage { +public interface AggregatedPage extends ScrolledPage, ScoredPage { boolean hasAggregations(); diff --git a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java index 957e9e4d8..5250bdc1d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java @@ -15,12 +15,14 @@ */ package org.springframework.data.elasticsearch.core.aggregation.impl; +import static java.util.Optional.*; + import java.util.List; import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.Aggregations; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.FacetedPageImpl; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse; @@ -31,12 +33,16 @@ * @author Sascha Woo * @author Peter-Josef Meisch */ -public class AggregatedPageImpl extends FacetedPageImpl implements AggregatedPage { +public class AggregatedPageImpl extends PageImpl implements AggregatedPage { private Aggregations aggregations; private String scrollId; private float maxScore; + private static Pageable pageableOrUnpaged(Pageable pageable) { + return ofNullable(pageable).orElse(Pageable.unpaged()); + } + public AggregatedPageImpl(List content) { super(content); } @@ -57,26 +63,26 @@ public AggregatedPageImpl(List content, String scrollId, float maxScore) { } public AggregatedPageImpl(List content, Pageable pageable, long total) { - super(content, pageable, total); + super(content, pageableOrUnpaged(pageable), total); } public AggregatedPageImpl(List content, Pageable pageable, long total, float maxScore) { - super(content, pageable, total); + super(content, pageableOrUnpaged(pageable), total); this.maxScore = maxScore; } public AggregatedPageImpl(List content, Pageable pageable, long total, String scrollId) { - super(content, pageable, total); + super(content, pageableOrUnpaged(pageable), total); this.scrollId = scrollId; } public AggregatedPageImpl(List content, Pageable pageable, long total, String scrollId, float maxScore) { - this(content, pageable, total, scrollId); + this(content, pageableOrUnpaged(pageable), total, scrollId); this.maxScore = maxScore; } public AggregatedPageImpl(List content, Pageable pageable, long total, Aggregations aggregations) { - super(content, pageable, total); + super(content, pageableOrUnpaged(pageable), total); this.aggregations = aggregations; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java deleted file mode 100644 index b4d5b9626..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetRequest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet; - -import org.springframework.util.Assert; - - -/** - * @author Artur Konczak - */ -@Deprecated -public abstract class AbstractFacetRequest implements FacetRequest { - - public static final String INTERNAL_STATS = "internal-stats"; - - private String name; - private boolean applyQueryFilter; - - public AbstractFacetRequest(String name) { - Assert.hasText(name, "Facet can't be null or empty !!!"); - this.name = name; - } - - protected String getName() { - return name; - } - - public void setApplyQueryFilter(boolean applyQueryFilter) { - this.applyQueryFilter = applyQueryFilter; - } - - @Override - public boolean applyQueryFilter() { - return applyQueryFilter; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetResult.java deleted file mode 100644 index f08099ff8..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/AbstractFacetResult.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet; - -import org.springframework.util.Assert; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public class AbstractFacetResult implements FacetResult { - - private final String name; - private final FacetType type; - - protected AbstractFacetResult(String name, FacetType type) { - Assert.hasText(name, "Facet name can't be null and should have a value"); - this.name = name; - this.type = type; - } - - @Override - public String getName() { - return name; - } - - @Override - public FacetType getType() { - return type; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetRequest.java deleted file mode 100644 index 66ff37207..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet; - -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; - -/** - * @author Artur Koczak - */ -@Deprecated -public interface FacetRequest { - - public static final String FIELD_UNTOUCHED = "untouched"; - public static final String FIELD_SORT = "sort"; - - AbstractAggregationBuilder getFacet(); - - boolean applyQueryFilter(); -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetResult.java deleted file mode 100644 index cbbce7897..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetResult.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet; - -/** - * Generic interface for all facets - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public interface FacetResult { - - String getName(); - - FacetType getType(); -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetType.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetType.java deleted file mode 100644 index 18d3b0d25..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/FacetType.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet; - -/** - * @author Artur Konczak - * @author Petar Tahchiev - */ -@Deprecated -public enum FacetType { - - term, range, histogram, statistical - -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java deleted file mode 100644 index 83e83351c..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder; -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; -import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * @author Artur Konczak - * @author Mohsin Husen - */ -@Deprecated -public class HistogramFacetRequest extends AbstractFacetRequest { - - private String field; - private long interval; - private DateHistogramInterval timeUnit; - - public HistogramFacetRequest(String name) { - super(name); - } - - public void setField(String field) { - this.field = field; - } - - public void setInterval(long interval) { - this.interval = interval; - } - - public void setTimeUnit(DateHistogramInterval timeUnit) { - this.timeUnit = timeUnit; - } - - public AbstractAggregationBuilder getFacet() { - Assert.notNull(getName(), "Facet name can't be a null !!!"); - Assert.isTrue(!StringUtils.isEmpty(field), "Please select field on which to build the facet !!!"); - Assert.isTrue(interval > 0, "Please provide interval as positive value greater them zero !!!"); - - DateHistogramAggregationBuilder dateHistogramBuilder = AggregationBuilders.dateHistogram(getName()); - dateHistogramBuilder.field(field); - - if (timeUnit != null) { - dateHistogramBuilder.dateHistogramInterval(timeUnit); - } else { - dateHistogramBuilder.interval(interval); - } - - dateHistogramBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS).field(field)); - - return dateHistogramBuilder; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequestBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequestBuilder.java deleted file mode 100644 index 87978e812..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequestBuilder.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - - -/** - * @author Artur Konczak - */ -@Deprecated -public class HistogramFacetRequestBuilder { - - HistogramFacetRequest result; - - public HistogramFacetRequestBuilder(String name) { - result = new HistogramFacetRequest(name); - } - - public HistogramFacetRequestBuilder field(String field) { - result.setField(field); - return this; - } - - public HistogramFacetRequestBuilder interval(long interval) { - result.setInterval(interval); - return this; - } - - public HistogramFacetRequestBuilder timeUnit(DateHistogramInterval timeUnit) { - result.setTimeUnit(timeUnit); - return this; - } - - public FacetRequest build() { - return result; - } - - public HistogramFacetRequestBuilder applyQueryFilter() { - result.setApplyQueryFilter(true); - return this; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/NativeFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/NativeFacetRequest.java deleted file mode 100644 index 4fc1bc99d..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/NativeFacetRequest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - - -/** - * @author Artur Konczak - * @author Mohsin Husen - */ -@Deprecated -public class NativeFacetRequest implements FacetRequest { - - public NativeFacetRequest() { - throw new UnsupportedOperationException("Native Facet are not supported in Elasticsearch 2.x - use Aggregation"); - } - - @Override - public AbstractAggregationBuilder getFacet() { - return null; - } - - @Override - public boolean applyQueryFilter() { - return false; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java deleted file mode 100644 index 26254a766..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import java.util.ArrayList; -import java.util.List; - -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder; -import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * Range facet for numeric fields - * - * @author Artur Konczak - * @author Akos Bordas - */ -@Deprecated -public class RangeFacetRequest extends AbstractFacetRequest { - - public static final String RANGE_INTERNAL_SUM = "range-internal-sum"; - private String field; - private String keyField; - private String valueField; - - private List entries = new ArrayList<>(); - - public RangeFacetRequest(String name) { - super(name); - } - - public void setField(String field) { - this.field = field; - } - - public void setFields(String keyField, String valueField) { - this.keyField = keyField; - this.valueField = valueField; - } - - public void range(Double from, Double to) { - entries.add(new DoubleEntry(from, to)); - } - - public void range(String from, String to) { - throw new UnsupportedOperationException("Native Facet are not supported in Elasticsearch 2.x - use Aggregation"); - } - - public void addRange(Double from, Double to) { - entries.add(new DoubleEntry(from, to)); - } - - public void addRange(String from, String to) { - throw new UnsupportedOperationException("Native Facet are not supported in Elasticsearch 2.x - use Aggregation"); - } - - @Override - public AbstractAggregationBuilder getFacet() { - Assert.notNull(getName(), "Facet name can't be a null !!!"); - - RangeAggregationBuilder rangeBuilder = AggregationBuilders.range(getName()); - final String field = !StringUtils.isEmpty(keyField) ? keyField : this.field; - rangeBuilder.field(field); - - for (Entry entry : entries) { - DoubleEntry doubleEntry = (DoubleEntry) entry; - rangeBuilder.addRange(validateValue(doubleEntry.getFrom(), Double.NEGATIVE_INFINITY), validateValue(doubleEntry.getTo(), Double.POSITIVE_INFINITY)); - } - - rangeBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS).field(field)); - if(!StringUtils.isEmpty(valueField)){ - rangeBuilder.subAggregation(AggregationBuilders.sum(RANGE_INTERNAL_SUM).field(valueField)); - } - - return rangeBuilder; - } - - private double validateValue(Double value, double defaultValue) { - return value == null ? defaultValue : value; - } - - static class DoubleEntry extends Entry { - - DoubleEntry(Double from, Double to) { - super(from, to); - } - } - - static class StringEntry extends Entry { - - StringEntry(String from, String to) { - super(from, to); - } - } - - static class Entry { - - T from; - T to; - - Entry(T from, T to) { - this.from = from; - this.to = to; - } - - public T getFrom() { - return from; - } - - public T getTo() { - return to; - } - } -} - diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequestBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequestBuilder.java deleted file mode 100644 index 1b3470394..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequestBuilder.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - - -/** - * Basic range facet - * - * @author Artur Konczak - */ -@Deprecated -public class RangeFacetRequestBuilder { - - RangeFacetRequest result; - - public RangeFacetRequestBuilder(String name) { - result = new RangeFacetRequest(name); - } - - public RangeFacetRequestBuilder field(String field) { - result.setField(field); - return this; - } - - public RangeFacetRequestBuilder fields(String keyField, String valueField) { - result.setFields(keyField, valueField); - return this; - } - - - public RangeFacetRequestBuilder range(double from, double to) { - result.range(from, to); - return this; - } - - public RangeFacetRequestBuilder range(String from, String to) { - result.range(from, to); - return this; - } - - public RangeFacetRequestBuilder from(double from) { - result.range(from, null); - return this; - } - - public RangeFacetRequestBuilder to(double to) { - result.range(null, to); - return this; - } - - public RangeFacetRequestBuilder from(String from) { - result.range(from, null); - return this; - } - - public RangeFacetRequestBuilder to(String to) { - result.range(null, to); - return this; - } - - public RangeFacetRequestBuilder applyQueryFilter() { - result.setApplyQueryFilter(true); - return this; - } - - public FacetRequest build() { - return result; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java deleted file mode 100644 index 22bf30767..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * @author Petar Tahchiev - */ -@Deprecated -public class StatisticalFacetRequest extends AbstractFacetRequest { - - private String field; - - private String[] fields; - - public StatisticalFacetRequest(String name) { - super(name); - } - - public void setField(String field) { - this.field = field; - } - - public void setFields(String... fields) { - throw new UnsupportedOperationException("Native Facet are not supported in Elasticsearch 2.x - use Aggregation"); - } - - public AbstractAggregationBuilder getFacet() { - Assert.notNull(getName(), "Facet name can't be a null !!!"); - Assert.isTrue(!StringUtils.isEmpty(field) && fields == null, "Please select field or fields on which to build the facets !!!"); - return AggregationBuilders.extendedStats(getName()).field(field); - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequestBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequestBuilder.java deleted file mode 100644 index 91dd40ba7..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/StatisticalFacetRequestBuilder.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - - -/** - * @author Petar Tahchiev - */ -@Deprecated -public class StatisticalFacetRequestBuilder { - - StatisticalFacetRequest result; - - public StatisticalFacetRequestBuilder(String name) { - result = new StatisticalFacetRequest(name); - } - - public StatisticalFacetRequestBuilder field(String field) { - result.setField(field); - return this; - } - - public StatisticalFacetRequestBuilder fields(String... fields) { - result.setFields(fields); - return this; - } - - public StatisticalFacetRequestBuilder applyQueryFilter() { - result.setApplyQueryFilter(true); - return this; - } - - public FacetRequest build() { - return result; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetOrder.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetOrder.java deleted file mode 100644 index bf0d5756c..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetOrder.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -/** - * @author Artur Konczak - * @author Mohsin Husen - */ -@Deprecated -public enum TermFacetOrder { - - ascTerm, descTerm, ascCount, descCount; - -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java deleted file mode 100644 index 8e301df1a..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.apache.lucene.util.automaton.RegExp; -import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; -import org.elasticsearch.search.aggregations.AggregationBuilders; -import org.elasticsearch.search.aggregations.BucketOrder; -import org.elasticsearch.search.aggregations.bucket.terms.IncludeExclude; -import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; -import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest; -import org.springframework.util.Assert; -import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; - -/** - * Term facet - * - * @author Artur Konczak - * @author Ilkang Na - */ -@Deprecated -public class TermFacetRequest extends AbstractFacetRequest { - - private String[] fields; - private String[] excludeTerms; - private int size = 10; - private TermFacetOrder order = TermFacetOrder.descCount; - private boolean allTerms = false; - private String regex = null; - - public TermFacetRequest(String name) { - super(name); - } - - public void setFields(String... fields) { - Assert.isTrue(!ObjectUtils.isEmpty(fields), "Term agg need one field only"); - Assert.isTrue(fields.length == 1, "Term agg need one field only"); - this.fields = fields; - } - - public void setSize(int size) { - Assert.isTrue(size >= 0, "Size should be bigger then zero !!!"); - this.size = size; - } - - public void setOrder(TermFacetOrder order) { - this.order = order; - } - - public void setExcludeTerms(String... excludeTerms) { - this.excludeTerms = excludeTerms; - } - - public void setAllTerms(boolean allTerms) { - this.allTerms = allTerms; - } - - public void setRegex(String regex) { - this.regex = regex; - } - - @Override - public AbstractAggregationBuilder getFacet() { - Assert.notEmpty(fields, "Please select at last one field !!!"); - final TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(getName()).field(fields[0]).size(this.size); - - switch (order) { - case descTerm: - termsBuilder.order(BucketOrder.key(false)); - break; - case ascTerm: - termsBuilder.order(BucketOrder.key(true)); - break; - case descCount: - termsBuilder.order(BucketOrder.count(false)); - break; - default: - termsBuilder.order(BucketOrder.count(true)); - } - if (!ObjectUtils.isEmpty(excludeTerms)) { - termsBuilder.includeExclude(new IncludeExclude(null, excludeTerms)); - } - - if (allTerms) { - termsBuilder.size(Integer.MAX_VALUE); - } - - if (!StringUtils.isEmpty(regex)) { - termsBuilder.includeExclude(new IncludeExclude(new RegExp(regex), null)); - } - - return termsBuilder; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequestBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequestBuilder.java deleted file mode 100644 index 0c672bc71..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequestBuilder.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.request; - -import org.springframework.data.elasticsearch.core.facet.FacetRequest; - -/** - * Basic term facet - * - * @author Artur Konczak - */ -@Deprecated -public class TermFacetRequestBuilder { - - private TermFacetRequest result; - - public TermFacetRequestBuilder(String name) { - result = new TermFacetRequest(name); - } - - public TermFacetRequestBuilder fields(String... fields) { - result.setFields(fields); - return this; - } - - public TermFacetRequestBuilder size(int size) { - result.setSize(size); - return this; - } - - public TermFacetRequestBuilder excludeTerms(String... terms) { - result.setExcludeTerms(terms); - return this; - } - - public TermFacetRequestBuilder allTerms() { - result.setAllTerms(true); - return this; - } - - public TermFacetRequestBuilder regex(String regex) { - result.setRegex(regex); - return this; - } - - public TermFacetRequestBuilder ascTerm() { - result.setOrder(TermFacetOrder.ascTerm); - return this; - } - - public TermFacetRequestBuilder descTerm() { - result.setOrder(TermFacetOrder.descTerm); - return this; - } - - public TermFacetRequestBuilder ascCount() { - result.setOrder(TermFacetOrder.ascCount); - return this; - } - - public TermFacetRequestBuilder descCount() { - result.setOrder(TermFacetOrder.descCount); - return this; - } - - public TermFacetRequestBuilder applyQueryFilter() { - result.setApplyQueryFilter(true); - return this; - } - - public FacetRequest build() { - return result; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/HistogramResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/HistogramResult.java deleted file mode 100644 index f56cb0bf1..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/HistogramResult.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -import java.util.List; - -import org.springframework.data.elasticsearch.core.facet.AbstractFacetResult; -import org.springframework.data.elasticsearch.core.facet.FacetType; - -/** - * @author Artur Konczak - */ -@Deprecated -public class HistogramResult extends AbstractFacetResult { - - private List terms; - - public HistogramResult(String name, List terms) { - super(name, FacetType.term); - this.terms = terms; - } - - public List getIntervalUnit() { - return terms; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/IntervalUnit.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/IntervalUnit.java deleted file mode 100644 index 892c4b731..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/IntervalUnit.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * Single term - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public class IntervalUnit { - - private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - - long key; - long count; - long totalCount; - double total; - double mean; - double min; - double max; - - public IntervalUnit(long key, long count, long totalCount, double total, double mean, double min, double max) { - this.key = key; - this.count = count; - this.totalCount = totalCount; - this.total = total; - this.mean = mean; - this.min = min; - this.max = max; - } - - public long getKey() { - return key; - } - - public long getCount() { - return count; - } - - public long getTotalCount() { - return totalCount; - } - - public double getTotal() { - return total; - } - - public double getMean() { - return mean; - } - - public double getMin() { - return min; - } - - public double getMax() { - return max; - } - - @Override - public String toString() { - return "IntervalUnit{" + - "key=" + format.format(new Date(key)) + - ", count=" + count + - ", totalCount=" + totalCount + - ", total=" + total + - ", mean=" + mean + - ", min=" + min + - ", max=" + max + - '}'; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Range.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Range.java deleted file mode 100644 index 9f8819a5b..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Range.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -/** - * Single range - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public class Range { - - private Double from; - private Double to; - private long count; - private double total; - private double totalCount; - private double min = Double.POSITIVE_INFINITY; - private double max = Double.NEGATIVE_INFINITY; - - public Range(Double from, Double to, long count, double total, double totalCount, double min, double max) { - this.from = from; - this.to = to; - this.count = count; - this.total = total; - this.totalCount = totalCount; - this.min = min; - this.max = max; - } - - public Double getFrom() { - return from; - } - - public Double getTo() { - return to; - } - - /** - * Return number of documents in range - * - * @return - */ - public long getCount() { - return count; - } - - public double getTotal() { - return total; - } - - public double getTotalCount() { - return totalCount; - } - - public double getMin() { - return min; - } - - public double getMax() { - return max; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/RangeResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/RangeResult.java deleted file mode 100644 index 6c52af053..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/RangeResult.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -import java.util.List; - -import org.springframework.data.elasticsearch.core.facet.AbstractFacetResult; -import org.springframework.data.elasticsearch.core.facet.FacetType; - -/** - * Basic term facet result - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public class RangeResult extends AbstractFacetResult { - - private List ranges; - - public RangeResult(String name, List ranges) { - super(name, FacetType.range); - this.ranges = ranges; - } - - public List getRanges() { - return ranges; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/StatisticalResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/StatisticalResult.java deleted file mode 100644 index f59df54d8..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/StatisticalResult.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -import org.springframework.data.elasticsearch.core.facet.AbstractFacetResult; -import org.springframework.data.elasticsearch.core.facet.FacetType; - -/** - * @author Petar Tahchiev - */ -@Deprecated -public class StatisticalResult extends AbstractFacetResult { - - private long count; - - private double max; - - private double min; - - private double mean; - - private double stdDeviation; - - private double sumOfSquares; - - private double total; - - private double variance; - - public StatisticalResult(String name, long count, double max, double min, double mean, double stdDeviation, double sumOfSquares, double total, double variance) { - super(name, FacetType.statistical); - this.count = count; - this.max = max; - this.min = min; - this.mean = mean; - this.stdDeviation = stdDeviation; - this.sumOfSquares = sumOfSquares; - this.total = total; - this.variance = variance; - } - - public long getCount() { - return count; - } - - public double getMax() { - return max; - } - - public double getMin() { - return min; - } - - public double getMean() { - return mean; - } - - public double getStdDeviation() { - return stdDeviation; - } - - public double getSumOfSquares() { - return sumOfSquares; - } - - public double getTotal() { - return total; - } - - public double getVariance() { - return variance; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Term.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Term.java deleted file mode 100644 index 7ee1d353b..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/Term.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -/** - * Single term - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - */ -@Deprecated -public class Term { - - private String term; - private long count; - - public Term(String term, long count) { - this.term = term; - this.count = count; - } - - public String getTerm() { - return term; - } - - public long getCount() { - return count; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/TermResult.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/result/TermResult.java deleted file mode 100644 index ab01bfce4..000000000 --- a/src/main/java/org/springframework/data/elasticsearch/core/facet/result/TermResult.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2014-2019 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 - * - * https://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.facet.result; - -import java.util.List; - -import org.springframework.data.elasticsearch.core.facet.AbstractFacetResult; -import org.springframework.data.elasticsearch.core.facet.FacetType; - -/** - * Basic term facet result - * - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - * @author Jonathan Yan - * @author Matija Obreza - */ -@Deprecated -public class TermResult extends AbstractFacetResult { - - private List terms; - private long total; - private long other; - private long missing; - - public TermResult(String name, List terms, long total, long other, long missing) { - super(name, FacetType.term); - this.terms = terms; - this.total = total; - this.other = other; - this.missing = missing; - } - - public List getTerms() { - return terms; - } - - public long getTotal() { - return total; - } - - public long getOther() { - return other; - } - - public long getMissing() { - return missing; - } -} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentEntity.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentEntity.java index a1abad01b..e1be3d558 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentEntity.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/ElasticsearchPersistentEntity.java @@ -28,6 +28,7 @@ * @author Sascha Woo * @author Oliver Gierke * @author Ivan Greene + * @author Peter-Josef Meisch */ public interface ElasticsearchPersistentEntity extends PersistentEntity { @@ -58,7 +59,7 @@ public interface ElasticsearchPersistentEntity extends PersistentEntity filter; @@ -32,11 +32,6 @@ public class AliasBuilder { private String indexRouting; private String routing; - public AliasBuilder withIndexName(String indexName) { - this.indexName = indexName; - return this; - } - public AliasBuilder withAliasName(String aliasName) { this.aliasName = aliasName; return this; @@ -69,7 +64,6 @@ public AliasBuilder withRouting(String routing) { public AliasQuery build() { AliasQuery aliasQuery = new AliasQuery(); - aliasQuery.setIndexName(indexName); aliasQuery.setAliasName(aliasName); aliasQuery.setFilterBuilder(filterBuilder); aliasQuery.setFilter(filter); diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java index 81c2912c2..459e98c06 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/AliasQuery.java @@ -23,10 +23,10 @@ * AliasQuery is useful for creating new alias or deleting existing ones * * @author Mohsin Husen + * @author Peter-Josef Meisch */ public class AliasQuery { - private String indexName; private String aliasName; private QueryBuilder filterBuilder; private Map filter; @@ -34,14 +34,6 @@ public class AliasQuery { private String indexRouting; private String routing; - public String getIndexName() { - return indexName; - } - - public void setIndexName(String indexName) { - this.indexName = indexName; - } - public String getAliasName() { return aliasName; } 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 f04d18ca1..d1a5f82a5 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 @@ -22,12 +22,11 @@ * * @author Rizwan Idrees * @author Mohsin Husen + * @author Peter-Josef Meisch */ public class DeleteQuery { private QueryBuilder query; - private String index; - private String type; private Integer pageSize; private Long scrollTimeInMillis; @@ -39,22 +38,6 @@ 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; - } - public Integer getPageSize() { return pageSize; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java index 5790f1ffd..4abe51385 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQuery.java @@ -28,8 +28,6 @@ public class IndexQuery { private String id; private Object object; private Long version; - private String indexName; - private String type; private String source; private String parentId; @@ -57,22 +55,6 @@ public void setVersion(Long version) { this.version = version; } - 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 String getSource() { return source; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQueryBuilder.java index 753003d32..1dcd9a30d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/IndexQueryBuilder.java @@ -20,14 +20,13 @@ * * @author Rizwan Idrees * @author Mohsin Husen + * @author Peter-Josef Meisch */ public class IndexQueryBuilder { private String id; private Object object; private Long version; - private String indexName; - private String type; private String source; private String parentId; @@ -46,16 +45,6 @@ public IndexQueryBuilder withVersion(Long version) { return this; } - public IndexQueryBuilder withIndexName(String indexName) { - this.indexName = indexName; - return this; - } - - public IndexQueryBuilder withType(String type) { - this.type = type; - return this; - } - public IndexQueryBuilder withSource(String source) { this.source = source; return this; @@ -69,8 +58,6 @@ public IndexQueryBuilder withParentId(String parentId) { public IndexQuery build() { IndexQuery indexQuery = new IndexQuery(); indexQuery.setId(id); - indexQuery.setIndexName(indexName); - indexQuery.setType(type); indexQuery.setObject(object); indexQuery.setParentId(parentId); indexQuery.setSource(source); 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 385b0e23e..dc376232f 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 @@ -24,7 +24,6 @@ import org.elasticsearch.search.collapse.CollapseBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilder; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; /** * NativeSearchQuery @@ -43,7 +42,6 @@ public class NativeSearchQuery extends AbstractQuery { private List sorts; private final List scriptFields = new ArrayList<>(); private CollapseBuilder collapseBuilder; - private List facets; private List aggregations; private HighlightBuilder highlightBuilder; private HighlightBuilder.Field[] highlightFields; @@ -126,23 +124,6 @@ public void setCollapseBuilder(CollapseBuilder collapseBuilder) { this.collapseBuilder = collapseBuilder; } - public void addFacet(FacetRequest facetRequest) { - - if (facets == null) { - facets = new ArrayList<>(); - } - - facets.add(facetRequest); - } - - public void setFacets(List facets) { - this.facets = facets; - } - - public List getFacets() { - return facets; - } - public List getAggregations() { return aggregations; } 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 10ff21222..5a8412549 100755 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java @@ -29,7 +29,6 @@ import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.facet.FacetRequest; /** * NativeSearchQuery @@ -50,7 +49,6 @@ public class NativeSearchQueryBuilder { private QueryBuilder filterBuilder; private List scriptFields = new ArrayList<>(); private List sortBuilders = new ArrayList<>(); - private List facetRequests = new ArrayList<>(); private List aggregationBuilders = new ArrayList<>(); private HighlightBuilder highlightBuilder; private HighlightBuilder.Field[] highlightFields; @@ -99,11 +97,6 @@ public NativeSearchQueryBuilder addAggregation(AbstractAggregationBuilder aggreg return this; } - public NativeSearchQueryBuilder withFacet(FacetRequest facetRequest) { - facetRequests.add(facetRequest); - return this; - } - public NativeSearchQueryBuilder withHighlightBuilder(HighlightBuilder highlightBuilder) { this.highlightBuilder = highlightBuilder; return this; @@ -219,10 +212,6 @@ public NativeSearchQuery build() { nativeSearchQuery.setCollapseBuilder(collapseBuilder); } - if (!isEmpty(facetRequests)) { - nativeSearchQuery.setFacets(facetRequests); - } - if (!isEmpty(aggregationBuilders)) { nativeSearchQuery.setAggregations(aggregationBuilders); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java index b21428a68..29ca79549 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java @@ -86,6 +86,7 @@ static Query findAll() { * * @return */ + @Deprecated List getIndices(); /** @@ -93,6 +94,7 @@ static Query findAll() { * * @param indices */ + @Deprecated void addIndices(String... indices); /** @@ -100,6 +102,7 @@ static Query findAll() { * * @param types */ + @Deprecated void addTypes(String... types); /** @@ -107,6 +110,7 @@ static Query findAll() { * * @return */ + @Deprecated List getTypes(); /** 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 index 173bb4171..961c7d164 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java @@ -21,14 +21,12 @@ /** * @author Rizwan Idrees * @author Mohsin Husen + * @author Peter-Josef Meisch */ public class UpdateQuery { private String id; private UpdateRequest updateRequest; - private String indexName; - private String type; - private Class clazz; private boolean doUpsert; public String getId() { @@ -47,30 +45,6 @@ public void setUpdateRequest(UpdateRequest updateRequest) { this.updateRequest = updateRequest; } - 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; } 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 index 37942b728..e7075a56f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java @@ -21,15 +21,13 @@ /** * @author Rizwan Idrees * @author Mohsin Husen + * @author Peter-Josef Meisch */ public class UpdateQueryBuilder { private String id; private UpdateRequest updateRequest; private IndexRequest indexRequest; - private String indexName; - private String type; - private Class clazz; private boolean doUpsert; public UpdateQueryBuilder withId(String id) { @@ -47,21 +45,6 @@ public UpdateQueryBuilder withIndexRequest(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; @@ -70,9 +53,6 @@ public UpdateQueryBuilder withDoUpsert(boolean doUpsert) { public UpdateQuery build() { UpdateQuery updateQuery = new UpdateQuery(); updateQuery.setId(id); - updateQuery.setIndexName(indexName); - updateQuery.setType(type); - updateQuery.setClazz(clazz); if (this.indexRequest != null) { if (this.updateRequest == null) { updateRequest = new UpdateRequest(); diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java index b9c480e5e..5ee079d33 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java @@ -17,6 +17,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator; @@ -57,6 +58,8 @@ public Object execute(Object[] parameters) { ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); CriteriaQuery query = createQuery(accessor); Assert.notNull(query, "unsupported query"); + Class clazz = queryMethod.getEntityInformation().getJavaType(); + IndexCoordinates index = elasticsearchOperations.getIndexCoordinatesFor(clazz); if (tree.isLimiting()) { query.setMaxResults(tree.getMaxResults()); @@ -64,55 +67,60 @@ public Object execute(Object[] parameters) { if (tree.isDelete()) { Object result = countOrGetDocumentsForDelete(query, accessor); - elasticsearchOperations.delete(query, queryMethod.getEntityInformation().getJavaType()); + elasticsearchOperations.delete(query, clazz, index); return result; } else if (queryMethod.isPageQuery()) { query.setPageable(accessor.getPageable()); - return elasticsearchOperations.queryForPage(query, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForPage(query, clazz, index); } else if (queryMethod.isStreamQuery()) { - Class entityType = queryMethod.getEntityInformation().getJavaType(); + Class entityType = clazz; if (accessor.getPageable().isUnpaged()) { query.setPageable(PageRequest.of(0, DEFAULT_STREAM_BATCH_SIZE)); } else { query.setPageable(accessor.getPageable()); } return StreamUtils - .createStreamFromIterator((CloseableIterator) elasticsearchOperations.stream(query, entityType)); + .createStreamFromIterator((CloseableIterator) elasticsearchOperations.stream(query, entityType, index)); } else if (queryMethod.isCollectionQuery()) { if (accessor.getPageable().isUnpaged()) { - int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + int itemCount = (int) elasticsearchOperations.count(query, clazz, + index); query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); } else { query.setPageable(accessor.getPageable()); } - return elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForList(query, clazz, index); } else if (tree.isCountProjection()) { - return elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.count(query, clazz, index); } - return elasticsearchOperations.queryForObject(query, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForObject(query, clazz, index); } private Object countOrGetDocumentsForDelete(CriteriaQuery query, ParametersParameterAccessor accessor) { Object result = null; + Class clazz = queryMethod.getEntityInformation().getJavaType(); + IndexCoordinates index = elasticsearchOperations + .getIndexCoordinatesFor(clazz); if (queryMethod.isCollectionQuery()) { if (accessor.getPageable().isUnpaged()) { - int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + int itemCount = (int) elasticsearchOperations.count(query, clazz, + index); query.setPageable(PageRequest.of(0, Math.max(1, itemCount))); } else { query.setPageable(accessor.getPageable()); } - result = elasticsearchOperations.queryForList(query, queryMethod.getEntityInformation().getJavaType()); + result = elasticsearchOperations.queryForList(query, clazz, index); } if (ClassUtils.isAssignable(Number.class, queryMethod.getReturnedObjectType())) { - result = elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType()); + result = elasticsearchOperations.count(query, clazz, index); } return result; } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java index 031f63fe1..49166c0b9 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchStringQuery.java @@ -20,6 +20,7 @@ import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.convert.DateTimeConverters; import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.repository.query.ParametersParameterAccessor; @@ -68,17 +69,19 @@ public ElasticsearchStringQuery(ElasticsearchQueryMethod queryMethod, Elasticsea public Object execute(Object[] parameters) { ParametersParameterAccessor accessor = new ParametersParameterAccessor(queryMethod.getParameters(), parameters); StringQuery stringQuery = createQuery(accessor); + Class clazz = queryMethod.getEntityInformation().getJavaType(); + IndexCoordinates index = elasticsearchOperations.getIndexCoordinatesFor(clazz); if (queryMethod.isPageQuery()) { stringQuery.setPageable(accessor.getPageable()); - return elasticsearchOperations.queryForPage(stringQuery, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForPage(stringQuery, clazz, index); } else if (queryMethod.isCollectionQuery()) { if (accessor.getPageable().isPaged()) { stringQuery.setPageable(accessor.getPageable()); } - return elasticsearchOperations.queryForList(stringQuery, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForList(stringQuery, clazz, index); } - return elasticsearchOperations.queryForObject(stringQuery, queryMethod.getEntityInformation().getJavaType()); + return elasticsearchOperations.queryForObject(stringQuery, clazz, index); } protected StringQuery createQuery(ParametersParameterAccessor parameterAccessor) { diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java index 3ca4db976..8edc1f135 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java @@ -36,6 +36,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.DeleteQuery; import org.springframework.data.elasticsearch.core.query.GetQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery; @@ -72,7 +73,6 @@ public abstract class AbstractElasticsearchRepository implements Elastics public AbstractElasticsearchRepository() {} public AbstractElasticsearchRepository(ElasticsearchOperations elasticsearchOperations) { - Assert.notNull(elasticsearchOperations, "ElasticsearchOperations must not be null!"); this.setElasticsearchOperations(elasticsearchOperations); @@ -80,7 +80,6 @@ public AbstractElasticsearchRepository(ElasticsearchOperations elasticsearchOper public AbstractElasticsearchRepository(ElasticsearchEntityInformation metadata, ElasticsearchOperations elasticsearchOperations) { - this(elasticsearchOperations); Assert.notNull(metadata, "ElasticsearchEntityInformation must not be null!"); @@ -98,124 +97,99 @@ public AbstractElasticsearchRepository(ElasticsearchEntityInformation met } private void createIndex() { - elasticsearchOperations.createIndex(getEntityClass()); } private void putMapping() { - elasticsearchOperations.putMapping(getEntityClass()); } private boolean createIndexAndMapping() { - return elasticsearchOperations.getPersistentEntityFor(getEntityClass()).isCreateIndexAndMapping(); } @Override public Optional findById(ID id) { - GetQuery query = new GetQuery(); query.setId(stringIdRepresentation(id)); - return Optional.ofNullable(elasticsearchOperations.queryForObject(query, getEntityClass())); + return Optional.ofNullable(elasticsearchOperations.get(query, getEntityClass(), getIndexCoordinates())); } @Override public Iterable findAll() { - int itemCount = (int) this.count(); + if (itemCount == 0) { return new PageImpl<>(Collections. emptyList()); } - return this.findAll(PageRequest.of(0, Math.max(1, itemCount))); } @Override public Page findAll(Pageable pageable) { - NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(pageable).build(); - - return elasticsearchOperations.queryForPage(query, getEntityClass()); + return elasticsearchOperations.queryForPage(query, getEntityClass(), getIndexCoordinates()); } @Override public Iterable findAll(Sort sort) { - int itemCount = (int) this.count(); + if (itemCount == 0) { return new PageImpl<>(Collections. emptyList()); } - NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withPageable(PageRequest.of(0, itemCount, sort)).build(); - - return elasticsearchOperations.queryForPage(query, getEntityClass()); + return elasticsearchOperations.queryForPage(query, getEntityClass(), getIndexCoordinates()); } @Override public Iterable findAllById(Iterable ids) { - Assert.notNull(ids, "ids can't be null."); - NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(stringIdsRepresentation(ids)).build(); - - return elasticsearchOperations.multiGet(query, getEntityClass()); + return elasticsearchOperations.multiGet(query, getEntityClass(), getIndexCoordinates()); } @Override public long count() { - NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - - return elasticsearchOperations.count(query, getEntityClass()); + return elasticsearchOperations.count(query, getEntityClass(), getIndexCoordinates()); } @Override public S save(S entity) { - Assert.notNull(entity, "Cannot save 'null' entity."); - - elasticsearchOperations.index(createIndexQuery(entity)); - elasticsearchOperations.refresh(entityInformation.getIndexName()); - + elasticsearchOperations.index(createIndexQuery(entity), getIndexCoordinates()); + elasticsearchOperations.refresh(getIndexCoordinates()); return entity; } public List save(List entities) { - Assert.notNull(entities, "Cannot insert 'null' as a List."); - return Streamable.of(saveAll(entities)).stream().collect(Collectors.toList()); } @Override public S index(S entity) { - return save(entity); } @Override public S indexWithoutRefresh(S entity) { - Assert.notNull(entity, "Cannot save 'null' entity."); - - elasticsearchOperations.index(createIndexQuery(entity)); - + elasticsearchOperations.index(createIndexQuery(entity), getIndexCoordinates()); return entity; } @Override public Iterable saveAll(Iterable entities) { - Assert.notNull(entities, "Cannot insert 'null' as a List."); - List queries = Streamable.of(entities).stream().map(this::createIndexQuery) .collect(Collectors.toList()); if (!queries.isEmpty()) { - elasticsearchOperations.bulkIndex(queries); - elasticsearchOperations.refresh(entityInformation.getIndexName()); + elasticsearchOperations.bulkIndex(queries, getIndexCoordinates()); + elasticsearchOperations.refresh(getIndexCoordinates()); } return entities; @@ -223,76 +197,64 @@ public Iterable saveAll(Iterable entities) { @Override public boolean existsById(ID id) { - return findById(id).isPresent(); } @Override public Iterable search(QueryBuilder query) { - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).build(); - int count = (int) elasticsearchOperations.count(searchQuery, getEntityClass()); + int count = (int) elasticsearchOperations.count(searchQuery, getEntityClass(), getIndexCoordinates()); + if (count == 0) { return new PageImpl<>(Collections. emptyList()); } - searchQuery.setPageable(PageRequest.of(0, count)); - - return elasticsearchOperations.queryForPage(searchQuery, getEntityClass()); + return elasticsearchOperations.queryForPage(searchQuery, getEntityClass(), getIndexCoordinates()); } @Override public Page search(QueryBuilder query, Pageable pageable) { - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(query).withPageable(pageable).build(); - - return elasticsearchOperations.queryForPage(searchQuery, getEntityClass()); + return elasticsearchOperations.queryForPage(searchQuery, getEntityClass(), getIndexCoordinates()); } @Override public Page search(NativeSearchQuery query) { - - return elasticsearchOperations.queryForPage(query, getEntityClass()); + return elasticsearchOperations.queryForPage(query, getEntityClass(), getIndexCoordinates()); } @Override public Page searchSimilar(T entity, String[] fields, Pageable pageable) { - Assert.notNull(entity, "Cannot search similar records for 'null'."); Assert.notNull(pageable, "'pageable' cannot be 'null'"); - MoreLikeThisQuery query = new MoreLikeThisQuery(); query.setId(stringIdRepresentation(extractIdFromBean(entity))); query.setPageable(pageable); + if (fields != null) { query.addFields(fields); } - return elasticsearchOperations.moreLikeThis(query, getEntityClass()); + return elasticsearchOperations.moreLikeThis(query, getEntityClass(), getIndexCoordinates()); } @Override public void deleteById(ID id) { - Assert.notNull(id, "Cannot delete entity with id 'null'."); - - elasticsearchOperations.delete(entityInformation.getIndexName(), entityInformation.getType(), - stringIdRepresentation(id)); - elasticsearchOperations.refresh(entityInformation.getIndexName()); + IndexCoordinates indexCoordinates = getIndexCoordinates(); + elasticsearchOperations.delete(stringIdRepresentation(id), indexCoordinates); + elasticsearchOperations.refresh(indexCoordinates); } @Override public void delete(T entity) { - Assert.notNull(entity, "Cannot delete 'null' entity."); - deleteById(extractIdFromBean(entity)); - elasticsearchOperations.refresh(entityInformation.getIndexName()); + elasticsearchOperations.refresh(getIndexCoordinates()); } @Override public void deleteAll(Iterable entities) { - Assert.notNull(entities, "Cannot delete 'null' list."); for (T entity : entities) { delete(entity); @@ -301,21 +263,19 @@ public void deleteAll(Iterable entities) { @Override public void deleteAll() { - DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(matchAllQuery()); - elasticsearchOperations.delete(deleteQuery, getEntityClass()); - elasticsearchOperations.refresh(entityInformation.getIndexName()); + IndexCoordinates indexCoordinates = getIndexCoordinates(); + elasticsearchOperations.delete(deleteQuery, indexCoordinates); + elasticsearchOperations.refresh(indexCoordinates); } @Override public void refresh() { - elasticsearchOperations.refresh(getEntityClass()); } private IndexQuery createIndexQuery(T entity) { - IndexQuery query = new IndexQuery(); query.setObject(entity); query.setId(stringIdRepresentation(extractIdFromBean(entity))); @@ -326,14 +286,13 @@ private IndexQuery createIndexQuery(T entity) { @SuppressWarnings("unchecked") private Class resolveReturnedClassFromGenericType() { - ParameterizedType parameterizedType = resolveReturnedClassFromGenericType(getClass()); return (Class) parameterizedType.getActualTypeArguments()[0]; } private ParameterizedType resolveReturnedClassFromGenericType(Class clazz) { - Object genericSuperclass = clazz.getGenericSuperclass(); + if (genericSuperclass instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; Type rawtype = parameterizedType.getRawType(); @@ -355,25 +314,20 @@ public Class getEntityClass() { throw new InvalidDataAccessApiUsageException("Unable to resolve EntityClass. Please use according setter!", e); } } - return entityClass; } private boolean isEntityClassSet() { - return entityClass != null; } public final void setEntityClass(Class entityClass) { - Assert.notNull(entityClass, "EntityClass must not be null."); this.entityClass = entityClass; } public final void setElasticsearchOperations(ElasticsearchOperations elasticsearchOperations) { - Assert.notNull(elasticsearchOperations, "ElasticsearchOperations must not be null."); - this.elasticsearchOperations = elasticsearchOperations; } @@ -382,9 +336,7 @@ protected ID extractIdFromBean(T entity) { } private List stringIdsRepresentation(Iterable ids) { - Assert.notNull(ids, "ids can't be null."); - List stringIds = new ArrayList<>(); for (ID id : ids) { stringIds.add(stringIdRepresentation(id)); @@ -402,4 +354,8 @@ private Long extractVersionFromBean(T entity) { private String extractParentIdFromBean(T entity) { return entityInformation.getParentId(entity); } + + private IndexCoordinates getIndexCoordinates() { + return elasticsearchOperations.getIndexCoordinatesFor(getEntityClass()); + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java index ca0bda9ab..5e9a37e7a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java @@ -45,6 +45,7 @@ import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.GetQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; @@ -122,14 +123,15 @@ public void shouldIndexInitialLevelNestedObject() { indexQueries.add(indexQuery1); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + IndexCoordinates index = IndexCoordinates.of("test-index-person").withTypes( "user"); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(Person.class); QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); + List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class, index); assertThat(persons).hasSize(1); } @@ -141,14 +143,15 @@ public void shouldIndexMultipleLevelNestedObject() { List indexQueries = createPerson(); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, + IndexCoordinates.of("test-index-person-multiple-level-nested").withTypes( "user")); elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); // then GetQuery getQuery = new GetQuery(); getQuery.setId("1"); - PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, - PersonMultipleLevelNested.class); + PersonMultipleLevelNested personIndexed = elasticsearchTemplate.get(getQuery, PersonMultipleLevelNested.class, + IndexCoordinates.of("test-index-person-multiple-level-nested").withTypes( "user")); assertThat(personIndexed).isNotNull(); } @@ -159,7 +162,8 @@ public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() { List indexQueries = createPerson(); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, + IndexCoordinates.of("test-index-person-multiple-level-nested").withTypes( "user")); // then Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class); @@ -178,7 +182,9 @@ public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() { List indexQueries = createPerson(); // when - elasticsearchTemplate.bulkIndex(indexQueries); + IndexCoordinates index = IndexCoordinates.of("test-index-person-multiple-level-nested").withTypes( "user"); + elasticsearchTemplate.bulkIndex(indexQueries, + index); elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); // then @@ -189,7 +195,7 @@ public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); Page personIndexed = elasticsearchTemplate.queryForPage(searchQuery, - PersonMultipleLevelNested.class); + PersonMultipleLevelNested.class, index); assertThat(personIndexed).isNotNull(); assertThat(personIndexed.getTotalElements()).isEqualTo(1); assertThat(personIndexed.getContent().get(0).getId()).isEqualTo("1"); @@ -317,14 +323,15 @@ public void shouldSearchBooksForPersonInitialLevelNestedType() { indexQueries.add(indexQuery1); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + IndexCoordinates index = IndexCoordinates.of("test-index-person").withTypes( "user"); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(Person.class); // when QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); + List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class, index); // then assertThat(persons).hasSize(1); @@ -365,13 +372,14 @@ public void shouldIndexAndSearchMapAsNestedType() { indexQueries.add(indexQuery2); // when - elasticsearchTemplate.bulkIndex(indexQueries); + IndexCoordinates index = IndexCoordinates.of("test-index-book-nested-objects").withTypes( "book"); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(Book.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"), ScoreMode.None)).build(); - Page books = elasticsearchTemplate.queryForPage(searchQuery, Book.class); + Page books = elasticsearchTemplate.queryForPage(searchQuery, Book.class, index); assertThat(books.getContent()).hasSize(1); assertThat(books.getContent().get(0).getId()).isEqualTo(book2.getId()); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplateTests.java index 64d836449..407e0efee 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchRestTemplateTests.java @@ -22,16 +22,9 @@ import lombok.Builder; import lombok.Data; -import java.io.IOException; -import java.lang.Object; -import java.util.HashMap; -import java.util.Map; - import org.elasticsearch.ElasticsearchStatusException; import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.junit.jupiter.api.Test; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; @@ -41,7 +34,6 @@ import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.util.ReflectionTestUtils; /** * @author Rizwan Idrees @@ -56,7 +48,6 @@ * @author Sascha Woo * @author Don Wellington * @author Peter-Josef Meisch - * @author Massimiliano Poggi */ @SpringIntegrationTest @ContextConfiguration(classes = { ElasticsearchRestTemplateConfiguration.class }) @@ -68,65 +59,12 @@ public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() // when IndexRequest indexRequest = new IndexRequest(); indexRequest.source("{}", XContentType.JSON); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)).withClass(SampleEntity.class) - .withIndexRequest(indexRequest).build(); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)).withIndexRequest(indexRequest).build(); assertThatThrownBy(() -> { - elasticsearchTemplate.update(updateQuery); + elasticsearchTemplate.update(updateQuery, index); }).isInstanceOf(ElasticsearchStatusException.class); } - @Test // DATAES-227 - @Override - public void shouldUseUpsertOnUpdate() throws IOException { - - // given - Map doc = new HashMap<>(); - doc.put("id", "1"); - doc.put("message", "test"); - - UpdateRequest updateRequest = new UpdateRequest() // - .doc(doc) // - .upsert(doc); - - UpdateQuery updateQuery = new UpdateQueryBuilder() // - .withClass(SampleEntity.class) // - .withId("1") // - .withUpdateRequest(updateRequest).build(); - - // when - UpdateRequest request = (UpdateRequest) ReflectionTestUtils // - .invokeMethod(elasticsearchTemplate, "prepareUpdate", updateQuery); - - // then - assertThat(request).isNotNull(); - assertThat(request.upsertRequest()).isNotNull(); - } - - @Test // DATAES-693 - public void shouldReturnSourceWhenRequested() throws IOException { - // given - Map doc = new HashMap<>(); - doc.put("id", "1"); - doc.put("message", "test"); - - UpdateRequest updateRequest = new UpdateRequest() - .doc(doc) - .fetchSource(FetchSourceContext.FETCH_SOURCE); - - UpdateQuery updateQuery = new UpdateQueryBuilder() // - .withClass(SampleEntity.class) // - .withId("1") // - .withUpdateRequest(updateRequest).build(); - - // when - UpdateRequest request = (UpdateRequest) ReflectionTestUtils // - .invokeMethod(elasticsearchTemplate, "prepareUpdate", updateQuery); - - // then - assertThat(request).isNotNull(); - assertThat(request.fetchSource()).isEqualTo(FetchSourceContext.FETCH_SOURCE); - } - @Data @Builder @Document(indexName = "test-index-sample-core-rest-template", type = "test-type", shards = 1, replicas = 0, diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java index a84c9b41f..d4d186d97 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateParentChildTests.java @@ -83,7 +83,7 @@ public void shouldIndexParentChildEntity() { // find all parents that have the first child QueryBuilder query = hasChildQuery(ParentEntity.CHILD_TYPE, QueryBuilders.termQuery("name", child1name.toLowerCase()), ScoreMode.None); - List parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class); + List parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class, IndexCoordinates.of(ParentEntity.INDEX)); // we're expecting only the first parent as result assertThat(parents).hasSize(1); @@ -105,7 +105,7 @@ public void shouldUpdateChild() throws Exception { XContentBuilder builder; builder = jsonBuilder().startObject().field("name", newChildName).endObject(); updateRequest.doc(builder); - UpdateResponse response = update(updateRequest); + UpdateResponse response = update(updateRequest, IndexCoordinates.of(ParentEntity.INDEX).withTypes( ParentEntity.CHILD_TYPE)); assertThat(response.getShardInfo().getSuccessful()).isEqualTo(1); } @@ -124,7 +124,7 @@ public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfNotRoutingSetOnU XContentBuilder builder; builder = jsonBuilder().startObject().field("name", newChildName).endObject(); updateRequest.doc(builder); - update(updateRequest); + update(updateRequest, IndexCoordinates.of(ParentEntity.INDEX).withTypes( ParentEntity.CHILD_TYPE)); } @Ignore(value = "DATAES-421") @@ -142,7 +142,7 @@ public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfRoutingOnlySetOn builder = jsonBuilder().startObject().field("name", newChildName).endObject(); updateRequest.doc(builder); updateRequest.doc().routing(parent.getId()); - update(updateRequest); + update(updateRequest, IndexCoordinates.of(ParentEntity.INDEX).withTypes( ParentEntity.CHILD_TYPE)); } private ParentEntity index(String parentId, String name) { @@ -151,7 +151,7 @@ private ParentEntity index(String parentId, String name) { IndexQuery index = new IndexQuery(); index.setId(parent.getId()); index.setObject(parent); - elasticsearchTemplate.index(index); + elasticsearchTemplate.index(index, IndexCoordinates.of(ParentEntity.INDEX).withTypes( ParentEntity.PARENT_TYPE)); return parent; } @@ -163,19 +163,17 @@ private ChildEntity index(String childId, String parentId, String name) { index.setId(child.getId()); index.setObject(child); index.setParentId(child.getParentId()); - elasticsearchTemplate.index(index); + elasticsearchTemplate.index(index, IndexCoordinates.of(ParentEntity.INDEX).withTypes( ParentEntity.CHILD_TYPE)); return child; } - private UpdateResponse update(UpdateRequest updateRequest) { + private UpdateResponse update(UpdateRequest updateRequest, IndexCoordinates index) { UpdateQuery update = new UpdateQuery(); update.setId(updateRequest.id()); - update.setType(updateRequest.type()); - update.setIndexName(updateRequest.index()); update.setUpdateRequest(updateRequest); - return elasticsearchTemplate.update(update); + return elasticsearchTemplate.update(update, index); } /** 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 3436cfa09..5c6971cc3 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -45,11 +45,11 @@ import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.cluster.metadata.AliasMetaData; import org.elasticsearch.index.VersionType; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; +import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; @@ -75,7 +75,6 @@ import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.util.CloseableIterator; -import org.springframework.test.util.ReflectionTestUtils; /** * Base for testing rest/transport templates. Contains the test common to both implementing classes. @@ -108,6 +107,8 @@ public abstract class ElasticsearchTemplateTests { private static final String INDEX_3_NAME = "test-index-3"; private static final String TYPE_NAME = "test-type"; + protected final IndexCoordinates index = IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME); + @Autowired protected ElasticsearchOperations elasticsearchTemplate; @BeforeEach @@ -149,13 +150,13 @@ public void shouldReturnCountForGivenCriteriaQuery() { .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); // when - long count = elasticsearchTemplate.count(criteriaQuery, SampleEntity.class); + long count = elasticsearchTemplate.count(criteriaQuery, SampleEntity.class, index); // then assertThat(count).isEqualTo(1); @@ -170,13 +171,13 @@ public void shouldReturnCountForGivenSearchQuery() { .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); // when - long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class); + long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class, index); // then assertThat(count).isEqualTo(1); } @@ -189,12 +190,12 @@ public void shouldReturnObjectForGivenId() { SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); // when GetQuery getQuery = new GetQuery(); getQuery.setId(documentId); - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + SampleEntity sampleEntity1 = elasticsearchTemplate.get(getQuery, SampleEntity.class, index); // then assertThat(sampleEntity1).isNotNull(); @@ -217,12 +218,12 @@ public void shouldReturnObjectsForGivenIdsUsingMultiGet() { List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(Arrays.asList(documentId, documentId2)).build(); - List sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class); + List sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class, index); // then assertThat(sampleEntities).hasSize(2); @@ -246,13 +247,13 @@ public void shouldReturnObjectsForGivenIdsUsingMultiGetWithFields() { List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when NativeSearchQuery query = new NativeSearchQueryBuilder().withIds(Arrays.asList(documentId, documentId2)) .withFields("message", "type").build(); - List sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class); + List sampleEntities = elasticsearchTemplate.multiGet(query, SampleEntity.class, index); // then assertThat(sampleEntities).hasSize(2); @@ -268,13 +269,13 @@ public void shouldReturnPageForGivenSearchQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities).isNotNull(); @@ -291,7 +292,7 @@ public void shouldReturnPageUsingLocalPreferenceForGivenSearchQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQueryWithValidPreference = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -299,7 +300,7 @@ public void shouldReturnPageUsingLocalPreferenceForGivenSearchQuery() { // when Page sampleEntities = elasticsearchTemplate.queryForPage(searchQueryWithValidPreference, - SampleEntity.class); + SampleEntity.class, index); // then assertThat(sampleEntities).isNotNull(); @@ -316,7 +317,7 @@ public void shouldThrowExceptionWhenInvalidPreferenceForSearchQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQueryWithInvalidPreference = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -324,7 +325,7 @@ public void shouldThrowExceptionWhenInvalidPreferenceForSearchQuery() { // when assertThatThrownBy(() -> { - elasticsearchTemplate.queryForPage(searchQueryWithInvalidPreference, SampleEntity.class); + elasticsearchTemplate.queryForPage(searchQueryWithInvalidPreference, SampleEntity.class, index); }).isInstanceOf(Exception.class); } @@ -336,16 +337,16 @@ public void shouldPassIndicesOptionsForGivenSearchQuery() { SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery idxQuery = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(sampleEntity.getId()) - .withObject(sampleEntity).build(); + IndexQuery idxQuery = new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery); - elasticsearchTemplate.refresh(INDEX_1_NAME); + elasticsearchTemplate.index(idxQuery, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_1_NAME, INDEX_2_NAME).withIndicesOptions(IndicesOptions.lenientExpandOpen()).build(); - Page entities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page entities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, + IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); // then assertThat(entities).isNotNull(); @@ -371,12 +372,12 @@ public void shouldDoBulkIndex() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(2); } @@ -393,24 +394,23 @@ public void shouldDoBulkUpdate() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); IndexRequest indexRequest = new IndexRequest(); indexRequest.source("message", messageAfterUpdate); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId).withClass(SampleEntity.class) - .withIndexRequest(indexRequest).build(); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId).withIndexRequest(indexRequest).build(); List queries = new ArrayList<>(); queries.add(updateQuery); // when - elasticsearchTemplate.bulkUpdate(queries); + elasticsearchTemplate.bulkUpdate(queries, index); // then GetQuery getQuery = new GetQuery(); getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + SampleEntity indexedEntity = elasticsearchTemplate.get(getQuery, SampleEntity.class, index); assertThat(indexedEntity.getMessage()).isEqualTo(messageAfterUpdate); } @@ -424,15 +424,15 @@ public void shouldDeleteDocumentForGivenId() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); // when - elasticsearchTemplate.delete(INDEX_NAME_SAMPLE_ENTITY, TYPE_NAME, documentId); + elasticsearchTemplate.delete(documentId, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(0); } @@ -446,15 +446,15 @@ public void shouldDeleteEntityForGivenId() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); // when - elasticsearchTemplate.delete(SampleEntity.class, documentId); + elasticsearchTemplate.delete(documentId, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(0); } @@ -468,18 +468,18 @@ public void shouldDeleteDocumentForGivenQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); // when DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(termQuery("id", documentId)); - elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); + elasticsearchTemplate.delete(deleteQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(0); } @@ -492,35 +492,31 @@ public void shouldDeleteAcrossIndex() { .version(System.currentTimeMillis()) // .build(); - IndexQuery idxQuery1 = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(randomNumeric(5)) - .withObject(sampleEntity).build(); + IndexQuery idxQuery1 = new IndexQueryBuilder().withId(randomNumeric(5)).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery1); - elasticsearchTemplate.refresh(INDEX_1_NAME); + elasticsearchTemplate.index(idxQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); - IndexQuery idxQuery2 = new IndexQueryBuilder().withIndexName(INDEX_2_NAME).withId(randomNumeric(5)) - .withObject(sampleEntity).build(); + IndexQuery idxQuery2 = new IndexQueryBuilder().withId(randomNumeric(5)).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery2); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(idxQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); // when DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(typeQuery(TYPE_NAME)); - deleteQuery.setType(TYPE_NAME); - deleteQuery.setIndex("test-index-*"); - elasticsearchTemplate.delete(deleteQuery); + elasticsearchTemplate.delete(deleteQuery, IndexCoordinates.of("test-index-*").withTypes(TYPE_NAME)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "foo")) .withIndices(INDEX_1_NAME, INDEX_2_NAME) // .build(); - assertThat(elasticsearchTemplate.count(searchQuery)).isEqualTo(0); + assertThat(elasticsearchTemplate.count(searchQuery, IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME))).isEqualTo(0); } @Test // DATAES-547 @@ -532,35 +528,31 @@ public void shouldDeleteAcrossIndexWhenNoMatchingDataPresent() { .version(System.currentTimeMillis()) // .build(); - IndexQuery idxQuery1 = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(randomNumeric(5)) - .withObject(sampleEntity).build(); + IndexQuery idxQuery1 = new IndexQueryBuilder().withId(randomNumeric(5)).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery1); - elasticsearchTemplate.refresh(INDEX_1_NAME); + elasticsearchTemplate.index(idxQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); - IndexQuery idxQuery2 = new IndexQueryBuilder().withIndexName(INDEX_2_NAME).withId(randomNumeric(5)) - .withObject(sampleEntity).build(); + IndexQuery idxQuery2 = new IndexQueryBuilder().withId(randomNumeric(5)).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery2); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(idxQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); // when DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(termQuery("message", "negative")); - deleteQuery.setType(TYPE_NAME); - deleteQuery.setIndex("test-index-*"); - elasticsearchTemplate.delete(deleteQuery); + elasticsearchTemplate.delete(deleteQuery, IndexCoordinates.of("test-index-*").withTypes(TYPE_NAME)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "positive")) .withIndices(INDEX_1_NAME, INDEX_2_NAME) // .build(); - assertThat(elasticsearchTemplate.count(searchQuery)).isEqualTo(2); + assertThat(elasticsearchTemplate.count(searchQuery, IndexCoordinates.of("test-index-*"))).isEqualTo(2); } @Test @@ -572,14 +564,14 @@ public void shouldFilterSearchResultsForGivenFilter() { .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withFilter(boolQuery().filter(termQuery("id", documentId))).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(1); @@ -607,14 +599,14 @@ public void shouldSortResultsGivenSortCriteria() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withSort(new FieldSortBuilder("rate").order(SortOrder.ASC)).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(3); @@ -643,7 +635,7 @@ public void shouldSortResultsGivenMultipleSortCriteria() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -651,7 +643,7 @@ public void shouldSortResultsGivenMultipleSortCriteria() { .withSort(new FieldSortBuilder("message").order(SortOrder.ASC)).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(3); @@ -682,14 +674,14 @@ public void shouldSortResultsGivenNullFirstSortCriteria() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsFirst()))).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(3); @@ -720,14 +712,14 @@ public void shouldSortResultsGivenNullLastSortCriteria() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withPageable(PageRequest.of(0, 10, Sort.by(Sort.Order.asc("message").nullsLast()))).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(3); @@ -744,7 +736,7 @@ public void shouldSortResultsByScore() { SampleEntity.builder().id("2").message("yellow green").build(), // SampleEntity.builder().id("3").message("blue").build()); - elasticsearchTemplate.bulkIndex(getIndexQueries(entities)); + elasticsearchTemplate.bulkIndex(getIndexQueries(entities), index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() // @@ -753,7 +745,7 @@ public void shouldSortResultsByScore() { .build(); // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page.getTotalElements()).isEqualTo(2); @@ -771,13 +763,13 @@ public void shouldExecuteStringQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(1); @@ -798,7 +790,7 @@ public void shouldUseScriptedFields() { indexQuery.setId(documentId); indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); Map params = new HashMap<>(); @@ -808,7 +800,7 @@ public void shouldUseScriptedFields() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withScriptField( new ScriptField("scriptedRate", new Script(ScriptType.INLINE, "expression", "doc['rate'] * factor", params))) .build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(1); @@ -825,13 +817,13 @@ public void shouldReturnPageableResultsGivenStringQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), PageRequest.of(0, 10)); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); @@ -851,14 +843,14 @@ public void shouldReturnSortedPageableResultsGivenStringQuery() { indexQuery.setId(documentId); indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); StringQuery stringQuery = new StringQuery(matchAllQuery().toString(), PageRequest.of(0, 10), Sort.by(Order.asc("message"))); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(stringQuery, SampleEntity.class, index); // then assertThat(sampleEntities.getTotalElements()).isGreaterThanOrEqualTo(1); @@ -874,13 +866,13 @@ public void shouldReturnObjectMatchingGivenStringQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); StringQuery stringQuery = new StringQuery(termQuery("id", documentId).toString()); // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class, index); // then assertThat(sampleEntity1).isNotNull(); @@ -911,12 +903,12 @@ public void shouldExecuteGivenCriteriaQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(sampleEntity1).isNotNull(); @@ -932,17 +924,17 @@ public void shouldDeleteGivenCriteriaQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); // when - elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class); + elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class, index); elasticsearchTemplate.refresh(SampleEntity.class); // then StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); + List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class, index); assertThat(sampleEntities).isEmpty(); } @@ -959,13 +951,13 @@ public void shouldReturnSpecifiedFields() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withFields("message").build(); // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -987,7 +979,7 @@ public void shouldReturnFieldsBasedOnSourceFilter() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); FetchSourceFilterBuilder sourceFilter = new FetchSourceFilterBuilder(); @@ -997,7 +989,7 @@ public void shouldReturnFieldsBasedOnSourceFilter() { .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withSourceFilter(sourceFilter.build()).build(); // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -1021,12 +1013,14 @@ public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); String documentId2 = randomNumeric(5); - elasticsearchTemplate.index(getIndexQuery( - SampleEntity.builder().id(documentId2).message(sampleMessage).version(System.currentTimeMillis()).build())); + elasticsearchTemplate.index( + getIndexQuery( + SampleEntity.builder().id(documentId2).message(sampleMessage).version(System.currentTimeMillis()).build()), + index); elasticsearchTemplate.refresh(SampleEntity.class); MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); @@ -1035,7 +1029,8 @@ public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { moreLikeThisQuery.setMinDocFreq(1); // when - Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.moreLikeThis(moreLikeThisQuery, SampleEntity.class, + index); // then assertThat(sampleEntities.getTotalElements()).isEqualTo(1); @@ -1049,7 +1044,7 @@ public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() { List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1058,7 +1053,8 @@ public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() { criteriaQuery.addTypes(TYPE_NAME); criteriaQuery.setPageable(PageRequest.of(0, 10)); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, + index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -1075,7 +1071,7 @@ public void shouldReturnResultsWithScanAndScrollForGivenSearchQuery() { List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1083,7 +1079,7 @@ public void shouldReturnResultsWithScanAndScrollForGivenSearchQuery() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withPageable(PageRequest.of(0, 10)).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -1100,7 +1096,7 @@ public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForCriteriaQue List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1110,7 +1106,8 @@ public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForCriteriaQue criteriaQuery.addFields("message"); criteriaQuery.setPageable(PageRequest.of(0, 10)); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, + index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1129,7 +1126,7 @@ public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForSearchCrite List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1137,7 +1134,7 @@ public void shouldReturnResultsWithScanAndScrollForSpecifiedFieldsForSearchCrite .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withFields("message").withQuery(matchAllQuery()) .withPageable(PageRequest.of(0, 10)).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1156,7 +1153,7 @@ public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenCri List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1165,7 +1162,8 @@ public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenCri criteriaQuery.addTypes(TYPE_NAME); criteriaQuery.setPageable(PageRequest.of(0, 10)); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, + index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1184,14 +1182,14 @@ public void shouldReturnResultsForScanAndScrollWithCustomResultMapperForGivenSea List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withPageable(PageRequest.of(0, 10)).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1210,14 +1208,15 @@ public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQueryAndClass() List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); criteriaQuery.setPageable(PageRequest.of(0, 10)); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, + index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1236,14 +1235,14 @@ public void shouldReturnResultsWithScanAndScrollForGivenSearchQueryAndClass() { List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withPageable(PageRequest.of(0, 10)).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); String scrollId = scroll.getScrollId(); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { @@ -1262,7 +1261,7 @@ public void shouldReturnResultsWithStreamForGivenCriteriaQuery() { List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -1271,7 +1270,7 @@ public void shouldReturnResultsWithStreamForGivenCriteriaQuery() { criteriaQuery.addTypes(TYPE_NAME); criteriaQuery.setPageable(PageRequest.of(0, 10)); - CloseableIterator stream = elasticsearchTemplate.stream(criteriaQuery, SampleEntity.class); + CloseableIterator stream = elasticsearchTemplate.stream(criteriaQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (stream.hasNext()) { sampleEntities.add(stream.next()); @@ -1319,16 +1318,16 @@ public void shouldReturnListForGivenCriteria() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery singleCriteriaQuery = new CriteriaQuery(new Criteria("message").contains("test")); CriteriaQuery multipleCriteriaQuery = new CriteriaQuery( new Criteria("message").contains("some").and("message").contains("message")); List sampleEntitiesForSingleCriteria = elasticsearchTemplate.queryForList(singleCriteriaQuery, - SampleEntity.class); + SampleEntity.class, index); List sampleEntitiesForAndCriteria = elasticsearchTemplate.queryForList(multipleCriteriaQuery, - SampleEntity.class); + SampleEntity.class, index); // then assertThat(sampleEntitiesForSingleCriteria).hasSize(2); assertThat(sampleEntitiesForAndCriteria).hasSize(1); @@ -1356,11 +1355,11 @@ public void shouldReturnListForGivenStringQuery() { List indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); StringQuery stringQuery = new StringQuery(matchAllQuery().toString()); - List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class); + List sampleEntities = elasticsearchTemplate.queryForList(stringQuery, SampleEntity.class, index); // then assertThat(sampleEntities).hasSize(3); @@ -1389,10 +1388,11 @@ public void shouldPutMappingWithCustomIndexName() throws Exception { elasticsearchTemplate.createIndex(INDEX_1_NAME); // when - elasticsearchTemplate.putMapping(INDEX_1_NAME, TYPE_NAME, entity); + elasticsearchTemplate.putMapping(IndexCoordinates.of(INDEX_1_NAME).withTypes(TYPE_NAME), entity); // then - Map mapping = elasticsearchTemplate.getMapping(INDEX_1_NAME, TYPE_NAME); + Map mapping = elasticsearchTemplate + .getMapping(IndexCoordinates.of(INDEX_1_NAME).withTypes(TYPE_NAME)); assertThat(mapping.get("properties")).isNotNull(); } @@ -1422,21 +1422,20 @@ public void shouldDoPartialUpdateForExistingDocument() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); IndexRequest indexRequest = new IndexRequest(); indexRequest.source("message", messageAfterUpdate); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId).withClass(SampleEntity.class) - .withIndexRequest(indexRequest).build(); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId).withIndexRequest(indexRequest).build(); // when - elasticsearchTemplate.update(updateQuery); + elasticsearchTemplate.update(updateQuery, index); // then GetQuery getQuery = new GetQuery(); getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + SampleEntity indexedEntity = elasticsearchTemplate.get(getQuery, SampleEntity.class, index); assertThat(indexedEntity.getMessage()).isEqualTo(messageAfterUpdate); } @@ -1453,20 +1452,40 @@ public void shouldUseUpsertOnUpdate() throws IOException { .upsert(doc); UpdateQuery updateQuery = new UpdateQueryBuilder() // - .withClass(SampleEntity.class) // .withId("1") // .withUpdateRequest(updateRequest).build(); // when - UpdateRequest request = ((UpdateRequestBuilder) ReflectionTestUtils // - .invokeMethod(elasticsearchTemplate, "prepareUpdate", updateQuery)) // - .request(); + UpdateRequest request = elasticsearchTemplate.getRequestFactory().updateRequest(updateQuery, + IndexCoordinates.of("index")); // then assertThat(request).isNotNull(); assertThat(request.upsertRequest()).isNotNull(); } + @Test // DATAES-693 + public void shouldReturnSourceWhenRequested() throws IOException { + // given + Map doc = new HashMap<>(); + doc.put("id", "1"); + doc.put("message", "test"); + + UpdateRequest updateRequest = new UpdateRequest().doc(doc).fetchSource(FetchSourceContext.FETCH_SOURCE); + + UpdateQuery updateQuery = new UpdateQueryBuilder() // + .withId("1") // + .withUpdateRequest(updateRequest).build(); + + // when + UpdateRequest request = elasticsearchTemplate.getRequestFactory().updateRequest(updateQuery, + IndexCoordinates.of("index")); + + // then + assertThat(request).isNotNull(); + assertThat(request.fetchSource()).isEqualTo(FetchSourceContext.FETCH_SOURCE); + } + @Test public void shouldDoUpsertIfDocumentDoesNotExist() { @@ -1476,15 +1495,15 @@ public void shouldDoUpsertIfDocumentDoesNotExist() { IndexRequest indexRequest = new IndexRequest(); indexRequest.source("message", message); UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId).withDoUpsert(true) - .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); + .withIndexRequest(indexRequest).build(); // when - elasticsearchTemplate.update(updateQuery); + elasticsearchTemplate.update(updateQuery, index); // then GetQuery getQuery = new GetQuery(); getQuery.setId(documentId); - SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + SampleEntity indexedEntity = elasticsearchTemplate.get(getQuery, SampleEntity.class, index); assertThat(indexedEntity.getMessage()).isEqualTo(message); } @@ -1497,11 +1516,11 @@ public void shouldPassIndicesOptionsForGivenSearchScrollQuery() { SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery idxQuery = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(sampleEntity.getId()) - .withObject(sampleEntity).build(); + IndexQuery idxQuery = new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build(); - elasticsearchTemplate.index(idxQuery); - elasticsearchTemplate.refresh(INDEX_1_NAME); + IndexCoordinates index = IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type"); + elasticsearchTemplate.index(idxQuery, index); + elasticsearchTemplate.refresh(index); // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -1510,7 +1529,7 @@ public void shouldPassIndicesOptionsForGivenSearchScrollQuery() { List entities = new ArrayList<>(); ScrolledPage scroll = elasticsearchTemplate.startScroll(scrollTimeInMillis, searchQuery, - SampleEntity.class); + SampleEntity.class, index); entities.addAll(scroll.getContent()); @@ -1535,7 +1554,7 @@ public void shouldReturnSameEntityForMultiSearch() { indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when @@ -1546,7 +1565,7 @@ public void shouldReturnSameEntityForMultiSearch() { queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ac")).build()); // then - List> sampleEntities = elasticsearchTemplate.queryForPage(queries, SampleEntity.class); + List> sampleEntities = elasticsearchTemplate.queryForPage(queries, SampleEntity.class, index); for (Page sampleEntity : sampleEntities) { assertThat(sampleEntity.getTotalElements()).isEqualTo(1); } @@ -1562,23 +1581,22 @@ public void shouldReturnDifferentEntityForMultiSearch() { elasticsearchTemplate.putMapping(clazz); elasticsearchTemplate.refresh(clazz); - List indexQueries = new ArrayList<>(); - - indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); - indexQueries.add(buildIndex(Book.builder().id("2").description("bc").build())); + IndexCoordinates bookIndex = IndexCoordinates.of("test-index-book-core-template").withTypes("book"); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.index(buildIndex(SampleEntity.builder().id("1").message("ab").build()), index); + elasticsearchTemplate.index(buildIndex(Book.builder().id("2").description("bc").build()), bookIndex); elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(clazz); // when List queries = new ArrayList<>(); - queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("message", "ab")).build()); queries.add(new NativeSearchQueryBuilder().withQuery(termQuery("description", "bc")).build()); + List> pages = elasticsearchTemplate.queryForPage(queries, Lists.newArrayList(SampleEntity.class, clazz), + IndexCoordinates.of(index.getIndexName(), bookIndex.getIndexName())); + // then - List> pages = elasticsearchTemplate.queryForPage(queries, Lists.newArrayList(SampleEntity.class, clazz)); Page page0 = pages.get(0); assertThat(page0.getTotalElements()).isEqualTo(1L); assertThat(page0.getContent().get(0).getClass()).isEqualTo(SampleEntity.class); @@ -1597,20 +1615,18 @@ public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); // when DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(termQuery("id", documentId)); - deleteQuery.setIndex(INDEX_NAME_SAMPLE_ENTITY); - deleteQuery.setType(TYPE_NAME); - elasticsearchTemplate.delete(deleteQuery); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.delete(deleteQuery, index); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(0); } @@ -1622,17 +1638,15 @@ public void shouldIndexDocumentForSpecifiedSource() { IndexQuery indexQuery = new IndexQuery(); indexQuery.setId("2333343434"); indexQuery.setSource(documentSource); - indexQuery.setIndexName(INDEX_NAME_SAMPLE_ENTITY); - indexQuery.setType(TYPE_NAME); // when - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME)); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", indexQuery.getId())) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).build(); // then - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(page).isNotNull(); assertThat(page.getContent()).hasSize(1); assertThat(page.getContent().get(0).getId()).isEqualTo(indexQuery.getId()); @@ -1644,11 +1658,10 @@ public void shouldThrowElasticsearchExceptionWhenNoDocumentSpecified() { // given final IndexQuery indexQuery = new IndexQuery(); indexQuery.setId("2333343434"); - indexQuery.setIndexName(INDEX_NAME_SAMPLE_ENTITY); - indexQuery.setType(TYPE_NAME); // when - assertThatThrownBy(() -> elasticsearchTemplate.index(indexQuery)).isInstanceOf(ElasticsearchException.class); + assertThatThrownBy(() -> elasticsearchTemplate.index(indexQuery, + IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME))).isInstanceOf(ElasticsearchException.class); } @Test @@ -1656,12 +1669,12 @@ public void shouldReturnIds() { // given List entities = createSampleEntitiesWithMessage("Test message", 30); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "message")) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withPageable(PageRequest.of(0, 100)).build(); // then - List ids = elasticsearchTemplate.queryForIds(searchQuery); + List ids = elasticsearchTemplate.queryForIds(searchQuery, SampleEntity.class, index); assertThat(ids).hasSize(30); } @@ -1674,7 +1687,7 @@ public void shouldReturnDocumentAboveMinimalScoreGivenQuery() { indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when @@ -1682,7 +1695,7 @@ public void shouldReturnDocumentAboveMinimalScoreGivenQuery() { .withQuery(boolQuery().must(wildcardQuery("message", "*a*")).should(wildcardQuery("message", "*b*"))) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withMinScore(2.0F).build(); - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page.getTotalElements()).isEqualTo(1); @@ -1699,14 +1712,14 @@ public void shouldReturnScores() { indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac xz hi").build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("message", "xz")) .withSort(SortBuilders.fieldSort("message")).withTrackScores(true).build(); - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page).isInstanceOf(AggregatedPage.class); @@ -1727,14 +1740,14 @@ public void shouldDoIndexWithoutId() { indexQuery.setObject(sampleEntity); // when - String documentId = elasticsearchTemplate.index(indexQuery); + String documentId = elasticsearchTemplate.index(indexQuery, index); // then assertThat(sampleEntity.getId()).isEqualTo(documentId); GetQuery getQuery = new GetQuery(); getQuery.setId(documentId); - SampleEntity result = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class); + SampleEntity result = elasticsearchTemplate.get(getQuery, SampleEntity.class, index); assertThat(result.getId()).isEqualTo(documentId); } @@ -1762,12 +1775,12 @@ public void shouldDoBulkIndexWithoutId() { indexQueries.add(indexQuery2); // when - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(2); List content = sampleEntities.getContent(); @@ -1796,27 +1809,23 @@ public void shouldIndexMapWithIndexNameAndTypeAtRuntime() { IndexQuery indexQuery1 = new IndexQuery(); indexQuery1.setId("1"); indexQuery1.setObject(person1); - indexQuery1.setIndexName(INDEX_NAME_SAMPLE_ENTITY); - indexQuery1.setType(TYPE_NAME); IndexQuery indexQuery2 = new IndexQuery(); indexQuery2.setId("2"); indexQuery2.setObject(person2); - indexQuery2.setIndexName(INDEX_NAME_SAMPLE_ENTITY); - indexQuery2.setType(TYPE_NAME); List indexQueries = new ArrayList<>(); indexQueries.add(indexQuery1); indexQueries.add(indexQuery2); // when - elasticsearchTemplate.bulkIndex(indexQueries); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.bulkIndex(indexQueries, index); + elasticsearchTemplate.refresh(index); // then NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME_SAMPLE_ENTITY) .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, Map.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, Map.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(2); List content = sampleEntities.getContent(); @@ -1832,28 +1841,27 @@ public void shouldIndexGteEntityWithVersionType() { GTEVersionEntity entity = GTEVersionEntity.builder().id(documentId).name("FooBar") .version(System.currentTimeMillis()).build(); - IndexQueryBuilder indexQueryBuilder = new IndexQueryBuilder().withId(documentId) - .withIndexName(INDEX_NAME_SAMPLE_ENTITY).withType(TYPE_NAME).withVersion(entity.getVersion()) + IndexQueryBuilder indexQueryBuilder = new IndexQueryBuilder().withId(documentId).withVersion(entity.getVersion()) .withObject(entity); - elasticsearchTemplate.index(indexQueryBuilder.build()); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.index(indexQueryBuilder.build(), index); + elasticsearchTemplate.refresh(index); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME_SAMPLE_ENTITY) .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); // when - Page entities = elasticsearchTemplate.queryForPage(searchQuery, GTEVersionEntity.class); + Page entities = elasticsearchTemplate.queryForPage(searchQuery, GTEVersionEntity.class, index); // then assertThat(entities).isNotNull(); assertThat(entities.getTotalElements()).isGreaterThanOrEqualTo(1); // reindex with same version - elasticsearchTemplate.index(indexQueryBuilder.build()); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.index(indexQueryBuilder.build(), index); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); // reindex with version one below assertThatThrownBy(() -> { - elasticsearchTemplate.index(indexQueryBuilder.withVersion(entity.getVersion() - 1).build()); + elasticsearchTemplate.index(indexQueryBuilder.withVersion(entity.getVersion() - 1).build(), index); }).hasMessageContaining("version").hasMessageContaining("conflict"); } @@ -1865,17 +1873,16 @@ public void shouldIndexSampleEntityWithIndexAndTypeAtRuntime() { SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery = new IndexQueryBuilder().withId(documentId).withIndexName(INDEX_NAME_SAMPLE_ENTITY) - .withType(TYPE_NAME).withObject(sampleEntity).build(); + IndexQuery indexQuery = new IndexQueryBuilder().withId(documentId).withObject(sampleEntity).build(); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.index(indexQuery, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices(INDEX_NAME_SAMPLE_ENTITY) .withTypes(TYPE_NAME).withQuery(matchAllQuery()).build(); // when - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(sampleEntities).isNotNull(); @@ -1891,13 +1898,13 @@ public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexUsingCriteriaQue .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); criteriaQuery.addIndices(INDEX_NAME_SAMPLE_ENTITY); // when - long count = elasticsearchTemplate.count(criteriaQuery); + long count = elasticsearchTemplate.count(criteriaQuery, SampleEntity.class, index); // then assertThat(count).isEqualTo(1); @@ -1912,13 +1919,13 @@ public void shouldReturnCountForGivenSearchQueryWithGivenIndexUsingSearchQuery() .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).build(); // when - long count = elasticsearchTemplate.count(searchQuery); + long count = elasticsearchTemplate.count(searchQuery, SampleEntity.class, index); // then assertThat(count).isEqualTo(1); @@ -1933,7 +1940,7 @@ public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexAndTypeUsingCrit .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); criteriaQuery.addIndices(INDEX_NAME_SAMPLE_ENTITY); @@ -1941,7 +1948,7 @@ public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexAndTypeUsingCrit // when - long count = elasticsearchTemplate.count(criteriaQuery); + long count = elasticsearchTemplate.count(criteriaQuery, index); // then assertThat(count).isEqualTo(1); } @@ -1955,13 +1962,13 @@ public void shouldReturnCountForGivenSearchQueryWithGivenIndexAndTypeUsingSearch .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).build(); // when - long count = elasticsearchTemplate.count(searchQuery); + long count = elasticsearchTemplate.count(searchQuery, index); // then assertThat(count).isEqualTo(1); @@ -1976,25 +1983,24 @@ public void shouldReturnCountForGivenCriteriaQueryWithGivenMultiIndices() { SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withIndexName(INDEX_1_NAME) - .withObject(sampleEntity1).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withObject(sampleEntity1).build(); String documentId2 = randomNumeric(5); SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withIndexName(INDEX_2_NAME) - .withObject(sampleEntity2).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withObject(sampleEntity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); criteriaQuery.addIndices(INDEX_1_NAME, INDEX_2_NAME); // when - long count = elasticsearchTemplate.count(criteriaQuery); + long count = elasticsearchTemplate.count(criteriaQuery, IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); // then assertThat(count).isEqualTo(2); @@ -2009,25 +2015,24 @@ public void shouldReturnCountForGivenSearchQueryWithGivenMultiIndices() { SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withIndexName(INDEX_1_NAME) - .withObject(sampleEntity1).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withObject(sampleEntity1).build(); String documentId2 = randomNumeric(5); SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withIndexName(INDEX_2_NAME) - .withObject(sampleEntity2).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withObject(sampleEntity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_1_NAME, INDEX_2_NAME).build(); // when - long count = elasticsearchTemplate.count(searchQuery); + long count = elasticsearchTemplate.count(searchQuery, IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); // then assertThat(count).isEqualTo(2); @@ -2038,8 +2043,7 @@ private void cleanUpIndices() { elasticsearchTemplate.deleteIndex(INDEX_2_NAME); elasticsearchTemplate.createIndex(INDEX_1_NAME); elasticsearchTemplate.createIndex(INDEX_2_NAME); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); } @Test // DATAES-71 @@ -2078,25 +2082,24 @@ public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexNameForSpecificI SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withIndexName(INDEX_1_NAME) - .withObject(sampleEntity1).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withObject(sampleEntity1).build(); String documentId2 = randomNumeric(5); SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withIndexName(INDEX_2_NAME) - .withObject(sampleEntity2).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withObject(sampleEntity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); criteriaQuery.addIndices(INDEX_1_NAME); // when - long count = elasticsearchTemplate.count(criteriaQuery); + long count = elasticsearchTemplate.count(criteriaQuery, IndexCoordinates.of(INDEX_1_NAME)); // then assertThat(count).isEqualTo(1); @@ -2111,25 +2114,24 @@ public void shouldReturnCountForGivenSearchQueryWithGivenIndexNameForSpecificInd SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withIndexName(INDEX_1_NAME) - .withObject(sampleEntity1).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withObject(sampleEntity1).build(); String documentId2 = randomNumeric(5); SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withIndexName(INDEX_2_NAME) - .withObject(sampleEntity2).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withObject(sampleEntity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(INDEX_1_NAME) .build(); // when - long count = elasticsearchTemplate.count(searchQuery); + long count = elasticsearchTemplate.count(searchQuery, IndexCoordinates.of(INDEX_1_NAME)); // then assertThat(count).isEqualTo(1); @@ -2144,13 +2146,13 @@ public void shouldThrowAnExceptionForGivenCriteriaQueryWhenNoIndexSpecifiedForCo .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()); // when assertThatThrownBy(() -> { - long count = elasticsearchTemplate.count(criteriaQuery); + elasticsearchTemplate.count(criteriaQuery, (IndexCoordinates) null); }).isInstanceOf(IllegalArgumentException.class); } @@ -2163,13 +2165,13 @@ public void shouldThrowAnExceptionForGivenSearchQueryWhenNoIndexSpecifiedForCoun .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); // when assertThatThrownBy(() -> { - elasticsearchTemplate.count(searchQuery); + elasticsearchTemplate.count(searchQuery, (IndexCoordinates) null); }).isInstanceOf(IllegalArgumentException.class); } @@ -2249,25 +2251,25 @@ public void shouldTestResultsAcrossMultipleIndices() { SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withIndexName(INDEX_1_NAME) - .withObject(sampleEntity1).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()).withObject(sampleEntity1).build(); String documentId2 = randomNumeric(5); SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); - IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withIndexName(INDEX_2_NAME) - .withObject(sampleEntity2).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()).withObject(sampleEntity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("test-type")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("test-type")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_1_NAME, INDEX_2_NAME).build(); // when - List sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class); + List sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class, + IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); // then assertThat(sampleEntities).hasSize(2); @@ -2283,19 +2285,19 @@ public void shouldComposeObjectsReturnedFromHeterogeneousIndexes() { HetroEntity1 entity1 = new HetroEntity1(randomNumeric(3), "aFirstName"); HetroEntity2 entity2 = new HetroEntity2(randomNumeric(4), "aLastName"); - IndexQuery idxQuery1 = new IndexQueryBuilder().withIndexName(INDEX_1_NAME).withId(entity1.getId()) - .withObject(entity1).build(); - IndexQuery idxQuery2 = new IndexQueryBuilder().withIndexName(INDEX_2_NAME).withId(entity2.getId()) - .withObject(entity2).build(); + IndexQuery indexQuery1 = new IndexQueryBuilder().withId(entity1.getId()).withObject(entity1).build(); + IndexQuery indexQuery2 = new IndexQueryBuilder().withId(entity2.getId()).withObject(entity2).build(); - elasticsearchTemplate.bulkIndex(Arrays.asList(idxQuery1, idxQuery2)); - elasticsearchTemplate.refresh(INDEX_1_NAME); - elasticsearchTemplate.refresh(INDEX_2_NAME); + elasticsearchTemplate.index(indexQuery1, IndexCoordinates.of(INDEX_1_NAME).withTypes("hetro")); + elasticsearchTemplate.index(indexQuery2, IndexCoordinates.of(INDEX_2_NAME).withTypes("hetro")); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_1_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_2_NAME)); // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withTypes("hetro") .withIndices(INDEX_1_NAME, INDEX_2_NAME).build(); - Page page = elasticsearchTemplate.queryForPage(searchQuery, ResultAggregator.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, ResultAggregator.class, + IndexCoordinates.of(INDEX_1_NAME, INDEX_2_NAME)); assertThat(page.getTotalElements()).isEqualTo(2); } @@ -2315,20 +2317,6 @@ public void shouldCreateIndexUsingServerDefaultConfiguration() { assertThat(setting.get("index.number_of_replicas")).isEqualTo("1"); } - @Test - public void shouldReadFileFromClasspathRetainingNewlines() { - - // given - String settingsFile = "/settings/test-settings.yml"; - - // when - String content = ElasticsearchTemplate.readFileFromClasspath(settingsFile); - - // then - assertThat(content).isEqualTo("index:\n" + " number_of_shards: 1\n" + " number_of_replicas: 0\n" + " analysis:\n" - + " analyzer:\n" + " emailAnalyzer:\n" + " type: custom\n" + " tokenizer: uax_url_email"); - } - @Test // DATAES-531 public void shouldReturnMappingForGivenEntityClass() { @@ -2360,19 +2348,19 @@ public void shouldDeleteOnlyDocumentsMatchedByDeleteQuery() { String remainingDocumentId = UUID.randomUUID().toString(); indexQueries.add(getIndexQuery(SampleEntity.builder().id(remainingDocumentId).message("some other message") .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when DeleteQuery deleteQuery = new DeleteQuery(); deleteQuery.setQuery(idsQuery().addIds(documentIdToDelete)); - elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); + elasticsearchTemplate.delete(deleteQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); // then // document with id "remainingDocumentId" should still be indexed NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(sampleEntities.getContent().get(0).getId()).isEqualTo(remainingDocumentId); } @@ -2392,18 +2380,18 @@ public void shouldDeleteOnlyDocumentsMatchedByCriteriaQuery() { String remainingDocumentId = UUID.randomUUID().toString(); indexQueries.add(getIndexQuery(SampleEntity.builder().id(remainingDocumentId).message("some other message") .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("id").is(documentIdToDelete)); - elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class); + elasticsearchTemplate.delete(criteriaQuery, SampleEntity.class, index); elasticsearchTemplate.refresh(SampleEntity.class); // then // document with id "remainingDocumentId" should still be indexed NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(1); assertThat(sampleEntities.getContent().get(0).getId()).isEqualTo(remainingDocumentId); } @@ -2422,17 +2410,17 @@ public void shouldDeleteDocumentForGivenIdOnly() { String remainingDocumentId = UUID.randomUUID().toString(); indexQueries.add(getIndexQuery(SampleEntity.builder().id(remainingDocumentId).message("some other message") .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when - elasticsearchTemplate.delete(SampleEntity.class, documentIdToDelete); + elasticsearchTemplate.delete(documentIdToDelete, index); elasticsearchTemplate.refresh(SampleEntity.class); // then // document with id "remainingDocumentId" should still be indexed NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); assertThat(sampleEntities.getTotalElements()).isEqualTo(1L); assertThat(sampleEntities.getContent().get(0).getId()).isEqualTo(remainingDocumentId); } @@ -2451,7 +2439,7 @@ public void shouldApplyCriteriaQueryToScanAndScrollForGivenCriteriaQuery() { indexQueries.add(getIndexQuery(SampleEntity.builder().id(UUID.randomUUID().toString()).message(notFindableMessage) .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when @@ -2460,7 +2448,8 @@ public void shouldApplyCriteriaQueryToScanAndScrollForGivenCriteriaQuery() { criteriaQuery.addTypes(TYPE_NAME); criteriaQuery.setPageable(PageRequest.of(0, 10)); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, criteriaQuery, SampleEntity.class, + index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -2488,14 +2477,14 @@ public void shouldApplySearchQueryToScanAndScrollForGivenSearchQuery() { indexQueries.add(getIndexQuery(SampleEntity.builder().id(UUID.randomUUID().toString()).message(notFindableMessage) .version(System.currentTimeMillis()).build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("message", "message")) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withPageable(PageRequest.of(0, 10)).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -2516,7 +2505,7 @@ public void shouldRespectSourceFilterWithScanAndScrollForGivenSearchQuery() { List entities = createSampleEntitiesWithMessage("Test message", 3); // when - elasticsearchTemplate.bulkIndex(entities); + elasticsearchTemplate.bulkIndex(entities, index); elasticsearchTemplate.refresh(SampleEntity.class); // then @@ -2526,7 +2515,7 @@ public void shouldRespectSourceFilterWithScanAndScrollForGivenSearchQuery() { .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withPageable(PageRequest.of(0, 10)) .withSourceFilter(sourceFilter).build(); - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -2562,7 +2551,7 @@ public void shouldSortResultsGivenSortCriteriaWithScanAndScroll() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -2570,7 +2559,7 @@ public void shouldSortResultsGivenSortCriteriaWithScanAndScroll() { .withSort(new FieldSortBuilder("message").order(SortOrder.DESC)).withPageable(PageRequest.of(0, 10)).build(); // when - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -2608,7 +2597,7 @@ public void shouldSortResultsGivenSortCriteriaFromPageableWithScanAndScroll() { indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) @@ -2617,7 +2606,7 @@ public void shouldSortResultsGivenSortCriteriaFromPageableWithScanAndScroll() { .build(); // when - ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class); + ScrolledPage scroll = elasticsearchTemplate.startScroll(1000, searchQuery, SampleEntity.class, index); List sampleEntities = new ArrayList<>(); while (scroll.hasContent()) { sampleEntities.addAll(scroll.getContent()); @@ -2641,19 +2630,19 @@ public void shouldReturnDocumentWithCollapsedField() { .version(System.currentTimeMillis()).build(); SampleEntity sampleEntity2 = SampleEntity.builder().id(randomNumeric(5)).message("message 2").rate(2) .version(System.currentTimeMillis()).build(); - SampleEntity sampleEntit3 = SampleEntity.builder().id(randomNumeric(5)).message("message 1").rate(1) + SampleEntity sampleEntity3 = SampleEntity.builder().id(randomNumeric(5)).message("message 1").rate(1) .version(System.currentTimeMillis()).build(); - List indexQueries = getIndexQueries(Arrays.asList(sampleEntity, sampleEntity2, sampleEntit3)); + List indexQueries = getIndexQueries(Arrays.asList(sampleEntity, sampleEntity2, sampleEntity3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) .withIndices(INDEX_NAME_SAMPLE_ENTITY).withTypes(TYPE_NAME).withCollapseField("rate").build(); // when - Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -2682,12 +2671,11 @@ public void shouldAddAlias() { // given String aliasName = "test-alias"; AliasQuery aliasQuery = new AliasBuilder() // - .withIndexName(INDEX_NAME_SAMPLE_ENTITY) // .withAliasName(aliasName) // .build(); // when - elasticsearchTemplate.addAlias(aliasQuery); + elasticsearchTemplate.addAlias(aliasQuery, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); // then List aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_SAMPLE_ENTITY); @@ -2703,20 +2691,19 @@ public void shouldAddAliasForVariousRoutingValues() { String alias2 = "test-alias-2"; AliasQuery aliasQuery1 = new AliasBuilder() // - .withIndexName(INDEX_NAME_SAMPLE_ENTITY) // .withAliasName(alias1) // .withIndexRouting("0") // .build(); AliasQuery aliasQuery2 = new AliasBuilder() // - .withIndexName(INDEX_NAME_SAMPLE_ENTITY) // .withAliasName(alias2) // .withSearchRouting("1") // .build(); // when - elasticsearchTemplate.addAlias(aliasQuery1); - elasticsearchTemplate.addAlias(aliasQuery2); + IndexCoordinates index = IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.addAlias(aliasQuery1, index); + elasticsearchTemplate.addAlias(aliasQuery2, index); String documentId = randomNumeric(5); SampleEntity entity = SampleEntity.builder() // @@ -2726,13 +2713,11 @@ public void shouldAddAliasForVariousRoutingValues() { .build(); IndexQuery indexQuery = new IndexQueryBuilder() // - .withIndexName(alias1) // - .withType(TYPE_NAME) // .withId(entity.getId()) // .withObject(entity) // .build(); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, IndexCoordinates.of(alias1).withTypes(TYPE_NAME)); // then List aliasMetaData = elasticsearchTemplate.queryForAlias(INDEX_NAME_SAMPLE_ENTITY); @@ -2749,8 +2734,8 @@ public void shouldAddAliasForVariousRoutingValues() { assertThat(aliasMetaData2.searchRouting()).isEqualTo("1"); // cleanup - elasticsearchTemplate.removeAlias(aliasQuery1); - elasticsearchTemplate.removeAlias(aliasQuery2); + elasticsearchTemplate.removeAlias(aliasQuery1, index); + elasticsearchTemplate.removeAlias(aliasQuery2, index); } @Test // DATAES-70 @@ -2758,15 +2743,15 @@ public void shouldAddAliasWithGivenRoutingValue() { // given String alias = "test-alias"; + IndexCoordinates index = IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY); AliasQuery aliasQuery = new AliasBuilder() // - .withIndexName(INDEX_NAME_SAMPLE_ENTITY) // .withAliasName(alias) // .withRouting("0") // .build(); // when - elasticsearchTemplate.addAlias(aliasQuery); + elasticsearchTemplate.addAlias(aliasQuery, index); String documentId = randomNumeric(5); SampleEntity sampleEntity = SampleEntity.builder() // @@ -2776,14 +2761,12 @@ public void shouldAddAliasWithGivenRoutingValue() { .build(); IndexQuery indexQuery = new IndexQueryBuilder() // - .withIndexName(alias) // .withId(sampleEntity.getId()) // - .withType(TYPE_NAME) // .withObject(sampleEntity) // .build(); - elasticsearchTemplate.index(indexQuery); - elasticsearchTemplate.refresh(INDEX_NAME_SAMPLE_ENTITY); + elasticsearchTemplate.index(indexQuery, IndexCoordinates.of(alias).withTypes(TYPE_NAME)); + elasticsearchTemplate.refresh(IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); NativeSearchQuery query = new NativeSearchQueryBuilder() // .withQuery(matchAllQuery()) // @@ -2791,7 +2774,7 @@ public void shouldAddAliasWithGivenRoutingValue() { .withTypes(TYPE_NAME) // .build(); - long count = elasticsearchTemplate.count(query); + long count = elasticsearchTemplate.count(query, IndexCoordinates.of(alias)); // then List aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_SAMPLE_ENTITY); @@ -2803,7 +2786,7 @@ public void shouldAddAliasWithGivenRoutingValue() { assertThat(count).isEqualTo(1); // cleanup - elasticsearchTemplate.removeAlias(aliasQuery); + elasticsearchTemplate.removeAlias(aliasQuery, index); } @Test // DATAES-541 @@ -2811,19 +2794,20 @@ public void shouldRemoveAlias() { // given String aliasName = "test-alias"; + IndexCoordinates index = IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY); + AliasQuery aliasQuery = new AliasBuilder() // - .withIndexName(INDEX_NAME_SAMPLE_ENTITY) // .withAliasName(aliasName) // .build(); // when - elasticsearchTemplate.addAlias(aliasQuery); + elasticsearchTemplate.addAlias(aliasQuery, index); List aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_SAMPLE_ENTITY); assertThat(aliases).isNotNull(); assertThat(aliases.get(0).alias()).isEqualTo(aliasName); // then - elasticsearchTemplate.removeAlias(aliasQuery); + elasticsearchTemplate.removeAlias(aliasQuery, index); aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_SAMPLE_ENTITY); assertThat(aliases).isEmpty(); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java index c47d839bd..f5ffc790f 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java @@ -46,10 +46,9 @@ public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() // when IndexRequest indexRequest = new IndexRequest(); indexRequest.source("{}", XContentType.JSON); - UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)).withClass(SampleEntity.class) - .withIndexRequest(indexRequest).build(); + UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)).withIndexRequest(indexRequest).build(); assertThatThrownBy(() -> { - elasticsearchTemplate.update(updateQuery); + elasticsearchTemplate.update(updateQuery, index); }).isInstanceOf(DocumentMissingException.class); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/IndexCoordinatesTest.java b/src/test/java/org/springframework/data/elasticsearch/core/IndexCoordinatesTest.java new file mode 100644 index 000000000..1d7650622 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/IndexCoordinatesTest.java @@ -0,0 +1,54 @@ +/* + * Copyright 2019 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 + * + * https://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; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +/** + * @author Peter-Josef Meisch + */ +class IndexCoordinatesTest { + + @Test + void cannotBeInitializedWithNullIndexName() { + assertThatThrownBy(() -> { + IndexCoordinates.of(null); + }).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void cannotBeInitializedWithNullIndexNames() { + assertThatThrownBy(() -> { + IndexCoordinates.of((String[]) null); + }).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void cannotBeInitializedWithEmptyIndexNames() { + assertThatThrownBy(() -> { + IndexCoordinates.of(new String[] {}); + }).isInstanceOf(IllegalArgumentException.class); + } + + @Test + void shouldHaveEmptyTypesWhenNotSet() { + IndexCoordinates indexCoordinates = IndexCoordinates.of("test"); + + assertThat(indexCoordinates.getTypeNames()).isEmpty(); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/LogEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/core/LogEntityTests.java index 0e033a625..be4a527f6 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/LogEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/LogEntityTests.java @@ -53,6 +53,7 @@ @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) public class LogEntityTests { + private final IndexCoordinates index = IndexCoordinates.of("test-index-log-core").withTypes( "test-log-type"); @Autowired private ElasticsearchTemplate template; @BeforeEach @@ -73,7 +74,7 @@ public void before() throws ParseException { IndexQuery indexQuery4 = new LogEntityBuilder("4").action("update").date(dateFormatter.parse("2013-10-19 18:04")) .code(2).ip("10.10.10.4").buildIndex(); - template.bulkIndex(Arrays.asList(indexQuery1, indexQuery2, indexQuery3, indexQuery4)); + template.bulkIndex(Arrays.asList(indexQuery1, indexQuery2, indexQuery3, indexQuery4), index); template.refresh(LogEntity.class); } @@ -82,7 +83,7 @@ public void shouldIndexGivenLogEntityWithIPFieldType() { // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("ip", "10.10.10.1")).build(); - List entities = template.queryForList(searchQuery, LogEntity.class); + List entities = template.queryForList(searchQuery, LogEntity.class, index); // then assertThat(entities).isNotNull().hasSize(1); @@ -95,7 +96,7 @@ public void shouldThrowExceptionWhenInvalidIPGivenForSearchQuery() { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("ip", "10.10.10")).build(); assertThatThrownBy(() -> { - List entities = template.queryForList(searchQuery, LogEntity.class); + List entities = template.queryForList(searchQuery, LogEntity.class, index); }).isInstanceOf(SearchPhaseExecutionException.class); } @@ -105,7 +106,7 @@ public void shouldReturnLogsForGivenIPRanges() { // when NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(rangeQuery("ip").from("10.10.10.1").to("10.10.10.3")).build(); - List entities = template.queryForList(searchQuery, LogEntity.class); + List entities = template.queryForList(searchQuery, LogEntity.class, index); // then assertThat(entities).isNotNull().hasSize(3); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java index 1ef1c729e..e33821692 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java @@ -61,9 +61,7 @@ import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.junit.junit4.ElasticsearchVersion; -import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchRestTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; -import org.springframework.test.context.ContextConfiguration; import org.springframework.util.StringUtils; /** @@ -76,7 +74,6 @@ * @author Martin Choraine */ @SpringIntegrationTest -@ContextConfiguration(classes = { ElasticsearchRestTemplateConfiguration.class }) public class ReactiveElasticsearchTemplateTests { static final String DEFAULT_INDEX = "reactive-template-test-index"; @@ -139,8 +136,9 @@ public void insertWithIdShouldWork() { restTemplate.refresh(SampleEntity.class); - List result = restTemplate - .queryForList(new CriteriaQuery(Criteria.where("message").is(sampleEntity.getMessage())), SampleEntity.class); + List result = restTemplate.queryForList( + new CriteriaQuery(Criteria.where("message").is(sampleEntity.getMessage())), SampleEntity.class, + IndexCoordinates.of(DEFAULT_INDEX)); assertThat(result).hasSize(1); } @@ -171,8 +169,8 @@ public void insertWithExplicitIndexNameShouldOverwriteMetadata() { .expectNextCount(1)// .verifyComplete(); - restTemplate.refresh(DEFAULT_INDEX); - restTemplate.refresh(ALTERNATE_INDEX); + restTemplate.refresh(IndexCoordinates.of(DEFAULT_INDEX)); + restTemplate.refresh(IndexCoordinates.of(ALTERNATE_INDEX)); assertThat(TestUtils.documentWithId(sampleEntity.getId()).existsIn(DEFAULT_INDEX)).isFalse(); assertThat(TestUtils.documentWithId(sampleEntity.getId()).existsIn(ALTERNATE_INDEX)).isTrue(); @@ -192,8 +190,9 @@ public void insertShouldAcceptPlainMapStructureAsSource() { @Test // DATAES-504 public void insertShouldErrorOnNullEntity() { - assertThatThrownBy(() -> template.save(null)).isInstanceOf(IllegalArgumentException.class); - + assertThatThrownBy(() -> { + template.save(null); + }).isInstanceOf(IllegalArgumentException.class); } @Test // DATAES-519 @@ -245,7 +244,9 @@ public void findByIdShouldCompleteWhenNotingFound() { @Test // DATAES-504 public void findByIdShouldErrorForNullId() { - assertThatThrownBy(() -> template.findById(null, SampleEntity.class)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> { + template.findById(null, SampleEntity.class); + }).isInstanceOf(IllegalArgumentException.class); } @Test // DATAES-504 @@ -254,13 +255,12 @@ public void findByIdWithExplicitIndexNameShouldOverwriteMetadata() { SampleEntity sampleEntity = randomEntity("some message"); IndexQuery indexQuery = getIndexQuery(sampleEntity); - indexQuery.setIndexName(ALTERNATE_INDEX); - restTemplate.index(indexQuery); + restTemplate.index(indexQuery, IndexCoordinates.of(ALTERNATE_INDEX).withTypes( "test-type")); restTemplate.refresh(SampleEntity.class); - restTemplate.refresh(DEFAULT_INDEX); - restTemplate.refresh(ALTERNATE_INDEX); + restTemplate.refresh(IndexCoordinates.of(DEFAULT_INDEX)); + restTemplate.refresh(IndexCoordinates.of(ALTERNATE_INDEX)); template.findById(sampleEntity.getId(), SampleEntity.class) // .as(StepVerifier::create) // @@ -586,8 +586,8 @@ public void shouldDeleteAcrossIndex() { .as(StepVerifier::create)// .verifyComplete(); - restTemplate.refresh(thisIndex); - restTemplate.refresh(thatIndex); + restTemplate.refresh(IndexCoordinates.of(thisIndex)); + restTemplate.refresh(IndexCoordinates.of(thatIndex)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() // .withQuery(termQuery("message", "test")) // @@ -616,8 +616,8 @@ public void shouldDeleteAcrossIndexWhenNoMatchingDataPresent() { .as(StepVerifier::create)// .verifyComplete(); - restTemplate.refresh(thisIndex); - restTemplate.refresh(thatIndex); + restTemplate.refresh(IndexCoordinates.of(thisIndex)); + restTemplate.refresh(IndexCoordinates.of(thatIndex)); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() // .withQuery(termQuery("message", "negative")) // @@ -725,10 +725,12 @@ private List getIndexQueries(SampleEntity... sampleEntities) { private void index(SampleEntity... entities) { + IndexCoordinates indexCoordinates = IndexCoordinates.of(DEFAULT_INDEX).withTypes( "test-type"); + if (entities.length == 1) { - restTemplate.index(getIndexQuery(entities[0])); + restTemplate.index(getIndexQuery(entities[0]), indexCoordinates); } else { - restTemplate.bulkIndex(getIndexQueries(entities)); + restTemplate.bulkIndex(getIndexQueries(entities), indexCoordinates); } restTemplate.refresh(SampleEntity.class); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/aggregation/ElasticsearchTemplateAggregationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/aggregation/ElasticsearchTemplateAggregationTests.java index 3789e67e0..af2005791 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/aggregation/ElasticsearchTemplateAggregationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/aggregation/ElasticsearchTemplateAggregationTests.java @@ -40,6 +40,7 @@ import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.ResultsExtractor; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; @@ -89,10 +90,11 @@ public void before() { .addAuthor(RIZWAN_IDREES).addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000) .score(40).buildIndex(); - elasticsearchTemplate.index(article1); - elasticsearchTemplate.index(article2); - elasticsearchTemplate.index(article3); - elasticsearchTemplate.index(article4); + IndexCoordinates index = IndexCoordinates.of(INDEX_NAME).withTypes( "article"); + elasticsearchTemplate.index(article1, index); + elasticsearchTemplate.index(article2, index); + elasticsearchTemplate.index(article3, index); + elasticsearchTemplate.index(article4, index); elasticsearchTemplate.refresh(ArticleEntity.class); } @@ -118,7 +120,7 @@ public void shouldReturnAggregatedResponseForGivenSearchQuery() { public Aggregations extract(SearchResponse response) { return response.getAggregations(); } - }); + }, null, IndexCoordinates.of(INDEX_NAME).withTypes("article")); // then assertThat(aggregations).isNotNull(); assertThat(aggregations.asMap().get("subjects")).isNotNull(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionTests.java b/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionTests.java index 3a0f85696..5a554b07c 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionTests.java @@ -32,6 +32,7 @@ import org.springframework.data.elasticsearch.annotations.CompletionField; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; @@ -66,7 +67,7 @@ private void loadCompletionObjectEntities() { indexQueries.add(new CompletionEntityBuilder("4").name("Artur Konczak").suggest(new String[] { "Artur", "Konczak" }) .buildIndex()); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, IndexCoordinates.of("test-index-core-completion").withTypes( "completion-type")); elasticsearchTemplate.refresh(CompletionEntity.class); } @@ -88,7 +89,8 @@ private void loadAnnotatedCompletionObjectEntities() { indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Artur Konczak") .suggest(new String[] { "Artur", "Konczak" }).buildIndex()); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, + IndexCoordinates.of("test-index-annotated-completion").withTypes( "annotated-completion-type")); elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class); } @@ -106,7 +108,8 @@ private void loadAnnotatedCompletionObjectEntitiesWithWeights() { indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Mewes Kochheim4") .suggest(new String[] { "Mewes Kochheim4" }, Integer.MAX_VALUE).buildIndex()); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, + IndexCoordinates.of("test-index-annotated-completion").withTypes( "annotated-completion-type")); elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class); } @@ -132,7 +135,8 @@ public void shouldFindSuggestionsForGivenCriteriaQueryUsingCompletionEntity() { // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( - new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), CompletionEntity.class); + new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), + IndexCoordinates.of("test-index-core-completion").withTypes( "completion-type")); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); @@ -152,7 +156,8 @@ public void shouldFindSuggestionsForGivenCriteriaQueryUsingAnnotatedCompletionEn // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( - new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), CompletionEntity.class); + new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), + IndexCoordinates.of("test-index-core-completion").withTypes( "completion-type")); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); @@ -173,7 +178,7 @@ public void shouldFindSuggestionsWithWeightsForGivenCriteriaQueryUsingAnnotatedC // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), - AnnotatedCompletionEntity.class); + IndexCoordinates.of("test-index-annotated-completion").withTypes( "annotated-completion-type")); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionWithContextsTests.java b/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionWithContextsTests.java index fbab48eb0..b29564e77 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionWithContextsTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/completion/ElasticsearchTemplateCompletionWithContextsTests.java @@ -40,6 +40,7 @@ import org.springframework.data.elasticsearch.annotations.CompletionField; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; @@ -86,7 +87,8 @@ private void loadContextCompletionObjectEntities() { indexQueries.add(new ContextCompletionEntityBuilder("4").name("Artur Konczak") .suggest(new String[] { "Artur", "Konczak" }, context4).buildIndex()); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, + IndexCoordinates.of("test-index-context-completion").withTypes( "context-completion-type")); elasticsearchTemplate.refresh(ContextCompletionEntity.class); } @@ -123,7 +125,7 @@ public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEnti // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), - ContextCompletionEntity.class); + IndexCoordinates.of("test-index-context-completion").withTypes( "context-completion-type")); assertThat(suggestResponse.getSuggest()).isNotNull(); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); @@ -155,7 +157,7 @@ public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEnti // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), - ContextCompletionEntity.class); + IndexCoordinates.of("test-index-context-completion").withTypes( "context-completion-type")); assertThat(suggestResponse.getSuggest()).isNotNull(); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); @@ -187,7 +189,7 @@ public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEnti // when SearchResponse suggestResponse = elasticsearchTemplate.suggest( new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), - ContextCompletionEntity.class); + IndexCoordinates.of("test-index-context-completion").withTypes( "context-completion-type")); assertThat(suggestResponse.getSuggest()).isNotNull(); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); List options = completionSuggestion.getEntries().get(0).getOptions(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java deleted file mode 100644 index 9b73cfda8..000000000 --- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ElasticsearchTemplateFacetTests.java +++ /dev/null @@ -1,695 +0,0 @@ -/* - * Copyright 2013-2019 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 - * - * https://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.facet; - -import static org.assertj.core.api.Assertions.*; -import static org.elasticsearch.index.query.QueryBuilders.*; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; -import org.springframework.data.elasticsearch.annotations.InnerField; -import org.springframework.data.elasticsearch.annotations.MultiField; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.FacetedPage; -import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; -import org.springframework.data.elasticsearch.core.facet.request.HistogramFacetRequestBuilder; -import org.springframework.data.elasticsearch.core.facet.request.NativeFacetRequest; -import org.springframework.data.elasticsearch.core.facet.request.RangeFacetRequestBuilder; -import org.springframework.data.elasticsearch.core.facet.request.StatisticalFacetRequestBuilder; -import org.springframework.data.elasticsearch.core.facet.request.TermFacetRequestBuilder; -import org.springframework.data.elasticsearch.core.facet.result.HistogramResult; -import org.springframework.data.elasticsearch.core.facet.result.IntervalUnit; -import org.springframework.data.elasticsearch.core.facet.result.Range; -import org.springframework.data.elasticsearch.core.facet.result.RangeResult; -import org.springframework.data.elasticsearch.core.facet.result.StatisticalResult; -import org.springframework.data.elasticsearch.core.facet.result.Term; -import org.springframework.data.elasticsearch.core.facet.result.TermResult; -import org.springframework.data.elasticsearch.core.query.IndexQuery; -import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; -import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; -import org.springframework.data.elasticsearch.utils.IndexInitializer; -import org.springframework.test.context.ContextConfiguration; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Jonathan Yan - * @author Artur Konczak - * @author Peter-Josef Meisch - */ -@SpringIntegrationTest -@ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) -public class ElasticsearchTemplateFacetTests { - - private static final String RIZWAN_IDREES = "Rizwan Idrees"; - private static final String MOHSIN_HUSEN = "Mohsin Husen"; - private static final String JONATHAN_YAN = "Jonathan Yan"; - private static final String ARTUR_KONCZAK = "Artur Konczak"; - private static final int YEAR_2002 = 2002; - private static final int YEAR_2001 = 2001; - private static final int YEAR_2000 = 2000; - private static final String PUBLISHED_YEARS = "publishedYears"; - - @Autowired private ElasticsearchTemplate elasticsearchTemplate; - - @BeforeEach - public void before() { - - IndexInitializer.init(elasticsearchTemplate, ArticleEntity.class); - - IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").addAuthor(RIZWAN_IDREES) - .addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex(); - IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").addAuthor(RIZWAN_IDREES) - .addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex(); - IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").addAuthor(RIZWAN_IDREES) - .addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(30).buildIndex(); - IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").addAuthor(RIZWAN_IDREES) - .addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(40).buildIndex(); - - elasticsearchTemplate.index(article1); - elasticsearchTemplate.index(article2); - elasticsearchTemplate.index(article3); - elasticsearchTemplate.index(article4); - elasticsearchTemplate.refresh(ArticleEntity.class); - } - - @Test - public void shouldReturnFacetedAuthorsForGivenQueryWithDefaultOrder() { - - // given - String facetName = "fauthors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES); - assertThat(term.getCount()).isEqualTo(4); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(term.getCount()).isEqualTo(2); - - term = facet.getTerms().get(3); - assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN); - assertThat(term.getCount()).isEqualTo(1); - - assertThat(facet.getTotal()).isEqualTo(4); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnFacetedAuthorsForGivenFilteredQuery() { - - // given - String facetName = "fauthors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").build()) - .build(); - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES); - assertThat(term.getCount()).isEqualTo(4); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(term.getCount()).isEqualTo(2); - - assertThat(facet.getTotal()).isEqualTo(4); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldExcludeTermsFromFacetedAuthorsForGivenQuery() { - - // given - String facetName = "fauthors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched") - .excludeTerms(RIZWAN_IDREES, ARTUR_KONCZAK).build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - - assertThat(facet.getTerms()).hasSize(2); - - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(term.getCount()).isEqualTo(2); - - Term term1 = facet.getTerms().get(1); - assertThat(term1.getTerm()).isEqualTo(JONATHAN_YAN); - assertThat(term1.getCount()).isEqualTo(1); - - assertThat(facet.getTotal()).isEqualTo(2); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnFacetedAuthorsForGivenQueryOrderedByTerm() { - - // given - String facetName = "fauthors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascTerm().build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN); - assertThat(term.getCount()).isEqualTo(1); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(term.getCount()).isEqualTo(2); - - term = facet.getTerms().get(3); - assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES); - assertThat(term.getCount()).isEqualTo(4); - - assertThat(facet.getTotal()).isEqualTo(4); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnFacetedAuthorsForGivenQueryOrderedByCountAsc() { - - // given - String facetName = "fauthors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascCount().build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN); - assertThat(term.getCount()).isEqualTo(1); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(term.getCount()).isEqualTo(2); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(3); - assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES); - assertThat(term.getCount()).isEqualTo(4); - - assertThat(facet.getTotal()).isEqualTo(4); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnFacetedYearsForGivenQuery() { - - // given - String facetName = "fyears"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(facetName).fields("publishedYears").descCount().build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - assertThat(facet.getTerms()).hasSize(3); - - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000)); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001)); - assertThat(term.getCount()).isEqualTo(2); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002)); - assertThat(term.getCount()).isEqualTo(1); - - assertThat(facet.getTotal()).isEqualTo(3); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnExistingFacetedYearsForGivenQuery() { - - // given - String facetName = "fyears"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet( - new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("publishedYears").descCount().build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - assertThat(facet.getTerms()).hasSize(3); - - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000)); - assertThat(term.getCount()).isEqualTo(3); - - term = facet.getTerms().get(1); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001)); - assertThat(term.getCount()).isEqualTo(2); - - term = facet.getTerms().get(2); - assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002)); - assertThat(term.getCount()).isEqualTo(1); - - assertThat(facet.getTotal()).isEqualTo(3); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldThrowExeptionsForMultiFieldFacet() { - - // given - String facetName = "fyears"; - assertThatThrownBy(() -> { - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet( - new TermFacetRequestBuilder(facetName).fields("publishedYears", "authors.untouched").ascTerm().build()) - .build(); - }).isInstanceOf(IllegalArgumentException.class); - } - - @Test - public void shouldReturnFacetedYearsAndFacetedAuthorsForGivenQuery() { - - // given - String numberFacetName = "fAuthors"; - String stringFacetName = "fyears"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new TermFacetRequestBuilder(numberFacetName).fields("publishedYears").ascTerm().build()) - .withFacet(new TermFacetRequestBuilder(stringFacetName).fields("authors.untouched").ascTerm().build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult numberFacet = (TermResult) result.getFacet(numberFacetName); - assertThat(numberFacet.getTerms()).hasSize(3); - - Term numberTerm = numberFacet.getTerms().get(0); - assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2000)); - assertThat(numberTerm.getCount()).isEqualTo(3); - - numberTerm = numberFacet.getTerms().get(1); - assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2001)); - assertThat(numberTerm.getCount()).isEqualTo(2); - - numberTerm = numberFacet.getTerms().get(2); - assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2002)); - assertThat(numberTerm.getCount()).isEqualTo(1); - - TermResult stringFacet = (TermResult) result.getFacet(stringFacetName); - Term stringTerm = stringFacet.getTerms().get(0); - assertThat(stringTerm.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(stringTerm.getCount()).isEqualTo(3); - - stringTerm = stringFacet.getTerms().get(1); - assertThat(stringTerm.getTerm()).isEqualTo(JONATHAN_YAN); - assertThat(stringTerm.getCount()).isEqualTo(1); - - stringTerm = stringFacet.getTerms().get(2); - assertThat(stringTerm.getTerm()).isEqualTo(MOHSIN_HUSEN); - assertThat(stringTerm.getCount()).isEqualTo(2); - - stringTerm = stringFacet.getTerms().get(3); - assertThat(stringTerm.getTerm()).isEqualTo(RIZWAN_IDREES); - assertThat(stringTerm.getCount()).isEqualTo(4); - - assertThat(stringFacet.getTotal()).isEqualTo(4); - assertThat(stringFacet.getOther()).isEqualTo(0); - assertThat(stringFacet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldThrowExceptionForNativeFacets() { - - // given - String facetName = "fyears"; - assertThatThrownBy(() -> { - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new NativeFacetRequest()).build(); - }).isInstanceOf(UnsupportedOperationException.class); - } - - @Test - public void shouldFilterResultByRegexForGivenQuery() { - - // given - String facetName = "regex_authors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withFacet( - new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").regex("Art.*").build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - - assertThat(facet.getTerms()).hasSize(1); - - Term term = facet.getTerms().get(0); - assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK); - assertThat(term.getCount()).isEqualTo(3); - - assertThat(facet.getTotal()).isEqualTo(1); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnAllTermsForGivenQuery() { - - // given - String facetName = "all_authors"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet( - new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").allTerms().build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - TermResult facet = (TermResult) result.getFacet(facetName); - - assertThat(facet.getTerms()).hasSize(4); - - assertThat(facet.getTotal()).isEqualTo(4); - assertThat(facet.getOther()).isEqualTo(0); - assertThat(facet.getMissing()).isEqualTo(0); - } - - @Test - public void shouldReturnRangeFacetForGivenQuery() { - - // given - String facetName = "rangeYears"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new RangeFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).to(YEAR_2000) - .range(YEAR_2000, YEAR_2002).from(YEAR_2002).build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - RangeResult facet = (RangeResult) result.getFacet(facetName); - assertThat(facet.getRanges()).hasSize(3); - - Range range = facet.getRanges().get(0); - assertThat(range.getFrom()).isEqualTo(Double.NEGATIVE_INFINITY); - assertThat(range.getTo()).isEqualTo((double) YEAR_2000); - assertThat(range.getCount()).isEqualTo(0); - assertThat(range.getTotal()).isEqualTo(0.0); - - range = facet.getRanges().get(1); - assertThat(range.getFrom()).isEqualTo((double) YEAR_2000); - assertThat(range.getTo()).isEqualTo((double) YEAR_2002); - assertThat(range.getCount()).isEqualTo(3); - assertThat(range.getTotal()).isEqualTo(12004.0); - - range = facet.getRanges().get(2); - assertThat(range.getFrom()).isEqualTo((double) YEAR_2002); - assertThat(range.getTo()).isEqualTo(Double.POSITIVE_INFINITY); - assertThat(range.getCount()).isEqualTo(1); - assertThat(range.getTotal()).isEqualTo(6003.0); - } - - @Test - public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() { - - // given - String facetName = "rangeScoreOverYears"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new RangeFacetRequestBuilder(facetName).fields(PUBLISHED_YEARS, "score").to(YEAR_2000) - .range(YEAR_2000, YEAR_2002).from(YEAR_2002).build()) - .build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - RangeResult facet = (RangeResult) result.getFacet(facetName); - assertThat(facet.getRanges()).hasSize(3); - - Range range = facet.getRanges().get(0); - assertThat(range.getFrom()).isEqualTo(Double.NEGATIVE_INFINITY); - assertThat(range.getTo()).isEqualTo((double) YEAR_2000); - assertThat(range.getCount()).isEqualTo(0); - assertThat(range.getTotal()).isEqualTo(0.0); - - range = facet.getRanges().get(1); - assertThat(range.getFrom()).isEqualTo((double) YEAR_2000); - assertThat(range.getTo()).isEqualTo((double) YEAR_2002); - assertThat(range.getCount()).isEqualTo(3); - assertThat(range.getTotal()).isEqualTo(90.0); - - range = facet.getRanges().get(2); - assertThat(range.getFrom()).isEqualTo((double) YEAR_2002); - assertThat(range.getTo()).isEqualTo(Double.POSITIVE_INFINITY); - assertThat(range.getCount()).isEqualTo(1); - assertThat(range.getTotal()).isEqualTo(40.0); - } - - @Test - public void shouldReturnStatisticalFacetForGivenQuery() { - - // given - String facetName = "statPublishedYear"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new StatisticalFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - StatisticalResult facet = (StatisticalResult) result.getFacet(facetName); - assertThat(facet.getCount()).isEqualTo(6); - assertThat(facet.getMax()).isEqualTo(2002.0); - assertThat(facet.getMin()).isEqualTo(2000.0); - } - - @Test - public void shouldReturnHistogramFacetForGivenQuery() { - - // given - String facetName = "numberPublicationPerYear"; - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) - .withFacet(new HistogramFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).interval(1).build()).build(); - - // when - FacetedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - // then - assertThat(result.getNumberOfElements()).isEqualTo(4); - - HistogramResult facet = (HistogramResult) result.getFacet(facetName); - assertThat(facet.getIntervalUnit()).hasSize(3); - - IntervalUnit unit = facet.getIntervalUnit().get(0); - assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2000)); - assertThat(unit.getCount()).isEqualTo(3); - - unit = facet.getIntervalUnit().get(1); - assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2001)); - assertThat(unit.getCount()).isEqualTo(2); - - unit = facet.getIntervalUnit().get(2); - assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2002)); - assertThat(unit.getCount()).isEqualTo(1); - } - - @Test - public void shouldNotThrowExceptionForNoFacets() { - - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - AggregatedPage result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); - - assertThat(result.hasFacets()).isEqualTo(false); - } - - /** - * Simple type to test facets - * - * @author Artur Konczak - * @author Mohsin Husen - */ - @Data - @Document(indexName = "test-index-articles-core-facet", type = "article", shards = 1, replicas = 0, - refreshInterval = "-1") - static class ArticleEntity { - - @Id private String id; - private String title; - @Field(type = FieldType.Text, fielddata = true) private String subject; - - @MultiField(mainField = @Field(type = FieldType.Text), - otherFields = { - @InnerField(suffix = "untouched", type = FieldType.Text, store = true, fielddata = true, - analyzer = "keyword"), - @InnerField(suffix = "sort", type = FieldType.Text, store = true, - analyzer = "keyword") }) private List authors = new ArrayList<>(); - - @Field(type = FieldType.Integer, store = true) private List publishedYears = new ArrayList<>(); - - private int score; - - private ArticleEntity() { - - } - - public ArticleEntity(String id) { - this.id = id; - } - } - - /** - * Simple type to test facets - * - * @author Artur Konczak - * @author Mohsin Husen - */ - static class ArticleEntityBuilder { - - private ArticleEntity result; - - public ArticleEntityBuilder(String id) { - result = new ArticleEntity(id); - } - - public ArticleEntityBuilder title(String title) { - result.setTitle(title); - return this; - } - - public ArticleEntityBuilder subject(String subject) { - result.setSubject(subject); - return this; - } - - public ArticleEntityBuilder addAuthor(String author) { - result.getAuthors().add(author); - return this; - } - - public ArticleEntityBuilder addPublishedYear(Integer year) { - result.getPublishedYears().add(year); - return this; - } - - public ArticleEntityBuilder score(int score) { - result.setScore(score); - return this; - } - - public ArticleEntity build() { - return result; - } - - public IndexQuery buildIndex() { - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(result.getId()); - indexQuery.setObject(result); - return indexQuery; - } - } - -} 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 d879429db..90200df56 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 @@ -36,6 +36,7 @@ import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.GeoPointField; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery; @@ -61,6 +62,11 @@ @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) public class ElasticsearchTemplateGeoTests { + private final IndexCoordinates locationMarkerIndex = IndexCoordinates.of("test-index-location-marker-core-geo") + .withTypes("geo-annotation-point-type"); + private final IndexCoordinates authorMarkerIndex = IndexCoordinates.of("test-index-author-marker-core-geo") + .withTypes("geo-class-point-type"); + @Autowired private ElasticsearchTemplate elasticsearchTemplate; @BeforeEach @@ -77,7 +83,7 @@ private void loadClassBaseEntities() { .add(new AuthorMarkerEntityBuilder("1").name("Franck Marchand").location(45.7806d, 3.0875d).buildIndex()); indexQueries.add(new AuthorMarkerEntityBuilder("2").name("Mohsin Husen").location(51.5171d, 0.1062d).buildIndex()); indexQueries.add(new AuthorMarkerEntityBuilder("3").name("Rizwan Idrees").location(51.5171d, 0.1062d).buildIndex()); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, authorMarkerIndex); elasticsearchTemplate.refresh(AuthorMarkerEntity.class); } @@ -109,7 +115,7 @@ private void loadAnnotationBaseEntities() { indexQueries.add(buildIndex(location2)); indexQueries.add(buildIndex(location3)); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, locationMarkerIndex); elasticsearchTemplate.refresh(LocationMarkerEntity.class); } @@ -134,7 +140,7 @@ public void shouldFindAuthorMarkersInRangeForGivenCriteriaQuery() { // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(1); @@ -151,7 +157,7 @@ public void shouldFindSelectedAuthorMarkerInRangeForGivenCriteriaQuery() { // when List geoAuthorsForGeoCriteria2 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery2, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria2).hasSize(1); @@ -167,7 +173,7 @@ public void shouldFindStringAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { new Criteria("locationAsString").within(new GeoPoint(51.000000, 0.100000), "1km")); // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(1); @@ -183,7 +189,7 @@ public void shouldFindDoubleAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(3); @@ -198,7 +204,7 @@ public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { new Criteria("locationAsArray").within("51.001000, 0.10100", "1km")); // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(3); @@ -213,7 +219,7 @@ public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQueryUsingGeohas // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(3); @@ -229,7 +235,7 @@ public void shouldFindAllMarkersForNativeSearchQuery() { // when List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(queryBuilder.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria).hasSize(3); @@ -245,7 +251,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoBox() { // when List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria3).hasSize(2); @@ -263,7 +269,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() { // when List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria3).hasSize(2); @@ -281,7 +287,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoPoints() { // when List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria3).hasSize(2); @@ -299,7 +305,7 @@ public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() { // when List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, - AuthorMarkerEntity.class); + AuthorMarkerEntity.class, authorMarkerIndex); // then assertThat(geoAuthorsForGeoCriteria3).hasSize(2); @@ -327,17 +333,17 @@ public void shouldFindLocationWithGeoHashPrefix() { // when List result1 = elasticsearchTemplate.queryForList(location1.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); List result2 = elasticsearchTemplate.queryForList(location2.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); List result3 = elasticsearchTemplate.queryForList(location3.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); List result4 = elasticsearchTemplate.queryForList(location4.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); List result5 = elasticsearchTemplate.queryForList(location5.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); List result11 = elasticsearchTemplate.queryForList(location11.build(), - LocationMarkerEntity.class); + LocationMarkerEntity.class, locationMarkerIndex); // then assertThat(result1).hasSize(3); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderTests.java index f6cdd63bc..e9f6167cd 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderTests.java @@ -51,6 +51,7 @@ import org.springframework.data.annotation.Transient; import org.springframework.data.elasticsearch.annotations.*; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.completion.Completion; import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.query.IndexQuery; @@ -139,12 +140,16 @@ public void shouldAddStockPriceDocumentToIndex() { double price = 2.34; String id = "abc"; - elasticsearchTemplate - .index(buildIndex(StockPrice.builder().id(id).symbol(symbol).price(BigDecimal.valueOf(price)).build())); + IndexCoordinates index = IndexCoordinates.of("test-index-stock-mapping-builder").withTypes( "price"); + elasticsearchTemplate.index(buildIndex(StockPrice.builder() // + .id(id) // + .symbol(symbol) // + .price(BigDecimal.valueOf(price)) // + .build()), index); elasticsearchTemplate.refresh(StockPrice.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - List result = elasticsearchTemplate.queryForList(searchQuery, StockPrice.class); + List result = elasticsearchTemplate.queryForList(searchQuery, StockPrice.class, index); // Then assertThat(result).hasSize(1); @@ -186,12 +191,14 @@ public void shouldAddSampleInheritedEntityDocumentToIndex() { Date createdDate = new Date(); String message = "msg"; String id = "abc"; - elasticsearchTemplate - .index(new SampleInheritedEntityBuilder(id).createdDate(createdDate).message(message).buildIndex()); + IndexCoordinates index = IndexCoordinates.of("test-index-sample-inherited-mapping-builder").withTypes( "mapping"); + elasticsearchTemplate.index( + new SampleInheritedEntityBuilder(id).createdDate(createdDate).message(message).buildIndex(), + index); elasticsearchTemplate.refresh(SampleInheritedEntity.class); NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); - List result = elasticsearchTemplate.queryForList(searchQuery, SampleInheritedEntity.class); + List result = elasticsearchTemplate.queryForList(searchQuery, SampleInheritedEntity.class, index); // then assertThat(result).hasSize(1); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java index 5edc74acb..1ae67095e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java @@ -40,6 +40,7 @@ import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Score; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; import org.springframework.test.context.ContextConfiguration; @@ -54,6 +55,7 @@ @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) public class CriteriaQueryTests { + private final IndexCoordinates index = IndexCoordinates.of("test-index-sample-core-query").withTypes( "test-type"); @Autowired private ElasticsearchTemplate elasticsearchTemplate; @BeforeEach @@ -78,13 +80,13 @@ public void shouldPerformAndOperation() { IndexQuery indexQuery = new IndexQuery(); indexQuery.setId(documentId); indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery( new Criteria("message").contains("test").and("message").contains("some")); // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(sampleEntity1).isNotNull(); @@ -121,13 +123,13 @@ public void shouldPerformOrOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery( new Criteria("message").contains("some").or("message").contains("test")); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -152,13 +154,13 @@ public void shouldPerformAndOperationWithinCriteria() { indexQuery.setObject(sampleEntity); indexQueries.add(indexQuery); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().and(new Criteria("message").contains("some"))); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -184,12 +186,12 @@ public void shouldPerformOrOperationWithinCriteria() { indexQuery.setObject(sampleEntity); indexQueries.add(indexQuery); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some"))); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -213,12 +215,12 @@ public void shouldPerformIsOperation() { indexQuery.setObject(sampleEntity); indexQueries.add(indexQuery); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -255,12 +257,12 @@ public void shouldPerformMultipleIsOperations() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -297,13 +299,13 @@ public void shouldPerformEndsWithOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); Criteria criteria = new Criteria("message").endsWith("end"); CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -339,13 +341,13 @@ public void shouldPerformStartsWithOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); Criteria criteria = new Criteria("message").startsWith("start"); CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -381,12 +383,12 @@ public void shouldPerformContainsOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("contains")); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -422,12 +424,12 @@ public void shouldExecuteExpression() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").expression("+elasticsearch || test")); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -463,13 +465,13 @@ public void shouldExecuteCriteriaChain() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery( new Criteria("message").startsWith("some").endsWith("search").contains("message").is("some message search")); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message"); @@ -505,12 +507,12 @@ public void shouldPerformIsNotOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not()); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(criteriaQuery.getCriteria().isNegating()).isTrue(); @@ -549,12 +551,12 @@ public void shouldPerformBetweenOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(100, 150)); // when - SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(sampleEntity).isNotNull(); @@ -591,12 +593,12 @@ public void shouldPerformBetweenOperationWithoutUpperBound() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null)); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -634,12 +636,12 @@ public void shouldPerformBetweenOperationWithoutLowerBound() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550)); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -677,12 +679,12 @@ public void shouldPerformLessThanEqualOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750)); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -720,12 +722,12 @@ public void shouldPerformGreaterThanEquals() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950)); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page).isNotNull(); @@ -763,12 +765,12 @@ public void shouldPerformBoostOperation() { indexQuery2.setObject(sampleEntity2); indexQueries.add(indexQuery2); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1)); // when - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1); @@ -784,14 +786,14 @@ public void shouldReturnDocumentAboveMinimalScoreGivenCriteria() { indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); - elasticsearchTemplate.bulkIndex(indexQueries); + elasticsearchTemplate.bulkIndex(indexQueries, index); elasticsearchTemplate.refresh(SampleEntity.class); // when CriteriaQuery criteriaQuery = new CriteriaQuery( new Criteria("message").contains("a").or(new Criteria("message").contains("b"))); criteriaQuery.setMinScore(2.0F); - Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); + Page page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class, index); // then assertThat(page.getTotalElements()).isEqualTo(1); @@ -811,13 +813,13 @@ public void shouldEscapeValue() { IndexQuery indexQuery = new IndexQuery(); indexQuery.setId(documentId); indexQuery.setObject(sampleEntity); - elasticsearchTemplate.index(indexQuery); + elasticsearchTemplate.index(indexQuery, index); elasticsearchTemplate.refresh(SampleEntity.class); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("Hello World!")); // when - SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); + SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class, index); // then assertThat(sampleEntity1).isNotNull(); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/setting/dynamic/DynamicSettingAndMappingEntityRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/setting/dynamic/DynamicSettingAndMappingEntityRepositoryTests.java index 65ae990f5..531b90751 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/setting/dynamic/DynamicSettingAndMappingEntityRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/setting/dynamic/DynamicSettingAndMappingEntityRepositoryTests.java @@ -32,6 +32,7 @@ import org.springframework.data.elasticsearch.annotations.Mapping; import org.springframework.data.elasticsearch.annotations.Setting; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; @@ -107,9 +108,11 @@ public void shouldSearchOnGivenTokenizerUsingGivenDynamicSettingsForGivenIndex() NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termQuery("email", dynamicSettingAndMappingEntity1.getEmail())).build(); - long count = elasticsearchTemplate.count(searchQuery, DynamicSettingAndMappingEntity.class); + IndexCoordinates index = IndexCoordinates.of("test-index-dynamic-setting-and-mapping").withTypes( "test-setting-type"); + long count = elasticsearchTemplate.count(searchQuery, DynamicSettingAndMappingEntity.class, + index); List entityList = elasticsearchTemplate.queryForList(searchQuery, - DynamicSettingAndMappingEntity.class); + DynamicSettingAndMappingEntity.class, index); // then assertThat(count).isEqualTo(1L); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/spel/SpELEntityTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/spel/SpELEntityTests.java index 95d459bfc..2e8a0e53b 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/spel/SpELEntityTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/spel/SpELEntityTests.java @@ -26,6 +26,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; @@ -70,7 +71,7 @@ public void shouldDo() { // then NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(QueryBuilders.matchAllQuery()); nativeSearchQuery.addIndices("test-index-abz-entity"); - long count = template.count(nativeSearchQuery); + long count = template.count(nativeSearchQuery, IndexCoordinates.of("test-index-abz-entity")); assertThat(count).isEqualTo(2); } @@ -87,7 +88,7 @@ public void shouldSupportSpelInType() { NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(QueryBuilders.matchAllQuery()); nativeSearchQuery.addIndices("test-index-abz-entity"); nativeSearchQuery.addTypes("myType"); - long count = template.count(nativeSearchQuery); + long count = template.count(nativeSearchQuery, IndexCoordinates.of("test-index-abz-entity")); assertThat(count).isEqualTo(1); } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/synonym/SynonymRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/synonym/SynonymRepositoryTests.java index 1daac206c..b2bb76daf 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/synonym/SynonymRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/synonym/SynonymRepositoryTests.java @@ -22,21 +22,24 @@ import java.util.List; import org.elasticsearch.index.query.QueryBuilders; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Mapping; import org.springframework.data.elasticsearch.annotations.Setting; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; +import org.springframework.data.elasticsearch.junit.jupiter.SpringIntegrationTest; import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository; +import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.elasticsearch.utils.IndexInitializer; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; /** * SynonymRepositoryTests @@ -44,15 +47,21 @@ * @author Artur Konczak * @author Peter-Josef Meisch */ -@RunWith(SpringRunner.class) -@ContextConfiguration("classpath:synonym-test.xml") +@SpringIntegrationTest +@ContextConfiguration(classes = { SynonymRepositoryTests.Config.class }) public class SynonymRepositoryTests { + @Configuration + @Import({ ElasticsearchTemplateConfiguration.class }) + @EnableElasticsearchRepositories(basePackages = { "org.springframework.data.elasticsearch.repositories.synonym" }, + considerNestedRepositories = true) + static class Config {} + @Autowired private SynonymRepository repository; @Autowired private ElasticsearchTemplate elasticsearchTemplate; - @Before + @BeforeEach public void before() { IndexInitializer.init(elasticsearchTemplate, SynonymEntity.class); } @@ -76,7 +85,7 @@ public void shouldDo() { List synonymEntities = elasticsearchTemplate.queryForList( new NativeSearchQueryBuilder().withQuery(QueryBuilders.termQuery("text", "british")).build(), - SynonymEntity.class); + SynonymEntity.class, IndexCoordinates.of("test-index-synonym").withTypes( "synonym-type")); assertThat(synonymEntities).hasSize(1); }