mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-07-09 20:03:27 +00:00
DATAES-187 - Use Pageable#getOffset to set from offset in SearchRequest.
Original PR: #353
This commit is contained in:
parent
9d4fe6d4af
commit
ff381c63b6
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
Loading…
x
Reference in New Issue
Block a user