Skip to content

Commit cbcdbd6

Browse files
authored
Support pushdown dedup with expression (opensearch-project#4957)
* Support pushdown dedup with expression Signed-off-by: Lantao Jin <ltjin@amazon.com> * Fix java spotless check Signed-off-by: Lantao Jin <ltjin@amazon.com> * Support dedup with expression Signed-off-by: Lantao Jin <ltjin@amazon.com> * fix yaml test Signed-off-by: Lantao Jin <ltjin@amazon.com> * simplify Signed-off-by: Lantao Jin <ltjin@amazon.com> * address comments Signed-off-by: Lantao Jin <ltjin@amazon.com> * fix javadoc Signed-off-by: Lantao Jin <ltjin@amazon.com> * address comments Signed-off-by: Lantao Jin <ltjin@amazon.com> * delete unexpected files Signed-off-by: Lantao Jin <ltjin@amazon.com> --------- Signed-off-by: Lantao Jin <ltjin@amazon.com>
1 parent 7dfabce commit cbcdbd6

39 files changed

Lines changed: 655 additions & 170 deletions

File tree

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

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,7 +2044,7 @@ public void testComplexDedup() throws IOException {
20442044
+ " dedup 2 gender, state"));
20452045
}
20462046

2047-
@Ignore("https://github.com/opensearch-project/sql/issues/4789")
2047+
@Test
20482048
public void testDedupExpr() throws IOException {
20492049
enabledOnlyWhenPushdownIsEnabled();
20502050
String expected = loadExpectedPlan("explain_dedup_expr1.yaml");
@@ -2054,30 +2054,36 @@ public void testDedupExpr() throws IOException {
20542054
"source=opensearch-sql_test_index_account | eval new_gender = lower(gender) | dedup 1"
20552055
+ " new_gender"));
20562056
expected = loadExpectedPlan("explain_dedup_expr2.yaml");
2057+
String alternative = loadExpectedPlan("explain_dedup_expr2_alternative.yaml");
20572058
assertYamlEqualsIgnoreId(
20582059
expected,
2060+
alternative,
20592061
explainQueryYaml(
20602062
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
20612063
+ " eval new_gender = lower(gender), new_state = lower(state) | dedup 1 new_gender,"
20622064
+ " new_state"));
20632065
expected = loadExpectedPlan("explain_dedup_expr3.yaml");
2066+
alternative = loadExpectedPlan("explain_dedup_expr3_alternative.yaml");
20642067
assertYamlEqualsIgnoreId(
20652068
expected,
2069+
alternative,
20662070
explainQueryYaml(
20672071
"source=opensearch-sql_test_index_account | eval new_gender = lower(gender) | eval"
20682072
+ " new_state = lower(state) | dedup 2 new_gender, new_state"));
20692073
expected = loadExpectedPlan("explain_dedup_expr4.yaml");
2074+
alternative = loadExpectedPlan("explain_dedup_expr4_alternative.yaml");
20702075
assertYamlEqualsIgnoreId(
20712076
expected,
2077+
alternative,
20722078
explainQueryYaml(
20732079
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
20742080
+ " eval new_gender = lower(gender) | eval new_state = lower(state) | sort gender,"
20752081
+ " -state | dedup 2 new_gender, new_state"));
20762082
}
20772083

2078-
@Ignore("https://github.com/opensearch-project/sql/issues/4789")
2084+
@Test
20792085
public void testDedupRename() throws IOException {
2080-
// rename changes nothing, reuse the same yaml files of testDedupExpr()
2086+
// rename changes nothing, reuse the same yaml files
20812087
enabledOnlyWhenPushdownIsEnabled();
20822088
String expected = loadExpectedPlan("explain_dedup_expr1.yaml");
20832089
assertYamlEqualsIgnoreId(
@@ -2086,41 +2092,96 @@ public void testDedupRename() throws IOException {
20862092
"source=opensearch-sql_test_index_account | eval tmp_gender = lower(gender) | rename"
20872093
+ " tmp_gender as new_gender | dedup 1 new_gender"));
20882094
expected = loadExpectedPlan("explain_dedup_expr2.yaml");
2095+
String alternative = loadExpectedPlan("explain_dedup_expr2_alternative.yaml");
20892096
assertYamlEqualsIgnoreId(
20902097
expected,
2098+
alternative,
20912099
explainQueryYaml(
20922100
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
20932101
+ " eval tmp_gender = lower(gender), tmp_state = lower(state) | rename tmp_gender"
20942102
+ " as new_gender | rename tmp_state as new_state | dedup 1 new_gender,"
20952103
+ " new_state"));
20962104
expected = loadExpectedPlan("explain_dedup_expr3.yaml");
2105+
alternative = loadExpectedPlan("explain_dedup_expr3_alternative.yaml");
20972106
assertYamlEqualsIgnoreId(
20982107
expected,
2108+
alternative,
20992109
explainQueryYaml(
21002110
"source=opensearch-sql_test_index_account | eval tmp_gender = lower(gender) | eval"
21012111
+ " tmp_state = lower(state) | rename tmp_gender as new_gender | rename tmp_state"
21022112
+ " as new_state | dedup 2 new_gender, new_state"));
21032113
expected = loadExpectedPlan("explain_dedup_expr4.yaml");
2114+
alternative = loadExpectedPlan("explain_dedup_expr4_alternative.yaml");
21042115
assertYamlEqualsIgnoreId(
21052116
expected,
2117+
alternative,
21062118
explainQueryYaml(
21072119
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
21082120
+ " eval tmp_gender = lower(gender) | eval tmp_state = lower(state) | rename"
21092121
+ " tmp_gender as new_gender | rename tmp_state as new_state | sort gender,"
21102122
+ " -state | dedup 2 new_gender, new_state"));
21112123
}
21122124

