mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-07-10 04:13: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.
|
* 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);
|
||||||
|
@ -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
|
||||||
|
@ -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")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user