Skip to content

Commit a7c44d8

Browse files
committed
fix pushdown and add IT and explain IT
Signed-off-by: Jialiang Liang <jiallian@amazon.com>
1 parent ab37b5b commit a7c44d8

13 files changed

Lines changed: 184 additions & 10 deletions

File tree

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2795,4 +2795,29 @@ public void testNoMvWithEval() throws IOException {
27952795
"Expected explain to contain both CONCAT and ARRAY_JOIN",
27962796
result.toLowerCase().contains("concat") && result.toLowerCase().contains("array_join"));
27972797
}
2798+
2799+
@Test
2800+
public void testHighlightWildcardExplain() throws IOException {
2801+
String query = "source=" + TEST_INDEX_ACCOUNT + " | highlight *";
2802+
var result = explainQueryYaml(query);
2803+
String expected = loadExpectedPlan("explain_highlight_wildcard.yaml");
2804+
assertYamlEqualsIgnoreId(expected, result);
2805+
}
2806+
2807+
@Test
2808+
public void testHighlightSingleTermExplain() throws IOException {
2809+
String query = "source=" + TEST_INDEX_ACCOUNT + " | highlight \\\"Holmes\\\"";
2810+
var result = explainQueryYaml(query);
2811+
String expected = loadExpectedPlan("explain_highlight_single_term.yaml");
2812+
assertYamlEqualsIgnoreId(expected, result);
2813+
}
2814+
2815+
@Test
2816+
public void testHighlightWithFilterExplain() throws IOException {
2817+
String query =
2818+
"source=" + TEST_INDEX_ACCOUNT + " | highlight * | where age > 30 | fields firstname, age";
2819+
var result = explainQueryYaml(query);
2820+
String expected = loadExpectedPlan("explain_highlight_with_filter.yaml");
2821+
assertYamlEqualsIgnoreId(expected, result);
2822+
}
27982823
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], _highlight=[$17])
5+
LogicalHighlight(highlightArgs=[[Holmes]])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
7+
physical: |
8+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[Holmes], PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname, _highlight], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]},"highlight":{"fragment_size":2147483647,"fields":{"*":{"highlight_query":{"query_string":{"query":"\"Holmes\"","default_field":"*","fields":[],"type":"best_fields","default_operator":"or","max_determinized_states":10000,"enable_position_increments":true,"fuzziness":"AUTO","fuzzy_prefix_length":0,"fuzzy_max_expansions":50,"phrase_slop":0,"escape":false,"auto_generate_synonyms_phrase_query":true,"fuzzy_transpositions":true,"boost":1.0}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], _highlight=[$17])
5+
LogicalHighlight(highlightArgs=[[*]])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
7+
physical: |
8+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[*], PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname, _highlight], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]},"highlight":{"fragment_size":2147483647,"fields":{"*":{}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(firstname=[$1], age=[$8], _highlight=[$17])
5+
LogicalFilter(condition=[>($8, 30)])
6+
LogicalHighlight(highlightArgs=[[*]])
7+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
8+
physical: |
9+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[*], FILTER->>($8, 30), PROJECT->[firstname, age, _highlight], LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","query":{"range":{"age":{"from":30,"to":null,"include_lower":false,"include_upper":true,"boost":1.0}}},"_source":{"includes":["firstname","age"],"excludes":[]},"highlight":{"fragment_size":2147483647,"fields":{"*":{}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], _highlight=[$17])
5+
LogicalHighlight(highlightArgs=[[Holmes]])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
7+
physical: |
8+
EnumerableLimit(fetch=[10000])
9+
EnumerableCalc(expr#0..17=[{inputs}], proj#0..10=[{exprs}], _highlight=[$t17])
10+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[Holmes]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"timeout":"1m","highlight":{"fragment_size":2147483647,"fields":{"*":{"highlight_query":{"query_string":{"query":"\"Holmes\"","default_field":"*","fields":[],"type":"best_fields","default_operator":"or","max_determinized_states":10000,"enable_position_increments":true,"fuzziness":"AUTO","fuzzy_prefix_length":0,"fuzzy_max_expansions":50,"phrase_slop":0,"escape":false,"auto_generate_synonyms_phrase_query":true,"fuzzy_transpositions":true,"boost":1.0}}}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(account_number=[$0], firstname=[$1], address=[$2], balance=[$3], gender=[$4], city=[$5], employer=[$6], state=[$7], age=[$8], email=[$9], lastname=[$10], _highlight=[$17])
5+
LogicalHighlight(highlightArgs=[[*]])
6+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
7+
physical: |
8+
EnumerableLimit(fetch=[10000])
9+
EnumerableCalc(expr#0..17=[{inputs}], proj#0..10=[{exprs}], _highlight=[$t17])
10+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[*]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"timeout":"1m","highlight":{"fragment_size":2147483647,"fields":{"*":{}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
calcite:
2+
logical: |
3+
LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])
4+
LogicalProject(firstname=[$1], age=[$8], _highlight=[$17])
5+
LogicalFilter(condition=[>($8, 30)])
6+
LogicalHighlight(highlightArgs=[[*]])
7+
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
8+
physical: |
9+
EnumerableLimit(fetch=[10000])
10+
EnumerableCalc(expr#0..17=[{inputs}], expr#18=[30], expr#19=[>($t8, $t18)], firstname=[$t1], age=[$t8], _highlight=[$t17], $condition=[$t19])
11+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[HIGHLIGHT->[*]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"timeout":"1m","highlight":{"fragment_size":2147483647,"fields":{"*":{}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public double estimateRowCount(RelMetadataQuery mq) {
130130
(rowCount, operation) ->
131131
switch (operation.type()) {
132132
case AGGREGATION -> mq.getRowCount((RelNode) operation.digest());
133-
case PROJECT, SORT, SORT_EXPR -> rowCount;
133+
case PROJECT, SORT, SORT_EXPR, HIGHLIGHT -> rowCount;
134134
case SORT_AGG_METRICS ->
135135
NumberUtil.min(rowCount, osIndex.getQueryBucketSize().doubleValue());
136136
// Refer the org.apache.calcite.rel.metadata.RelMdRowCount
@@ -176,8 +176,8 @@ public double estimateRowCount(RelMetadataQuery mq) {
176176
dRows = mq.getRowCount((RelNode) operation.digest());
177177
dCpu += dRows * getAggMultiplier(operation);
178178
}
179-
// Ignored Project in cost accumulation, but it will affect the external cost
180-
case PROJECT -> {}
179+
// Ignored Project and Highlight in cost accumulation, but they affect the external cost
180+
case PROJECT, HIGHLIGHT -> {}
181181
case SORT -> dCpu += dRows;
182182
case SORT_AGG_METRICS -> {
183183
dRows = dRows * .9 / 10; // *.9 because always bucket IS_NOT_NULL

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
119119
@Override
120120
public Enumerator<Object> enumerator() {
121121
OpenSearchRequestBuilder requestBuilder = pushDownContext.createRequestBuilder();
122-
applyHighlightPushDown(requestBuilder, pushDownContext.getHighlightArgs());
123122
return new OpenSearchIndexEnumerator(
124123
osIndex.getClient(),
125124
getRowType().getFieldNames(),

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,13 @@ public RelNode pushDownHighlight(List<String> highlightArgs) {
9292
HighlightExpression.HIGHLIGHT_FIELD,
9393
getCluster().getTypeFactory().createSqlType(SqlTypeName.ANY));
9494
CalciteLogicalIndexScan newScan = copyWithNewSchema(schemaBuilder.build());
95-
newScan.getPushDownContext().setHighlightArgs(highlightArgs);
95+
newScan
96+
.getPushDownContext()
97+
.add(
98+
PushDownType.HIGHLIGHT,
99+
highlightArgs,
100+
(OSRequestBuilderAction)
101+
requestBuilder -> applyHighlightPushDown(requestBuilder, highlightArgs));
96102
return newScan;
97103
}
98104

0 commit comments

Comments
 (0)