From ff381c63b6d7633a7a17b3d8a63db36661763afe Mon Sep 17 00:00:00 2001 From: Sascha Woo Date: Fri, 6 Dec 2019 13:15:15 +0100 Subject: [PATCH] DATAES-187 - Use Pageable#getOffset to set from offset in SearchRequest. Original PR: #353 --- .../elasticsearch/core/RequestFactory.java | 9 ++--- .../core/ElasticsearchTemplateTests.java | 34 ++++++++++++++++--- .../ElasticsearchTransportTemplateTests.java | 34 +++++++++++++++++++ 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java index e1b880015..04e036639 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java @@ -75,6 +75,7 @@ import org.springframework.util.StringUtils; * Factory class to create Elasticsearch request instances from Spring Data Elasticsearch query objects. * * @author Peter-Josef Meisch + * @author Sascha Woo * @since 4.0 */ class RequestFactory { @@ -551,7 +552,6 @@ class RequestFactory { 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()); @@ -566,10 +566,9 @@ class RequestFactory { } if (query.getPageable().isPaged()) { - startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); + sourceBuilder.from((int) query.getPageable().getOffset()); sourceBuilder.size(query.getPageable().getPageSize()); } - sourceBuilder.from(startRecord); if (!query.getFields().isEmpty()) { sourceBuilder.fetchSource(query.getFields().toArray(new String[0]), null); @@ -618,7 +617,6 @@ class RequestFactory { 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()) // @@ -631,10 +629,9 @@ class RequestFactory { } if (query.getPageable().isPaged()) { - startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); + searchRequestBuilder.setFrom((int) query.getPageable().getOffset()); searchRequestBuilder.setSize(query.getPageable().getPageSize()); } - searchRequestBuilder.setFrom(startRecord); if (!query.getFields().isEmpty()) { searchRequestBuilder.setFetchSource(query.getFields().toArray(new String[0]), null); 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 67a8cf400..ee2718ae0 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -43,6 +43,7 @@ import java.util.stream.Collectors; import org.assertj.core.util.Lists; import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.cluster.metadata.AliasMetaData; @@ -61,6 +62,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; import org.springframework.data.elasticsearch.ElasticsearchException; @@ -1443,8 +1445,7 @@ public abstract class ElasticsearchTemplateTests { .withUpdateRequest(updateRequest).build(); // when - UpdateRequest request = ((AbstractElasticsearchTemplate) elasticsearchTemplate).getRequestFactory() - .updateRequest(updateQuery, IndexCoordinates.of("index")); + UpdateRequest request = getRequestFactory().updateRequest(updateQuery, IndexCoordinates.of("index")); // then assertThat(request).isNotNull(); @@ -1465,8 +1466,7 @@ public abstract class ElasticsearchTemplateTests { .withUpdateRequest(updateRequest).build(); // when - UpdateRequest request = ((AbstractElasticsearchTemplate) elasticsearchTemplate).getRequestFactory() - .updateRequest(updateQuery, IndexCoordinates.of("index")); + UpdateRequest request = getRequestFactory().updateRequest(updateQuery, IndexCoordinates.of("index")); // then assertThat(request).isNotNull(); @@ -2794,6 +2794,32 @@ public abstract class ElasticsearchTemplateTests { } } + @Test // DATAES-187 + public void shouldUsePageableOffsetToSetFromInSearchRequest() { + + // given + Pageable pageable = new PageRequest(1, 10, Sort.unsorted()) { + @Override + public long getOffset() { + return 30; + } + }; + + NativeSearchQuery query = new NativeSearchQueryBuilder() // + .withPageable(pageable) // + .build(); + + // when + SearchRequest searchRequest = getRequestFactory().searchRequest(query, null, IndexCoordinates.of("test")); + + // then + assertThat(searchRequest.source().from()).isEqualTo(30); + } + + protected RequestFactory getRequestFactory() { + return ((AbstractElasticsearchTemplate) elasticsearchTemplate).getRequestFactory(); + } + @Data @NoArgsConstructor @AllArgsConstructor 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 f5ffc790f..0fdde2b78 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTransportTemplateTests.java @@ -22,12 +22,20 @@ import static org.springframework.data.elasticsearch.annotations.FieldType.*; import lombok.Data; import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.client.Client; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.engine.DocumentMissingException; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; @@ -36,11 +44,14 @@ import org.springframework.test.context.ContextConfiguration; /** * @author Peter-Josef Meisch + * @author Sascha Woo */ @SpringIntegrationTest @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTests { + @Autowired private Client client; + @Test public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { // when @@ -52,6 +63,29 @@ public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTe }).isInstanceOf(DocumentMissingException.class); } + @Test // DATAES-187 + public void shouldUsePageableOffsetToSetFromInSearchRequest() { + + // given + Pageable pageable = new PageRequest(1, 10, Sort.unsorted()) { + @Override + public long getOffset() { + return 30; + } + }; + + NativeSearchQuery query = new NativeSearchQueryBuilder() // + .withPageable(pageable) // + .build(); + + // when + SearchRequestBuilder searchRequestBuilder = getRequestFactory().searchRequestBuilder(client, query, null, + IndexCoordinates.of("test")); + + // then + assertThat(searchRequestBuilder.request().source().from()).isEqualTo(30); + } + @Data @Document(indexName = "test-index-sample-core-transport-template", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")