Skip to content

Commit f66d5a3

Browse files
committed
Support pushdown dedup with Calcite
Signed-off-by: Lantao Jin <ltjin@amazon.com>
1 parent 338d2e8 commit f66d5a3

16 files changed

Lines changed: 332 additions & 45 deletions

File tree

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

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static org.opensearch.sql.ast.tree.Sort.SortOption.DEFAULT_DESC;
1414
import static org.opensearch.sql.ast.tree.Sort.SortOrder.ASC;
1515
import static org.opensearch.sql.ast.tree.Sort.SortOrder.DESC;
16+
import static org.opensearch.sql.calcite.utils.PlanUtils.ROW_NUMBER_COLUMN_FOR_DEDUP;
1617
import static org.opensearch.sql.calcite.utils.PlanUtils.ROW_NUMBER_COLUMN_NAME;
1718
import static org.opensearch.sql.calcite.utils.PlanUtils.ROW_NUMBER_COLUMN_NAME_MAIN;
1819
import static org.opensearch.sql.calcite.utils.PlanUtils.ROW_NUMBER_COLUMN_NAME_SUBSEARCH;
@@ -821,13 +822,14 @@ public RelNode visitDedupe(Dedupe node, CalcitePlanContext context) {
821822
if (keepEmpty) {
822823
/*
823824
* | dedup 2 a, b keepempty=false
824-
* DropColumns('_row_number_)
825-
* +- Filter ('_row_number_ <= n OR isnull('a) OR isnull('b))
826-
* +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
825+
* DropColumns('_row_number_dedup_)
826+
* +- Filter ('_row_number_dedup_ <= n OR isnull('a) OR isnull('b))
827+
* +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_dedup_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
827828
* +- ...
828829
*/
829830
// Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST,
830-
// specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC
831+
// specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_dedup_], ['a, 'b], ['a
832+
// ASC
831833
// NULLS FIRST, 'b ASC NULLS FIRST]
832834
RexNode rowNumber =
833835
context
@@ -837,23 +839,23 @@ public RelNode visitDedupe(Dedupe node, CalcitePlanContext context) {
837839
.partitionBy(dedupeFields)
838840
.orderBy(dedupeFields)
839841
.rowsTo(RexWindowBounds.CURRENT_ROW)
840-
.as("_row_number_");
842+
.as(ROW_NUMBER_COLUMN_FOR_DEDUP);
841843
context.relBuilder.projectPlus(rowNumber);
842-
RexNode _row_number_ = context.relBuilder.field("_row_number_");
843-
// Filter (isnull('a) OR isnull('b) OR '_row_number_ <= n)
844+
RexNode _row_number_dedup_ = context.relBuilder.field(ROW_NUMBER_COLUMN_FOR_DEDUP);
845+
// Filter (isnull('a) OR isnull('b) OR '_row_number_dedup_ <= n)
844846
context.relBuilder.filter(
845847
context.relBuilder.or(
846848
context.relBuilder.or(dedupeFields.stream().map(context.relBuilder::isNull).toList()),
847849
context.relBuilder.lessThanOrEqual(
848-
_row_number_, context.relBuilder.literal(allowedDuplication))));
850+
_row_number_dedup_, context.relBuilder.literal(allowedDuplication))));
849851
// DropColumns('_row_number_)
850-
context.relBuilder.projectExcept(_row_number_);
852+
context.relBuilder.projectExcept(_row_number_dedup_);
851853
} else {
852854
/*
853855
* | dedup 2 a, b keepempty=false
854-
* DropColumns('_row_number_)
855-
* +- Filter ('_row_number_ <= n)
856-
* +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
856+
* DropColumns('_row_number_dedup_)
857+
* +- Filter ('_row_number_dedup_ <= n)
858+
* +- Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST, specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_dedup_], ['a, 'b], ['a ASC NULLS FIRST, 'b ASC NULLS FIRST]
857859
* +- Filter (isnotnull('a) AND isnotnull('b))
858860
* +- ...
859861
*/
@@ -862,7 +864,8 @@ public RelNode visitDedupe(Dedupe node, CalcitePlanContext context) {
862864
context.relBuilder.and(
863865
dedupeFields.stream().map(context.relBuilder::isNotNull).toList()));
864866
// Window [row_number() windowspecdefinition('a, 'b, 'a ASC NULLS FIRST, 'b ASC NULLS FIRST,
865-
// specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_], ['a, 'b], ['a ASC
867+
// specifiedwindowoundedpreceding$(), currentrow$())) AS _row_number_dedup_], ['a, 'b], ['a
868+
// ASC
866869
// NULLS FIRST, 'b ASC NULLS FIRST]
867870
RexNode rowNumber =
868871
context
@@ -872,15 +875,15 @@ public RelNode visitDedupe(Dedupe node, CalcitePlanContext context) {
872875
.partitionBy(dedupeFields)
873876
.orderBy(dedupeFields)
874877
.rowsTo(RexWindowBounds.CURRENT_ROW)
875-
.as("_row_number_");
878+
.as(ROW_NUMBER_COLUMN_FOR_DEDUP);
876879
context.relBuilder.projectPlus(rowNumber);
877-
RexNode _row_number_ = context.relBuilder.field("_row_number_");
878-
// Filter ('_row_number_ <= n)
880+
RexNode _row_number_dedup_ = context.relBuilder.field(ROW_NUMBER_COLUMN_FOR_DEDUP);
881+
// Filter ('_row_number_dedup_ <= n)
879882
context.relBuilder.filter(
880883
context.relBuilder.lessThanOrEqual(
881-
_row_number_, context.relBuilder.literal(allowedDuplication)));
882-
// DropColumns('_row_number_)
883-
context.relBuilder.projectExcept(_row_number_);
884+
_row_number_dedup_, context.relBuilder.literal(allowedDuplication)));
885+
// DropColumns('_row_number_dedup_)
886+
context.relBuilder.projectExcept(_row_number_dedup_);
884887
}
885888
return context.relBuilder.peek();
886889
}

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@
2020
import org.apache.calcite.rel.RelNode;
2121
import org.apache.calcite.rel.RelShuttle;
2222
import org.apache.calcite.rel.core.TableScan;
23+
import org.apache.calcite.rel.logical.LogicalProject;
2324
import org.apache.calcite.rex.RexCall;
2425
import org.apache.calcite.rex.RexInputRef;
26+
import org.apache.calcite.rex.RexLiteral;
2527
import org.apache.calcite.rex.RexNode;
28+
import org.apache.calcite.rex.RexOver;
2629
import org.apache.calcite.rex.RexVisitorImpl;
30+
import org.apache.calcite.rex.RexWindow;
2731
import org.apache.calcite.rex.RexWindowBound;
32+
import org.apache.calcite.sql.SqlKind;
2833
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
2934
import org.apache.calcite.sql.type.SqlTypeName;
3035
import org.apache.calcite.tools.RelBuilder;
@@ -43,6 +48,9 @@
4348