2113-
@Ignore("SortExprIndexScanRule not work?")
2114-
public void testDedupRename2() throws IOException {
2125+
@Test
2126+
public void testRenameDedupThenSortExpr() throws IOException {
21152127
enabledOnlyWhenPushdownIsEnabled();
2116-
String expected = loadExpectedPlan("explain_dedup_expr4.yaml");
2128+
String expected = loadExpectedPlan("explain_dedup_expr_complex1.yaml");
2129+
String alternative = loadExpectedPlan("explain_dedup_expr_complex1_alternative.yaml");
21172130
assertYamlEqualsIgnoreId(
21182131
expected,
2132+
alternative,
21192133
explainQueryYaml(
21202134
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
21212135
+ " eval tmp_gender = lower(gender) | eval tmp_state = lower(state) | rename"
21222136
+ " tmp_gender as new_gender | rename tmp_state as new_state | sort new_gender,"
21232137
+ " -new_state | dedup 2 new_gender, new_state"));
2138+
expected = loadExpectedPlan("explain_dedup_expr_complex2.yaml");
2139+
alternative = loadExpectedPlan("explain_dedup_expr_complex2_alternative.yaml");
2140+
assertYamlEqualsIgnoreId(
2141+
expected,
2142+
alternative,
2143+
explainQueryYaml(
2144+
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
2145+
+ " eval tmp_gender = lower(gender) | eval tmp_state = lower(state) | rename"
2146+
+ " tmp_gender as new_gender | rename tmp_state as new_state | dedup 2 new_gender,"
2147+
+ " new_state | sort new_gender, -new_state"));
2148+
}
2149+
2150+
@Test
2151+
public void testDedupWithExpr() throws IOException {
2152+
enabledOnlyWhenPushdownIsEnabled();
2153+
String expected = loadExpectedPlan("explain_dedup_with_expr1.yaml");
2154+
assertYamlEqualsIgnoreId(
2155+
expected,
2156+
explainQueryYaml(
2157+
"source=opensearch-sql_test_index_account | eval new_gender = lower(gender) | dedup 1"
2158+
+ " age"));
2159+
expected = loadExpectedPlan("explain_dedup_with_expr2.yaml");
2160+
String alternative = loadExpectedPlan("explain_dedup_with_expr2_alternative.yaml");
2161+
assertYamlEqualsIgnoreId(
2162+
expected,
2163+
alternative,
2164+
explainQueryYaml(
2165+
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
2166+
+ " eval new_gender = lower(gender), new_state = lower(state) | dedup 1 age,"
2167+
+ " new_state"));
2168+
expected = loadExpectedPlan("explain_dedup_with_expr3.yaml");
2169+
alternative = loadExpectedPlan("explain_dedup_with_expr3_alternative.yaml");
2170+
assertYamlEqualsIgnoreId(
2171+
expected,
2172+
alternative,
2173+
explainQueryYaml(
2174+
"source=opensearch-sql_test_index_account | eval new_gender = lower(gender) | eval"
2175+
+ " new_state = lower(state) | dedup 2 age, account_number"));
2176+
expected = loadExpectedPlan("explain_dedup_with_expr4.yaml");
2177+
alternative = loadExpectedPlan("explain_dedup_with_expr4_alternative.yaml");
2178+
assertYamlEqualsIgnoreId(
2179+
expected,
2180+
alternative,
2181+
explainQueryYaml(
2182+
"source=opensearch-sql_test_index_account | fields account_number, gender, age, state |"
2183+
+ " eval new_gender = lower(gender) | eval new_state = lower(state) | sort gender,"
2184+
+ " -state | dedup 2 gender, state"));
21242185
}
21252186

21262187
@Test

integ-test/src/test/java/org/opensearch/sql/util/MatcherUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,25 @@ public static void assertYamlEqualsIgnoreId(String expectedYaml, String actualYa
447447
assertYamlEquals(cleanUpYaml(expectedYaml), cleanUpYaml(actualYaml));
448448
}
449449

450+
/**
451+
* Compare actual YAML with two expected YAML strings, using the second as a fallback. This is
452+
* useful when the DSL implementation can produce multiple valid plan variants. If the first
453+
* comparison fails, attempts the second comparison instead.
454+
*
455+
* @param expectedYaml1 the primary expected YAML string
456+
* @param expectedYaml2 the fallback expected YAML string
457+
* @param actualYaml the actual YAML string to compare
458+
* @throws AssertionError if both comparisons fail (reports only the second failure)
459+
*/
460+
public static void assertYamlEqualsIgnoreId(
461+
String expectedYaml1, String expectedYaml2, String actualYaml) {
462+
try {
463+
assertYamlEquals(cleanUpYaml(expectedYaml1), cleanUpYaml(actualYaml));
464+
} catch (AssertionError e) {
465+
assertYamlEquals(cleanUpYaml(expectedYaml2), cleanUpYaml(actualYaml));
466+
}
467+
}
468+
450469
public static void assertYamlEquals(String expected, String actual) {
451470
String normalizedExpected = normalizeLineBreaks(expected).trim();
452471
String normalizedActual = normalizeLineBreaks(actual).trim();

integ-test/src/test/resources/expectedOutput/calcite/explain_complex_sort_expr_pushdown_for_smj_w_max_option.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ calcite:
1818
EnumerableMergeJoin(condition=[=($0, $7)], joinType=[left])
1919
EnumerableCalc(expr#0=[{inputs}], expr#1=['(?<lastname>^[A-Z])'], expr#2=['lastname'], expr#3=[REX_EXTRACT($t0, $t1, $t2)], $f0=[$t3])
2020
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_bank]], PushDownContext=[[PROJECT->[lastname], LIMIT->10000, SORT_EXPR->[REX_EXTRACT($0, '(?<lastname>^[A-Z])', 'lastname') ASCENDING NULLS_LAST]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":10000,"timeout":"1m","_source":{"includes":["lastname"],"excludes":[]},"sort":[{"_script":{"script":{"source":"{\"langType\":\"calcite\",\"script\":\"rO0ABXQC63sKICAib3AiOiB7CiAgICAibmFtZSI6ICJSRVhfRVhUUkFDVCIsCiAgICAia2luZCI6ICJPVEhFUl9GVU5DVElPTiIsCiAgICAic3ludGF4IjogIkZVTkNUSU9OIgogIH0sCiAgIm9wZXJhbmRzIjogWwogICAgewogICAgICAiZHluYW1pY1BhcmFtIjogMCwKICAgICAgInR5cGUiOiB7CiAgICAgICAgInR5cGUiOiAiVkFSQ0hBUiIsCiAgICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgICAicHJlY2lzaW9uIjogLTEKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImR5bmFtaWNQYXJhbSI6IDEsCiAgICAgICJ0eXBlIjogewogICAgICAgICJ0eXBlIjogIlZBUkNIQVIiLAogICAgICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAgICAgInByZWNpc2lvbiI6IC0xCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJkeW5hbWljUGFyYW0iOiAyLAogICAgICAidHlwZSI6IHsKICAgICAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAgICJwcmVjaXNpb24iOiAtMQogICAgICB9CiAgICB9CiAgXSwKICAiY2xhc3MiOiAib3JnLm9wZW5zZWFyY2guc3FsLmV4cHJlc3Npb24uZnVuY3Rpb24uVXNlckRlZmluZWRGdW5jdGlvbkJ1aWxkZXIkMSIsCiAgInR5cGUiOiB7CiAgICAidHlwZSI6ICJWQVJDSEFSIiwKICAgICJudWxsYWJsZSI6IHRydWUsCiAgICAicHJlY2lzaW9uIjogMjAwMAogIH0sCiAgImRldGVybWluaXN0aWMiOiB0cnVlLAogICJkeW5hbWljIjogZmFsc2UKfQ==\"}","lang":"opensearch_compounded_script","params":{"MISSING_MAX":true,"utcTimestamp": 0,"SOURCES":[0,2,2],"DIGESTS":["lastname","(?<lastname>^[A-Z])","lastname"]}},"type":"string","order":"asc"}}]}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
21-
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_bank]], PushDownContext=[[PROJECT->[account_number, firstname, address, birthdate, gender, city, lastname, balance, employer, state, age, email, male], AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0},agg#0=LITERAL_AGG(1)), LIMIT->50000, SORT->[6]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","_source":{"includes":["account_number","firstname","address","birthdate","gender","city","lastname","balance","employer","state","age","email","male"],"excludes":[]},"aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"lastname":{"terms":{"field":"lastname","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f1":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["lastname","account_number","firstname","address","birthdate","gender","city","balance","employer","state","age","email","male"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=50000, pageSize=null, startFrom=0)])
21+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_bank]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0},agg#0=LITERAL_AGG(1)), LIMIT->50000, SORT->[6]], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"lastname":{"terms":{"field":"lastname","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f1":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["lastname","account_number","firstname","address","birthdate","gender","city","balance","employer","state","age","email","male","_id","_index","_score","_maxscore","_sort","_routing"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=50000, pageSize=null, startFrom=0)])

