DATAES-187 - Use Pageable#getOffset to set from offset in SearchRequest.

Original PR: #353
This commit is contained in:
Sascha Woo 2019-12-06 13:15:15 +01:00 committed by Peter-Josef Meisch
parent 9d4fe6d4af
commit ff381c63b6
3 changed files with 67 additions and 10 deletions

View File

@ -75,6 +75,7 @@ import org.springframework.util.StringUtils;
* Factory class to create Elasticsearch request instances from Spring Data Elasticsearch query objects. * Factory class to create Elasticsearch request instances from Spring Data Elasticsearch query objects.
* *
* @author Peter-Josef Meisch * @author Peter-Josef Meisch
* @author Sascha Woo
* @since 4.0 * @since 4.0
*/ */
class RequestFactory { class RequestFactory {
@ -551,7 +552,6 @@ class RequestFactory {
Assert.notEmpty(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"); Assert.notNull(index.getTypeNames(), "No type defined for Query");
int startRecord = 0;
SearchRequest request = new SearchRequest(index.getIndexNames()); SearchRequest request = new SearchRequest(index.getIndexNames());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
request.types(index.getTypeNames()); request.types(index.getTypeNames());
@ -566,10 +566,9 @@ class RequestFactory {
} }
if (query.getPageable().isPaged()) { if (query.getPageable().isPaged()) {
startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); sourceBuilder.from((int) query.getPageable().getOffset());
sourceBuilder.size(query.getPageable().getPageSize()); sourceBuilder.size(query.getPageable().getPageSize());
} }
sourceBuilder.from(startRecord);
if (!query.getFields().isEmpty()) { if (!query.getFields().isEmpty()) {
sourceBuilder.fetchSource(query.getFields().toArray(new String[0]), null); 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.notEmpty(index.getIndexNames(), "No index defined for Query");
Assert.notNull(index.getTypeNames(), "No type defined for Query"); Assert.notNull(index.getTypeNames(), "No type defined for Query");
int startRecord = 0;
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index.getIndexNames()) // SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index.getIndexNames()) //
.setSearchType(query.getSearchType()) // .setSearchType(query.getSearchType()) //
.setTypes(index.getTypeNames()) // .setTypes(index.getTypeNames()) //
@ -631,10 +629,9 @@ class RequestFactory {
} }
if (query.getPageable().isPaged()) { if (query.getPageable().isPaged()) {
startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize(); searchRequestBuilder.setFrom((int) query.getPageable().getOffset());
searchRequestBuilder.setSize(query.getPageable().getPageSize()); searchRequestBuilder.setSize(query.getPageable().getPageSize());
} }
searchRequestBuilder.setFrom(startRecord);
if (!query.getFields().isEmpty()) { if (!query.getFields().isEmpty()) {
searchRequestBuilder.setFetchSource(query.getFields().toArray(new String[0]), null); searchRequestBuilder.setFetchSource(query.getFields().toArray(new String[0]), null);

View File

@ -43,6 +43,7 @@ import java.util.stream.Collectors;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.cluster.metadata.AliasMetaData; 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.annotation.Version;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order; import org.springframework.data.domain.Sort.Order;
import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.ElasticsearchException;
@ -1443,8 +1445,7 @@ public abstract class ElasticsearchTemplateTests {
.withUpdateRequest(updateRequest).build(); .withUpdateRequest(updateRequest).build();
// when // when
UpdateRequest request = ((AbstractElasticsearchTemplate) elasticsearchTemplate).getRequestFactory() UpdateRequest request = getRequestFactory().updateRequest(updateQuery, IndexCoordinates.of("index"));
.updateRequest(updateQuery, IndexCoordinates.of("index"));
// then // then
assertThat(request).isNotNull(); assertThat(request).isNotNull();
@ -1465,8 +1466,7 @@ public abstract class ElasticsearchTemplateTests {
.withUpdateRequest(updateRequest).build(); .withUpdateRequest(updateRequest).build();
// when // when
UpdateRequest request = ((AbstractElasticsearchTemplate) elasticsearchTemplate).getRequestFactory() UpdateRequest request = getRequestFactory().updateRequest(updateQuery, IndexCoordinates.of("index"));
.updateRequest(updateQuery, IndexCoordinates.of("index"));
// then // then
assertThat(request).isNotNull(); 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 @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor

View File

@ -22,12 +22,20 @@ import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.Data; import lombok.Data;
import org.elasticsearch.action.index.IndexRequest; 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.common.xcontent.XContentType;
import org.elasticsearch.index.engine.DocumentMissingException; import org.elasticsearch.index.engine.DocumentMissingException;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id; 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.Document;
import org.springframework.data.elasticsearch.annotations.Field; 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.UpdateQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;
import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration; import org.springframework.data.elasticsearch.junit.jupiter.ElasticsearchTemplateConfiguration;
@ -36,11 +44,14 @@ import org.springframework.test.context.ContextConfiguration;
/** /**
* @author Peter-Josef Meisch * @author Peter-Josef Meisch
* @author Sascha Woo
*/ */
@SpringIntegrationTest @SpringIntegrationTest
@ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class }) @ContextConfiguration(classes = { ElasticsearchTemplateConfiguration.class })
public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTests { public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTests {
@Autowired private Client client;
@Test @Test
public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() {
// when // when
@ -52,6 +63,29 @@ public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTe
}).isInstanceOf(DocumentMissingException.class); }).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 @Data
@Document(indexName = "test-index-sample-core-transport-template", type = "test-type", shards = 1, replicas = 0, @Document(indexName = "test-index-sample-core-transport-template", type = "test-type", shards = 1, replicas = 0,
refreshInterval = "-1") refreshInterval = "-1")