4449
public interface PlanUtils {
4550

51+
/** this is only for dedup command, do not reuse it in other command */
52+
String ROW_NUMBER_COLUMN_FOR_DEDUP = "_row_number_dedup_";
53+
4654
String ROW_NUMBER_COLUMN_NAME = "_row_number_";
4755
String ROW_NUMBER_COLUMN_NAME_MAIN = "_row_number_main_";
4856
String ROW_NUMBER_COLUMN_NAME_SUBSEARCH = "_row_number_subsearch_";
@@ -347,4 +355,52 @@ static RexNode derefMapCall(RexNode rexNode) {
347355
}
348356
return rexNode;
349357
}
358+
359+
static List<RexLiteral> findLiterals(RexNode node, boolean deep) {
360+
final RexVisitorImpl<RexLiteral> visitor =
361+
new RexVisitorImpl<>(deep) {
362+
@Override
363+
public RexLiteral visitLiteral(RexLiteral literal) {
364+
return literal;
365+
}
366+
};
367+
return visitor.visitList(List.of(node));
368+
}
369+
370+
/** Check if contains RexOver */
371+
static boolean containsRowNumberDedup(LogicalProject project) {
372+
return project.getProjects().stream()
373+
.anyMatch(p -> p instanceof RexOver && p.getKind() == SqlKind.ROW_NUMBER);
374+
}
375+
376+
/** Get all RexWindow list from LogicalProject */
377+
static List<RexWindow> getRexWindowFromProject(LogicalProject project) {
378+
final List<RexWindow> res = new ArrayList<>();
379+
final RexVisitorImpl<Void> visitor =
380+
new RexVisitorImpl<>(true) {
381+
@Override
382+
public Void visitOver(RexOver over) {
383+
res.add(over.getWindow());
384+
return null;
385+
}
386+
};
387+
visitor.visitEach(project.getProjects());
388+
return res;
389+
}
390+
391+
static List<Integer> getSelectColumns(List<RexNode> rexNodes) {
392+
final List<Integer> selectedColumns = new ArrayList<>();
393+
final RexVisitorImpl<Void> visitor =
394+
new RexVisitorImpl<Void>(true) {
395+
@Override
396+
public Void visitInputRef(RexInputRef inputRef) {
397+
if (!selectedColumns.contains(inputRef.getIndex())) {
398+
selectedColumns.add(inputRef.getIndex());
399+
}
400+
return null;
401+
}
402+
};
403+
visitor.visitEach(rexNodes);
404+
return selectedColumns;
405+
}
350406
}

