-
Notifications
You must be signed in to change notification settings - Fork 0
Support pagination in V2 engine, phase 1 #226
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This comment was marked as spam.
This comment was marked as spam.
| return Collections.emptyList(); | ||
| } | ||
|
|
||
| default TableScanOperator getTableScan(String indexName, String scrollId) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why get TableScanOperator in StorageEngine?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is used in cursor deserialization/parsing, this happens in :core module. All implementation of StorageEngine are defined outside of :core and unavailable and that point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@penghuo does this design make sense? Would love to know what you think.
core/src/main/java/org/opensearch/sql/storage/read/TableScanBuilder.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/legacy/plugin/UnsupportCursorRequestException.java
Outdated
Show resolved
Hide resolved
sql/src/main/java/org/opensearch/sql/sql/domain/SQLQueryRequest.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/QueryService.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/execution/PaginatedQueryService.java
Outdated
Show resolved
Hide resolved
| /** | ||
| * Create {@link LogicalPlanOptimizer} with pre-defined rules. | ||
| */ | ||
| public static LogicalPlanOptimizer paginationCreate() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
difference is CreatePagingTableScanBuilder()?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PushPageSize and CreatePagingTableScanBuilder instead of CreateTableScanBuilder
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a lot of overlap here. You could create a common function create() and private functions that push the transformation and push_down capabilities separately. Something like:
public static LogicalPlanOptimizer create() {
return create(false);
}
public static LogicalPlanOptimizer create(boolean isPagingRequired) {
return new LogicalPlanOptimizer(Arrays.asList(
/*
* Phase 1: Transformations that rely on relational algebra equivalence
*/
getFilterTransformations(),
/*
* Phase 2: Transformations that rely on data source push down capability
*/
isPagingRequired ? getPaginatedTableScanBuilder() : getTableScanBuilder(),
getPushDownTransformations(),
getTableWriteBuilder()
));
}
private static List getFilterTransformations() {
return Arrays.asList(
new MergeFilterAndFilter(),
new PushFilterUnderSort()
);
}
private static List getTableScanBuilder() {
return Arrays.asList(
new CreateTableScanBuilder(),
);
}
private static List getPaginatedTableScanBuilder() {
return Arrays.asList(
new PushPageSize(),
new CreatePagingTableScanBuilder(),
);
}
core/src/main/java/org/opensearch/sql/planner/logical/LogicalRelation.java
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/PaginatedPlanCache.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/planner/PaginateOperator.java
Outdated
Show resolved
Hide resolved
Signed-off-by: MaxKsyunz <[email protected]>
Signed-off-by: MaxKsyunz <[email protected]>
Implement PaginatedPlanCache.convertToPlan for second page to work. Signed-off-by: MaxKsyunz <[email protected]>
Signed-off-by: MaxKsyunz <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
* Added push down page size from `LogicalPaginate` to `LogicalRelation`. * Improved cursor encoding and decoding. * Added cursor compression. * Fixed issuing `SearchScrollRequest`. * Fixed returning last empty page. * Minor code grooming/commenting. Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
core/src/main/java/org/opensearch/sql/executor/PaginatedPlanCache.java
Outdated
Show resolved
Hide resolved
MaxKsyunz
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Yury-Fridlyand please have a look at my comments so far. There will be more to come.
core/src/main/java/org/opensearch/sql/executor/CanPaginateVisitor.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/CanPaginateVisitor.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/PaginatedPlanCache.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/PaginatedPlanCache.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/expression/serialization/DefaultExpressionSerializer.java
Show resolved
Hide resolved
| import org.opensearch.sql.planner.logical.LogicalRelation; | ||
| import org.opensearch.sql.planner.optimizer.Rule; | ||
|
|
||
| public class PushPageSize |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you implement this similar to PUSH_DOWN_* rules:
- Add a
pushDownPageSizemethod toTableScanBuilder - Add a
PUSH_DOWN_PAGE_SIZEsimilar to others that matchesLogicalPaginateofscanBuilderand callspushDownPageSize.
Doing so would remove the need for PushPageSize and LogicalRelation.pageSize property, be less code, and follow a pattern already used in the code base, like PUSH_DOWN_LIMIT.
core/src/main/java/org/opensearch/sql/planner/physical/PaginateOperator.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/planner/physical/PaginateOperator.java
Outdated
Show resolved
Hide resolved
| return Collections.emptyList(); | ||
| } | ||
|
|
||
| default TableScanOperator getTableScan(String indexName, String scrollId) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@penghuo does this design make sense? Would love to know what you think.
opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/storage/scan/OpenSearchIndexScan.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/storage/scan/OpenSearchIndexScan.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/request/OpenSearchRequestBuilder.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/client/OpenSearchRestClient.java
Outdated
Show resolved
Hide resolved
|
|
||
| /** Default scroll context timeout in minutes. */ | ||
| public static final TimeValue DEFAULT_SCROLL_TIMEOUT = TimeValue.timeValueMinutes(1L); | ||
| public static final TimeValue DEFAULT_SCROLL_TIMEOUT = TimeValue.timeValueMinutes(100L); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is such a long time out necessary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
integ-test/src/test/java/org/opensearch/sql/sql/PaginationBlackboxIT.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/CanPaginateVisitor.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/planner/optimizer/rule/CreatePagingTableScanBuilder.java
Outdated
Show resolved
Hide resolved
core/src/test/java/org/opensearch/sql/executor/execution/ContinuePaginatedPlanTest.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/execution/QueryPlanFactory.java
Outdated
Show resolved
Hide resolved
core/src/test/java/org/opensearch/sql/planner/physical/PaginateOperatorTest.java
Outdated
Show resolved
Hide resolved
| } | ||
|
|
||
| @Test | ||
| public void hasNext_a_page() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we have a test where hasNext returns true then false based on pagedSize and numReturned?
integ-test/src/test/java/org/opensearch/sql/sql/PaginationBlackboxIT.java
Outdated
Show resolved
Hide resolved
integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java
Outdated
Show resolved
Hide resolved
integ-test/src/test/java/org/opensearch/sql/sql/StandalonePaginationIT.java
Show resolved
Hide resolved
integ-test/src/test/java/org/opensearch/sql/util/TestUtils.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/request/InitialPageRequestBuilder.java
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/request/OpenSearchScrollRequest.java
Outdated
Show resolved
Hide resolved
...search/src/main/java/org/opensearch/sql/opensearch/request/SubsequentPageRequestBuilder.java
Outdated
Show resolved
Hide resolved
opensearch/src/main/java/org/opensearch/sql/opensearch/storage/OpenSearchStorageEngine.java
Show resolved
Hide resolved
opensearch/src/test/java/org/opensearch/sql/opensearch/executor/CursorTest.java
Outdated
Show resolved
Hide resolved
* Add javadocs * Renames * Cleaning up some comments * Remove unused code * Speed up IT Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
integ-test/src/test/java/org/opensearch/sql/sql/PaginationBlackboxIT.java
Outdated
Show resolved
Hide resolved
| SearchResponse openSearchResponse = scrollAction.apply(new SearchScrollRequest(initialScrollId) | ||
| .scroll(DEFAULT_SCROLL_TIMEOUT)); | ||
|
|
||
| // TODO if terminated_early - something went wrong, e.g. no scroll returned. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this TODO (and other TODOs in the PR) meant to be implemented in Phase 2?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good practice is to leave no TODOs behind.
I'll do my best to resolve them ASAP, but some of them are related to design of existing code and can't be fixed easily.
This very TODO related to a terminated search query - plugin doesn't handle such case for any queries.
core/src/main/java/org/opensearch/sql/executor/execution/PaginatedQueryService.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/execution/PaginatedQueryService.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/opensearch/executor/Cursor.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/executor/execution/PaginatedQueryService.java
Outdated
Show resolved
Hide resolved
core/src/main/java/org/opensearch/sql/planner/logical/LogicalPaginate.java
Show resolved
Hide resolved
| /** | ||
| * Create {@link LogicalPlanOptimizer} with pre-defined rules. | ||
| */ | ||
| public static LogicalPlanOptimizer paginationCreate() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a lot of overlap here. You could create a common function create() and private functions that push the transformation and push_down capabilities separately. Something like:
public static LogicalPlanOptimizer create() {
return create(false);
}
public static LogicalPlanOptimizer create(boolean isPagingRequired) {
return new LogicalPlanOptimizer(Arrays.asList(
/*
* Phase 1: Transformations that rely on relational algebra equivalence
*/
getFilterTransformations(),
/*
* Phase 2: Transformations that rely on data source push down capability
*/
isPagingRequired ? getPaginatedTableScanBuilder() : getTableScanBuilder(),
getPushDownTransformations(),
getTableWriteBuilder()
));
}
private static List getFilterTransformations() {
return Arrays.asList(
new MergeFilterAndFilter(),
new PushFilterUnderSort()
);
}
private static List getTableScanBuilder() {
return Arrays.asList(
new CreateTableScanBuilder(),
);
}
private static List getPaginatedTableScanBuilder() {
return Arrays.asList(
new PushPageSize(),
new CreatePagingTableScanBuilder(),
);
}
core/src/main/java/org/opensearch/sql/planner/physical/FilterOperator.java
Show resolved
Hide resolved
…imit (#248) Signed-off-by: MaxKsyunz <[email protected]>
|
You have successfully added a new CodeQL configuration |
…nners and use them. Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Signed-off-by: Yury-Fridlyand <[email protected]>
Description
https://github.com/Bit-Quill/opensearch-project-sql/blob/61767f2b200b2a7f8c8b2df32de209b3c30caa61/docs/dev/Pagination-v2.md
All credits to @MaxKsyunz.
You can use attached script for testing as well. Command line:
./cursor_test.sh <table> <page size>. Requiresjq. Rename it before use.cursor_test.sh.txt
Scroll API usage doc:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
TODOs
_explainhandlers to one place (see 74b1e94) - fixed in 304616d:opensearchmodule with coverage. #233, Pagination, phase 1: Add unit tests for:coremodule with coverage. #230, Pagination, phase 1: Add unit tests for SQL module with coverage. #239totalinjdbcresponse shows current page size (TotalHitsaren't accounted) - fixed in f4ea4adFollow-up TODOs
Decided to do out of scope of this PR:
SqlRequestandSQLQueryRequestor at least fix processing json content (if cursor detected, content isn't kept)DefaultExpressionSerializerand incompressfunction; keep cursor as a binary object.Issues Resolved
opensearch-project#656
Check List
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.