integ-test/src/test/resources/expectedOutput/calcite/explain_dedup_complex1.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ calcite:
77
LogicalFilter(condition=[IS NOT NULL($4)])
88
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
99
physical: |
10-
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0},agg#0=LITERAL_AGG(1)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]},"aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f1":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","account_number","firstname","address","balance","city","employer","state","age","email","lastname"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
10+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0},agg#0=LITERAL_AGG(1)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f1":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","account_number","firstname","address","balance","city","employer","state","age","email","lastname","_id","_index","_score","_maxscore","_sort","_routing"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])

integ-test/src/test/resources/expectedOutput/calcite/explain_dedup_complex2.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ calcite:
88
LogicalProject(account_number=[$0], gender=[$4], age=[$8], state=[$7])
99
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
1010
physical: |
11-
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, gender, age, state], AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0, 1},agg#0=LITERAL_AGG(1)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","_source":{"includes":["account_number","gender","age","state"],"excludes":[]},"aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}},{"state":{"terms":{"field":"state.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f2":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","state","account_number","age"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
11+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0, 1},agg#0=LITERAL_AGG(1)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}},{"state":{"terms":{"field":"state.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f2":{"top_hits":{"from":0,"size":1,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","state","account_number","firstname","address","balance","city","employer","age","email","lastname","_id","_index","_score","_maxscore","_sort","_routing"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])