core/src/main/java/org/opensearch/sql/executor/QueryService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.apache.calcite.rel.RelNode;
2424
import org.apache.calcite.rel.core.Sort;
2525
import org.apache.calcite.rel.logical.LogicalSort;
26-
import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider;
2726
import org.apache.calcite.schema.SchemaPlus;
2827
import org.apache.calcite.sql.parser.SqlParser;
2928
import org.apache.calcite.tools.FrameworkConfig;
@@ -298,7 +297,7 @@ private FrameworkConfig buildFrameworkConfig() {
298297
.parserConfig(SqlParser.Config.DEFAULT) // TODO check
299298
.defaultSchema(opensearchSchema)
300299
.traitDefs((List<RelTraitDef>) null)
301-
.programs(Programs.calc(DefaultRelMetadataProvider.INSTANCE))
300+
.programs(Programs.standard())
302301
.typeSystem(OpenSearchTypeSystem.INSTANCE);
303302
return configBuilder.build();
304303
}

integ-test/src/test/java/org/opensearch/sql/ppl/ExplainIT.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,16 @@ public void testStatsByTimeSpan() throws IOException {
427427
String.format("source=%s | stats count() by span(birthdate,1M)", TEST_INDEX_BANK)));
428428
}
429429

430+
@Test
431+
public void testDedupPushdownV3() throws IOException {
432+
String expected = loadExpectedPlan("explain_dedup_push.json");
433+
assertJsonEqualsIgnoreId(
434+
expected,
435+
explainQueryToString(
436+
"source=opensearch-sql_test_index_account | fields account_number, gender, age"
437+
+ " | dedup 1 gender"));
438+
}
439+
430440
@Test
431441
public void testSingleFieldRelevanceQueryFunctionExplain() throws IOException {
432442
// This test is only applicable if pushdown is enabled
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"calcite": {
3+
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], gender=[$1], age=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(account_number=[$0], gender=[$1], age=[$2], _row_number_dedup_=[ROW_NUMBER() OVER (PARTITION BY $1 ORDER BY $1)])\n LogicalFilter(condition=[IS NOT NULL($1)])\n LogicalProject(account_number=[$0], gender=[$4], age=[$8])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
4+
"physical": "CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, gender, age], COLLAPSE->gender, LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":10000,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"account_number\",\"gender\",\"age\"],\"excludes\":[]},\"collapse\":{\"field\":\"gender.keyword\"}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])\n"
5+
}
6+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"calcite": {
3-
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(age2=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[$2], _row_number_=[ROW_NUMBER() OVER (PARTITION BY $2 ORDER BY $2)])\n LogicalFilter(condition=[IS NOT NULL($2)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[+($0, 2)])\n LogicalSort(sort0=[$1], dir0=[ASC-nulls-first])\n LogicalProject(avg_age=[$2], state=[$0], city=[$1])\n LogicalAggregate(group=[{0, 1}], avg_age=[AVG($2)])\n LogicalProject(state=[$7], city=[$5], age=[$8])\n LogicalFilter(condition=[>($8, 30)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
3+
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(age2=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[$2], _row_number_dedup_=[ROW_NUMBER() OVER (PARTITION BY $2 ORDER BY $2)])\n LogicalFilter(condition=[IS NOT NULL($2)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[+($0, 2)])\n LogicalSort(sort0=[$1], dir0=[ASC-nulls-first])\n LogicalProject(avg_age=[$2], state=[$0], city=[$1])\n LogicalAggregate(group=[{0, 1}], avg_age=[AVG($2)])\n LogicalProject(state=[$7], city=[$5], age=[$8])\n LogicalFilter(condition=[>($8, 30)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
44
"physical": "EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..2=[{inputs}], expr#3=[1], expr#4=[<=($t2, $t3)], age2=[$t1], $condition=[$t4])\n EnumerableWindow(window#0=[window(partition {1} order by [1] rows between UNBOUNDED PRECEDING and CURRENT ROW aggs [ROW_NUMBER()])])\n EnumerableCalc(expr#0..2=[{inputs}], expr#3=[2], expr#4=[+($t2, $t3)], expr#5=[IS NOT NULL($t2)], state=[$t0], age2=[$t4], $condition=[$t5])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[city, state, age], FILTER->>($2, 30), AGGREGATION->rel#:LogicalAggregate.NONE.[](input=RelSubset#,group={0, 1},avg_age=AVG($2)), SORT->[0 ASC FIRST]], OpenSearchRequestBuilder(sourceBuilder={\"from\":0,\"size\":0,\"timeout\":\"1m\",\"query\":{\"range\":{\"age\":{\"from\":30,\"to\":null,\"include_lower\":false,\"include_upper\":true,\"boost\":1.0}}},\"_source\":{\"includes\":[\"city\",\"state\",\"age\"],\"excludes\":[]},\"sort\":[{\"_doc\":{\"order\":\"asc\"}}],\"aggregations\":{\"composite_buckets\":{\"composite\":{\"size\":10,\"sources\":[{\"state\":{\"terms\":{\"field\":\"state.keyword\",\"missing_bucket\":true,\"missing_order\":\"first\",\"order\":\"asc\"}}},{\"city\":{\"terms\":{\"field\":\"city.keyword\",\"missing_bucket\":true,\"missing_order\":\"first\",\"order\":\"asc\"}}}]},\"aggregations\":{\"avg_age\":{\"avg\":{\"field\":\"age\"}}}}}}, requestedTotalSize=2147483647, pageSize=null, startFrom=0)])\n"
55
}
66
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"calcite": {
3+
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(account_number=[$0], gender=[$1], age=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(account_number=[$0], gender=[$1], age=[$2], _row_number_dedup_=[ROW_NUMBER() OVER (PARTITION BY $1 ORDER BY $1)])\n LogicalFilter(condition=[IS NOT NULL($1)])\n LogicalProject(account_number=[$0], gender=[$4], age=[$8])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
4+
"physical": "EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..17=[{inputs}], expr#18=[1], expr#19=[<=($t17, $t18)], account_number=[$t0], gender=[$t4], age=[$t8], $condition=[$t19])\n EnumerableWindow(window#0=[window(partition {4} order by [4] rows between UNBOUNDED PRECEDING and CURRENT ROW aggs [ROW_NUMBER()])])\n EnumerableCalc(expr#0..16=[{inputs}], expr#17=[IS NOT NULL($t4)], proj#0..16=[{exprs}], $condition=[$t17])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n"
5+
}
6+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"calcite": {
3-
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(age2=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[$2], _row_number_=[ROW_NUMBER() OVER (PARTITION BY $2 ORDER BY $2)])\n LogicalFilter(condition=[IS NOT NULL($2)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[+($0, 2)])\n LogicalSort(sort0=[$1], dir0=[ASC-nulls-first])\n LogicalProject(avg_age=[$2], state=[$0], city=[$1])\n LogicalAggregate(group=[{0, 1}], avg_age=[AVG($2)])\n LogicalProject(state=[$7], city=[$5], age=[$8])\n LogicalFilter(condition=[>($8, 30)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
3+
"logical": "LogicalSystemLimit(fetch=[10000], type=[QUERY_SIZE_LIMIT])\n LogicalProject(age2=[$2])\n LogicalFilter(condition=[<=($3, 1)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[$2], _row_number_dedup_=[ROW_NUMBER() OVER (PARTITION BY $2 ORDER BY $2)])\n LogicalFilter(condition=[IS NOT NULL($2)])\n LogicalProject(avg_age=[$0], state=[$1], age2=[+($0, 2)])\n LogicalSort(sort0=[$1], dir0=[ASC-nulls-first])\n LogicalProject(avg_age=[$2], state=[$0], city=[$1])\n LogicalAggregate(group=[{0, 1}], avg_age=[AVG($2)])\n LogicalProject(state=[$7], city=[$5], age=[$8])\n LogicalFilter(condition=[>($8, 30)])\n CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n",
44
"physical": "EnumerableCalc(expr#0..2=[{inputs}], age2=[$t1])\n EnumerableLimit(fetch=[10000])\n EnumerableCalc(expr#0..2=[{inputs}], expr#3=[1], expr#4=[<=($t2, $t3)], proj#0..2=[{exprs}], $condition=[$t4])\n EnumerableWindow(window#0=[window(partition {1} order by [1] rows between UNBOUNDED PRECEDING and CURRENT ROW aggs [ROW_NUMBER()])])\n EnumerableCalc(expr#0..3=[{inputs}], expr#4=[0], expr#5=[=($t3, $t4)], expr#6=[null:BIGINT], expr#7=[CASE($t5, $t6, $t2)], expr#8=[CAST($t7):DOUBLE], expr#9=[/($t8, $t3)], expr#10=[2], expr#11=[+($t9, $t10)], expr#12=[IS NOT NULL($t8)], state=[$t1], age2=[$t11], $condition=[$t12])\n EnumerableSort(sort0=[$1], dir0=[ASC-nulls-first])\n EnumerableAggregate(group=[{5, 7}], agg#0=[$SUM0($8)], agg#1=[COUNT($8)])\n EnumerableCalc(expr#0..16=[{inputs}], expr#17=[30], expr#18=[>($t8, $t17)], proj#0..16=[{exprs}], $condition=[$t18])\n CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])\n"
55
}
66
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"root": {
3+
"name": "ProjectOperator",
4+
"description": {
5+
"fields": "[account_number, gender, age]"
6+
},
7+
"children": [{
8+
"name": "DedupeOperator",
9+
"description": {
10+
"dedupeList": "[gender]",
11+
"allowedDuplication": 1,
12+
"keepEmpty": false,
13+
"consecutive": false
14+
},
15+
"children": [{
16+
"name": "ProjectOperator",
17+
"description": {
18+
"fields": "[account_number, gender, age]"
19+
},
20+
"children": [{
21+
"name": "OpenSearchIndexScan",
22+
"description": {
23+
"request": "OpenSearchQueryRequest(indexName=opensearch-sql_test_index_account, sourceBuilder={\"from\":0,\"size\":10000,\"timeout\":\"1m\",\"_source\":{\"includes\":[\"account_number\",\"gender\",\"age\"],\"excludes\":[]}}, needClean=true, searchDone=false, pitId=*, cursorKeepAlive=1m, searchAfter=null, searchResponse=null)"
24+
},
25+
"children": []
26+
}]
27+
}]
28+
}]
29+
}
30+
}

0 commit comments

Comments
 (0)