Skip to content

Commit 3ff4fa5

Browse files
author
Selina Song
committed
fix conflict with aggregate opt rule
Signed-off-by: Selina Song <[email protected]>
1 parent 7fabbe6 commit 3ff4fa5

File tree

10 files changed

+93
-98
lines changed

10 files changed

+93
-98
lines changed

core/src/main/java/org/opensearch/sql/calcite/CalciteRelNodeVisitor.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.apache.calcite.plan.RelOptTable;
4040
import org.apache.calcite.plan.ViewExpanders;
4141
import org.apache.calcite.rel.RelCollation;
42-
import org.apache.calcite.rel.RelCollations;
4342
import org.apache.calcite.rel.RelNode;
4443
import org.apache.calcite.rel.core.Aggregate;
4544
import org.apache.calcite.rel.core.JoinRelType;
@@ -569,12 +568,12 @@ public RelNode visitHead(Head node, CalcitePlanContext context) {
569568
public RelNode visitReverse(
570569
org.opensearch.sql.ast.tree.Reverse node, CalcitePlanContext context) {
571570
visitChildren(node, context);
572-
571+
573572
// Check if there's an existing sort to reverse
574-
List<RelCollation> collations =
573+
List<RelCollation> collations =
575574
context.relBuilder.getCluster().getMetadataQuery().collations(context.relBuilder.peek());
576575
RelCollation collation = collations != null && !collations.isEmpty() ? collations.get(0) : null;
577-
576+
578577
if (collation != null && !collation.getFieldCollations().isEmpty()) {
579578
// If there's an existing sort, reverse its direction
580579
RelCollation reversedCollation = PlanUtils.reverseCollation(collation);
@@ -592,7 +591,7 @@ public RelNode visitReverse(
592591
context.relBuilder.sort(context.relBuilder.desc(context.relBuilder.field(REVERSE_ROW_NUM)));
593592
context.relBuilder.projectExcept(context.relBuilder.field(REVERSE_ROW_NUM));
594593
}
595-
594+
596595
return context.relBuilder.peek();
597596
}
598597

core/src/main/java/org/opensearch/sql/calcite/plan/OpenSearchRules.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@
88
import com.google.common.collect.ImmutableList;
99
import java.util.List;
1010
import org.apache.calcite.plan.RelOptRule;
11-
import org.apache.calcite.rel.convert.ConverterRule;
1211
import org.opensearch.sql.calcite.rule.SortReverseOptimizationRule;
1312

1413
public class OpenSearchRules {
1514
private static final PPLAggregateConvertRule AGGREGATE_CONVERT_RULE =
1615
PPLAggregateConvertRule.Config.SUM_CONVERTER.toRule();
1716

18-
public static final List<ConverterRule> OPEN_SEARCH_OPT_RULES = ImmutableList.of();
19-
20-
public static final List<RelOptRule> OPTIMIZATION_RULES =
21-
ImmutableList.of(SortReverseOptimizationRule.INSTANCE);
22-
23-
public static final List<RelOptRule> OPEN_SEARCH_OPT_RULES_OLD =
17+
public static final List<RelOptRule> OPEN_SEARCH_OPT_RULES =
2418
ImmutableList.of(AGGREGATE_CONVERT_RULE);
2519

20+
public static final List<RelOptRule> OPTIMIZATION_RULES = ImmutableList.of();
21+
22+
public static final List<RelOptRule> OPEN_SEARCH_POST_AGG_RULES =
23+
ImmutableList.of(SortReverseOptimizationRule.INSTANCE);
24+
2625
// prevent instantiation
2726
private OpenSearchRules() {}
2827
}

core/src/main/java/org/opensearch/sql/calcite/plan/OpenSearchTableScan.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,17 @@ public void register(RelOptPlanner planner) {
3232
for (RelOptRule rule : OpenSearchRules.OPEN_SEARCH_OPT_RULES) {
3333
planner.addRule(rule);
3434
}
35-
35+
3636
// Register optimization rules
3737
for (RelOptRule rule : OpenSearchRules.OPTIMIZATION_RULES) {
3838
planner.addRule(rule);
3939
}
4040

41+
// Register post-aggregation rules (run after aggregate optimizations)
42+
for (RelOptRule rule : OpenSearchRules.OPEN_SEARCH_POST_AGG_RULES) {
43+
planner.addRule(rule);
44+
}
45+
4146
// remove this rule otherwise opensearch can't correctly interpret approx_count_distinct()
4247
// it is converted to cardinality aggregation in OpenSearch
4348
planner.removeRule(CoreRules.AGGREGATE_EXPAND_DISTINCT_AGGREGATES);

core/src/main/java/org/opensearch/sql/calcite/rule/SortReverseOptimizationRule.java

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,58 +8,92 @@
88
import org.apache.calcite.plan.RelOptRule;
99
import org.apache.calcite.plan.RelOptRuleCall;
1010
import org.apache.calcite.rel.logical.LogicalSort;
11+
import org.apache.logging.log4j.LogManager;
12+
import org.apache.logging.log4j.Logger;
1113
import org.opensearch.sql.calcite.plan.LogicalSystemLimit;
1214

13-
/**
14-
* Optimization rule that eliminates redundant consecutive sorts on the same field.
15-
* Detects: LogicalSort(field, direction1) -> LogicalSort(field, direction2)
16-
* Converts to: LogicalSort(field, direction1) (keeps outer sort)
17-
*/
15+
/** Combines sort then reverse into 1 sort. */
1816
public class SortReverseOptimizationRule extends RelOptRule {
17+
private static final Logger LOG = LogManager.getLogger(SortReverseOptimizationRule.class);
1918

2019
public static final SortReverseOptimizationRule INSTANCE = new SortReverseOptimizationRule();
2120

2221
private SortReverseOptimizationRule() {
23-
super(operand(LogicalSort.class,
24-
operand(LogicalSort.class, any())),
22+
super(
23+
operand(LogicalSort.class, operand(LogicalSort.class, any())),
2524
"SortReverseOptimizationRule");
2625
}
2726

2827
@Override
2928
public boolean matches(RelOptRuleCall call) {
3029
LogicalSort outerSort = call.rel(0);
3130
LogicalSort innerSort = call.rel(1);
32-
33-
// Don't optimize if outer sort is a LogicalSystemLimit - we want to preserve system limits
31+
32+
LOG.debug("SortReverseOptimizationRule.matches() called");
33+
LOG.debug("Outer sort: {}", outerSort);
34+
LOG.debug("Inner sort: {}", innerSort);
35+
LOG.debug("Inner sort input: {}", innerSort.getInput());
36+
37+
// Don't optimize if outer sort is a LogicalSystemLimit
3438
if (call.rel(0) instanceof LogicalSystemLimit) {
39+
LOG.debug("Skipping: outer sort is LogicalSystemLimit");
40+
return false;
41+
}
42+
43+
// Don't optimize if inner sort has a fetch limit (head/limit before sort)
44+
// This preserves limit-then-sort semantics
45+
if (innerSort.fetch != null) {
46+
LOG.debug("Skipping: inner sort has fetch limit: {}", innerSort.fetch);
3547
return false;
3648
}
37-
38-
return hasSameField(outerSort, innerSort);
49+
50+
// Must be same field with opposite directions (sort | reverse pattern)
51+
boolean matches = hasSameFieldWithOppositeDirection(outerSort, innerSort);
52+
LOG.debug("Same field with opposite direction: {}", matches);
53+
return matches;
3954
}
4055

4156
@Override
4257
public void onMatch(RelOptRuleCall call) {
4358
LogicalSort outerSort = call.rel(0);
4459
LogicalSort innerSort = call.rel(1);
45-
46-
LogicalSort optimizedSort = LogicalSort.create(
47-
innerSort.getInput(),
48-
outerSort.getCollation(),
49-
outerSort.offset,
50-
outerSort.fetch);
51-
60+
61+
LOG.debug("SortReverseOptimizationRule.onMatch() applying transformation");
62+
LOG.debug("Transforming from: {} -> {}", outerSort, innerSort);
63+
64+
LogicalSort optimizedSort =
65+
LogicalSort.create(
66+
innerSort.getInput(), outerSort.getCollation(), outerSort.offset, outerSort.fetch);
67+
68+
LOG.debug("Transformed to: {}", optimizedSort);
5269
call.transformTo(optimizedSort);
5370
}
54-
55-
private boolean hasSameField(LogicalSort outerSort, LogicalSort innerSort) {
56-
if (outerSort.getCollation().getFieldCollations().isEmpty()
71+
72+
private boolean hasSameFieldWithOppositeDirection(LogicalSort outerSort, LogicalSort innerSort) {
73+
if (outerSort.getCollation().getFieldCollations().isEmpty()
5774
|| innerSort.getCollation().getFieldCollations().isEmpty()) {
75+
LOG.debug("No field collations found");
5876
return false;
5977
}
60-
61-
int outerField = outerSort.getCollation().getFieldCollations().get(0).getFieldIndex();
62-
int innerField = innerSort.getCollation().getFieldCollations().get(0).getFieldIndex();
63-
return outerField == innerField;
78+
79+
var outerField = outerSort.getCollation().getFieldCollations().get(0);
80+
var innerField = innerSort.getCollation().getFieldCollations().get(0);
81+
82+
LOG.debug(
83+
"Outer field: index={}, direction={}",
84+
outerField.getFieldIndex(),
85+
outerField.getDirection());
86+
LOG.debug(
87+
"Inner field: index={}, direction={}",
88+
innerField.getFieldIndex(),
89+
innerField.getDirection());
90+
91+
boolean sameField = outerField.getFieldIndex() == innerField.getFieldIndex();
92+
boolean oppositeDirection = outerField.getDirection() != innerField.getDirection();
93+
94+
LOG.debug("Same field: {}, Opposite direction: {}", sameField, oppositeDirection);
95+
96+
// Must be same field with opposite directions
97+
return sameField && oppositeDirection;
6498
}
65-
}
99+
}

core/src/main/java/org/opensearch/sql/calcite/utils/PlanUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ public static RelCollation reverseCollation(RelCollation original) {
409409
List<RelFieldCollation> reversedFields = new ArrayList<>();
410410
for (RelFieldCollation field : original.getFieldCollations()) {
411411
RelFieldCollation.Direction reversedDirection = field.direction.reverse();
412-
412+
413413
// Handle null direction properly - reverse it as well
414414
RelFieldCollation.NullDirection reversedNullDirection = field.nullDirection;
415415
if (reversedNullDirection == RelFieldCollation.NullDirection.FIRST) {

integ-test/src/test/java/org/opensearch/sql/calcite/remote/CalciteExplainIT.java

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ public void testExplainWithReversePushdownMultipleFields() throws IOException {
232232
assertJsonEqualsIgnoreId(expected, result);
233233
}
234234

235-
<<<<<<< HEAD
236235
@Test
237236
public void testExplainWithTimechartAvg() throws IOException {
238237
var result = explainQueryToString("source=events | timechart span=1m avg(cpu_usage) by host");
@@ -253,44 +252,6 @@ public void testExplainWithTimechartCount() throws IOException {
253252
assertJsonEqualsIgnoreId(expected, result);
254253
}
255254

256-
@Test
257-
public void testDoubleReverseWithSortNoOp() throws IOException {
258-
String query =
259-
"source=opensearch-sql_test_index_account | sort - age, + firstname | reverse | reverse";
260-
var result = explainQueryToString(query);
261-
String expected = loadFromFile("expectedOutput/calcite/explain_double_reverse_sort_no_op.json");
262-
assertJsonEqualsIgnoreId(expected, result);
263-
}
264-
=======
265-
// @Test
266-
// public void testDoubleReverseNoOp() throws IOException {
267-
// String query =
268-
// "source=opensearch-sql_test_index_account | fields account_number | reverse | reverse";
269-
// var result = explainQueryToString(query);
270-
// String expected = loadFromFile("expectedOutput/calcite/explain_double_reverse_no_op.json");
271-
// assertJsonEqualsIgnoreId(expected, result);
272-
// }
273-
274-
// @Test
275-
// public void testTripleReverseOneOp() throws IOException {
276-
// String query =
277-
// "source=opensearch-sql_test_index_account | fields account_number | reverse | reverse |"
278-
// + " reverse";
279-
// var result = explainQueryToString(query);
280-
// String expected = loadFromFile("expectedOutput/calcite/explain_triple_reverse_one_op.json");
281-
// assertJsonEqualsIgnoreId(expected, result);
282-
// }
283-
//
284-
// @Test
285-
// public void testDoubleReverseWithSortNoOp() throws IOException {
286-
// String query =
287-
// "source=opensearch-sql_test_index_account | sort - age, + firstname | reverse | reverse";
288-
// var result = explainQueryToString(query);
289-
// String expected = loadFromFile("expectedOutput/calcite/explain_double_reverse_sort_no_op.json");
290-
// assertJsonEqualsIgnoreId(expected, result);
291-
// }
292-
>>>>>>> f6a6803f3 (add opt rule for sort flip)
293-
294255
@Test
295256
public void noPushDownForAggOnWindow() throws IOException {
296257
Assume.assumeTrue("This test is only for push down enabled", isPushdownEnabled());

integ-test/src/test/resources/expectedOutput/calcite/explain_agg_with_sum_enhancement.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(sum(balance)=[$1], sum(balance + 100)=[$2], sum(balance - 100)=[$3], sum(balance * 100)=[$4], sum(balance / 100)=[$5], gender=[$0])\n LogicalAggregate(group=[{0}], sum(balance)=[SUM($1)], sum(balance + 100)=[SUM($2)], sum(balance - 100)=[SUM($3)], sum(balance * 100)=[SUM($4)], sum(balance / 100)=[SUM($5)])\n LogicalProject(gender=[$4], balance=[$7], $f6=[+($7, 100)], $f7=[-($7, 100)], $f8=[*($7, 100)], $f9=[DIVIDE($7, 100)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_bank]])\n",
44
"physical": "EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..3=[{inputs}], expr#4=[100], expr#5=[*($t2, $t4)], expr#6=[+($t1, $t5)], expr#7=[-($t1, $t5)], expr#8=[*($t1, $t4)], sum(balance)=[$t1], sum(balance + 100)=[$t6], sum(balance - 100)=[$t7], sum(balance * 100)=[$t8], sum(balance / 100)=[$t3], gender=[$t0])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_bank]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=RelSubset#,group={0},sum(balance)=SUM($1),sum(balance + 100)_COUNT=COUNT($1),sum(balance / 100)=SUM($2))], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":0,\"timeout\":\"1m\",\"aggregations\":{\"composite_buckets\":{\"composite\":{\"size\":1000,\"sources\":[{\"gender\":{\"terms\":{\"field\":\"gender.keyword\",\"missing_bucket\":true,\"missing_order\":\"first\",\"order\":\"asc\"}}}]},\"aggregations\":{\"sum(balance)\":{\"sum\":{\"field\":\"balance\"}},\"sum(balance + 100)_COUNT\":{\"value_count\":{\"field\":\"balance\"}},\"sum(balance / 100)\":{\"sum\":{\"script\":{\"source\":\"{\\\"langType\\\":\\\"calcite\\\",\\\"script\\\":\\\"rO0ABXNyABFqYXZhLnV0aWwuQ29sbFNlcleOq7Y6G6gRAwABSQADdGFneHAAAAADdwQAAAAGdAAHcm93VHlwZXQHjnsKICAiZmllbGRzIjogWwogICAgewogICAgICAidHlwZSI6ICJCSUdJTlQiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJhY2NvdW50X251bWJlciIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIlZBUkNIQVIiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAicHJlY2lzaW9uIjogLTEsCiAgICAgICJuYW1lIjogImZpcnN0bmFtZSIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIlZBUkNIQVIiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAicHJlY2lzaW9uIjogLTEsCiAgICAgICJuYW1lIjogImFkZHJlc3MiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgInByZWNpc2lvbiI6IC0xLAogICAgICAibmFtZSI6ICJiaXJ0aGRhdGUiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgInByZWNpc2lvbiI6IC0xLAogICAgICAibmFtZSI6ICJnZW5kZXIiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgInByZWNpc2lvbiI6IC0xLAogICAgICAibmFtZSI6ICJjaXR5IgogICAgfSwKICAgIHsKICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICJwcmVjaXNpb24iOiAtMSwKICAgICAgIm5hbWUiOiAibGFzdG5hbWUiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJCSUdJTlQiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJiYWxhbmNlIgogICAgfSwKICAgIHsKICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICJwcmVjaXNpb24iOiAtMSwKICAgICAgIm5hbWUiOiAiZW1wbG95ZXIiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgInByZWNpc2lvbiI6IC0xLAogICAgICAibmFtZSI6ICJzdGF0ZSIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIklOVEVHRVIiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJhZ2UiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgInByZWNpc2lvbiI6IC0xLAogICAgICAibmFtZSI6ICJlbWFpbCIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIkJPT0xFQU4iLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJtYWxlIgogICAgfSwKICAgIHsKICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICJwcmVjaXNpb24iOiAtMSwKICAgICAgIm5hbWUiOiAiX2lkIgogICAgfSwKICAgIHsKICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICJwcmVjaXNpb24iOiAtMSwKICAgICAgIm5hbWUiOiAiX2luZGV4IgogICAgfSwKICAgIHsKICAgICAgInR5cGUiOiAiUkVBTCIsCiAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICJuYW1lIjogIl9zY29yZSIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIlJFQUwiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJfbWF4c2NvcmUiCiAgICB9LAogICAgewogICAgICAidHlwZSI6ICJCSUdJTlQiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAibmFtZSI6ICJfc29ydCIKICAgIH0sCiAgICB7CiAgICAgICJ0eXBlIjogIlZBUkNIQVIiLAogICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAicHJlY2lzaW9uIjogLTEsCiAgICAgICJuYW1lIjogIl9yb3V0aW5nIgogICAgfQogIF0sCiAgIm51bGxhYmxlIjogdHJ1ZQp9dAAEZXhwcnQBz3sKICAib3AiOiB7CiAgICAibmFtZSI6ICJESVZJREUiLAogICAgImtpbmQiOiAiT1RIRVJfRlVOQ1RJT04iLAogICAgInN5bnRheCI6ICJGVU5DVElPTiIKICB9LAogICJvcGVyYW5kcyI6IFsKICAgIHsKICAgICAgImlucHV0IjogNywKICAgICAgIm5hbWUiOiAiJDciCiAgICB9LAogICAgewogICAgICAibGl0ZXJhbCI6IDEwMCwKICAgICAgInR5cGUiOiB7CiAgICAgICAgInR5cGUiOiAiSU5URUdFUiIsCiAgICAgICAgIm51bGxhYmxlIjogZmFsc2UKICAgICAgfQogICAgfQogIF0sCiAgImNsYXNzIjogIm9yZy5vcGVuc2VhcmNoLnNxbC5leHByZXNzaW9uLmZ1bmN0aW9uLlVzZXJEZWZpbmVkRnVuY3Rpb25CdWlsZGVyJDEiLAogICJ0eXBlIjogewogICAgInR5cGUiOiAiQklHSU5UIiwKICAgICJudWxsYWJsZSI6IHRydWUKICB9LAogICJkZXRlcm1pbmlzdGljIjogdHJ1ZSwKICAiZHluYW1pYyI6IGZhbHNlCn10AApmaWVsZFR5cGVzc3IAF2phdmEudXRpbC5MaW5rZWRIYXNoTWFwNMBOXBBswPsCAAFaAAthY2Nlc3NPcmRlcnhyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAABh3CAAAACAAAAANdAAOYWNjb3VudF9udW1iZXJ+cgApb3JnLm9wZW5zZWFyY2guc3FsLmRhdGEudHlwZS5FeHByQ29yZVR5cGUAAAAAAAAAABIAAHhyAA5qYXZhLmxhbmcuRW51bQAAAAAAAAAAEgAAeHB0AARMT05HdAAJZmlyc3RuYW1lfnEAfgALdAAGU1RSSU5HdAAHYWRkcmVzc3NyADpvcmcub3BlbnNlYXJjaC5zcWwub3BlbnNlYXJjaC5kYXRhLnR5cGUuT3BlblNlYXJjaFRleHRUeXBlrYOjkwTjMUQCAAFMAAZmaWVsZHN0AA9MamF2YS91dGlsL01hcDt4cgA6b3JnLm9wZW5zZWFyY2guc3FsLm9wZW5zZWFyY2guZGF0YS50eXBlLk9wZW5TZWFyY2hEYXRhVHlwZcJjvMoC+gU1AgADTAAMZXhwckNvcmVUeXBldAArTG9yZy9vcGVuc2VhcmNoL3NxbC9kYXRhL3R5cGUvRXhwckNvcmVUeXBlO0wAC21hcHBpbmdUeXBldABITG9yZy9vcGVuc2VhcmNoL3NxbC9vcGVuc2VhcmNoL2RhdGEvdHlwZS9PcGVuU2VhcmNoRGF0YVR5cGUkTWFwcGluZ1R5cGU7TAAKcHJvcGVydGllc3EAfgAUeHB+cQB+AAt0AAdVTktOT1dOfnIARm9yZy5vcGVuc2VhcmNoLnNxbC5vcGVuc2VhcmNoLmRhdGEudHlwZS5PcGVuU2VhcmNoRGF0YVR5cGUkTWFwcGluZ1R5cGUAAAAAAAAAABIAAHhxAH4ADHQABFRleHRzcgA8c2hhZGVkLmNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwJFNlcmlhbGl6ZWRGb3JtAAAAAAAAAAACAAJMAARrZXlzdAASTGphdmEvbGFuZy9PYmplY3Q7TAAGdmFsdWVzcQB+AB94cHVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAB1cQB+ACEAAAAAc3EAfgAAAAAAA3cEAAAAAHh0AAliaXJ0aGRhdGVzcgA6b3JnLm9wZW5zZWFyY2guc3FsLm9wZW5zZWFyY2guZGF0YS50eXBlLk9wZW5TZWFyY2hEYXRlVHlwZZ4tUq4QfcqvAgABTAAHZm9ybWF0c3QAEExqYXZhL3V0aWwvTGlzdDt4cQB+ABV+cQB+AAt0AAlUSU1FU1RBTVB+cQB+ABt0AAREYXRlcQB+ACBzcQB+AAAAAAABdwQAAAAAeHQABmdlbmRlcnNxAH4AE3EAfgAZcQB+ABxxAH4AIHNxAH4AAAAAAAN3BAAAAAJ0AAdrZXl3b3Jkc3EAfgAVcQB+ABB+cQB+ABt0AAdLZXl3b3JkcQB+ACB4dAAEY2l0eXEAfgAQdAAIbGFzdG5hbWVxAH4AEHQAB2JhbGFuY2VxAH4ADXQACGVtcGxveWVyc3EAfgATcQB+ABlxAH4AHHEAfgAgcQB+ACR0AAVzdGF0ZXNxAH4AE3EAfgAZcQB+ABxxAH4AIHNxAH4AAAAAAAN3BAAAAAJxAH4AMXEAfgAyeHQAA2FnZX5xAH4AC3QAB0lOVEVHRVJ0AAVlbWFpbHNxAH4AE3EAfgAZcQB+ABxxAH4AIHEAfgAkdAAEbWFsZX5xAH4AC3QAB0JPT0xFQU54AHg=\\\"}\",\"lang\":\"opensearch_compounded_script\",\"params\":{\"utcTimestamp\":*}}}}}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])\n"
55
}
6-
}
6+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"calcite": {
33
"logical": "LogicalSystemLimit(sort0=[$0], dir0=[ASC-nulls-first], fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(age=[$8])\n LogicalSort(sort0=[$8], dir0=[ASC-nulls-first])\n LogicalSort(fetch=[5])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
4-
"physical": "EnumerableSort(sort0=[$0], dir0=[ASC-nulls-first])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[LIMIT->5, PROJECT->[age], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":5,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"age\"],\"excludes\":[]}}, requestedTotalSize=5, pageSize=null, startFrom=0)])\n"
4+
"physical": "EnumerableLimit(fetch=[10000])\n EnumerableSort(sort0=[$0], dir0=[ASC-nulls-first])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[LIMIT->5, PROJECT->[age]], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":5,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"age\"],\"excludes\":[]}}, requestedTotalSize=5, pageSize=null, startFrom=0)])\n"
55
}
6-
}
6+
}

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/scan/CalciteEnumerableIndexScan.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void register(RelOptPlanner planner) {
7373
for (RelOptRule rule : OpenSearchRules.OPEN_SEARCH_OPT_RULES) {
7474
planner.addRule(rule);
7575
}
76-
76+
7777
for (RelOptRule rule : OpenSearchRules.OPTIMIZATION_RULES) {
7878
planner.addRule(rule);
7979
}

0 commit comments

Comments
 (0)