integ-test/src/test/resources/expectedOutput/calcite/explain_dedup_complex3.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ calcite:
77
LogicalFilter(condition=[AND(IS NOT NULL($4), IS NOT NULL($7))])
88
CalciteLogicalIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]])
99
physical: |
10-
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[PROJECT->[account_number, firstname, address, balance, gender, city, employer, state, age, email, lastname], AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0, 1},agg#0=LITERAL_AGG(2)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","_source":{"includes":["account_number","firstname","address","balance","gender","city","employer","state","age","email","lastname"],"excludes":[]},"aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}},{"state":{"terms":{"field":"state.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f2":{"top_hits":{"from":0,"size":2,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","state","account_number","firstname","address","balance","city","employer","age","email","lastname"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])
10+
CalciteEnumerableIndexScan(table=[[OpenSearch, opensearch-sql_test_index_account]], PushDownContext=[[AGGREGATION->rel#:LogicalAggregate.NONE.[](input=LogicalProject#,group={0, 1},agg#0=LITERAL_AGG(2)), LIMIT->10000], OpenSearchRequestBuilder(sourceBuilder={"from":0,"size":0,"timeout":"1m","aggregations":{"composite_buckets":{"composite":{"size":1000,"sources":[{"gender":{"terms":{"field":"gender.keyword","missing_bucket":false,"order":"asc"}}},{"state":{"terms":{"field":"state.keyword","missing_bucket":false,"order":"asc"}}}]},"aggregations":{"$f2":{"top_hits":{"from":0,"size":2,"version":false,"seq_no_primary_term":false,"explain":false,"_source":{"includes":["gender","state","account_number","firstname","address","balance","city","employer","age","email","lastname","_id","_index","_score","_maxscore","_sort","_routing"],"excludes":[]},"script_fields":{}}}}}}}, requestedTotalSize=10000, pageSize=null, startFrom=0)])

0 commit comments

Comments
 (0)