Skip to content

Commit 112d5ce

Browse files
committed
Create scalffolds for implementing expand command
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 5eb2e5b commit 112d5ce

10 files changed

Lines changed: 180 additions & 77 deletions

File tree

core/src/main/java/org/opensearch/sql/ast/AbstractNodeVisitor.java

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,34 +43,7 @@
4343
import org.opensearch.sql.ast.statement.Explain;
4444
import org.opensearch.sql.ast.statement.Query;
4545
import org.opensearch.sql.ast.statement.Statement;
46-
import org.opensearch.sql.ast.tree.AD;
47-
import org.opensearch.sql.ast.tree.Aggregation;
48-
import org.opensearch.sql.ast.tree.CloseCursor;
49-
import org.opensearch.sql.ast.tree.Dedupe;
50-
import org.opensearch.sql.ast.tree.Eval;
51-
import org.opensearch.sql.ast.tree.FetchCursor;
52-
import org.opensearch.sql.ast.tree.FillNull;
53-
import org.opensearch.sql.ast.tree.Filter;
54-
import org.opensearch.sql.ast.tree.Head;
55-
import org.opensearch.sql.ast.tree.Join;
56-
import org.opensearch.sql.ast.tree.Kmeans;
57-
import org.opensearch.sql.ast.tree.Limit;
58-
import org.opensearch.sql.ast.tree.Lookup;
59-
import org.opensearch.sql.ast.tree.ML;
60-
import org.opensearch.sql.ast.tree.Paginate;
61-
import org.opensearch.sql.ast.tree.Parse;
62-
import org.opensearch.sql.ast.tree.Patterns;
63-
import org.opensearch.sql.ast.tree.Project;
64-
import org.opensearch.sql.ast.tree.RareTopN;
65-
import org.opensearch.sql.ast.tree.Relation;
66-
import org.opensearch.sql.ast.tree.RelationSubquery;
67-
import org.opensearch.sql.ast.tree.Rename;
68-
import org.opensearch.sql.ast.tree.Sort;
69-
import org.opensearch.sql.ast.tree.SubqueryAlias;
70-
import org.opensearch.sql.ast.tree.TableFunction;
71-
import org.opensearch.sql.ast.tree.Trendline;
72-
import org.opensearch.sql.ast.tree.Values;
73-
import org.opensearch.sql.ast.tree.Window;
46+
import org.opensearch.sql.ast.tree.*;
7447

7548
/** AST nodes visitor Defines the traverse path. */
7649
public abstract class AbstractNodeVisitor<T, C> {
@@ -344,6 +317,10 @@ public T visitFillNull(FillNull fillNull, C context) {
344317
return visitChildren(fillNull, context);
345318
}
346319

320+
public T visitExpand(Expand expand, C context) {
321+
return visitChildren(expand, context);
322+
}
323+
347324
public T visitPatterns(Patterns patterns, C context) {
348325
return visitChildren(patterns, context);
349326
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
*
3+
* * Copyright OpenSearch Contributors
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package org.opensearch.sql.ast.tree;
9+
10+
import lombok.EqualsAndHashCode;
11+
import lombok.Getter;
12+
import lombok.RequiredArgsConstructor;
13+
import lombok.ToString;
14+
import org.opensearch.sql.ast.AbstractNodeVisitor;
15+
import org.opensearch.sql.ast.Node;
16+
import org.opensearch.sql.ast.expression.Field;
17+
import org.opensearch.sql.ast.expression.UnresolvedExpression;
18+
19+
import java.util.List;
20+
import java.util.Optional;
21+
22+
/** AST node represent Expand operation. */
23+
@RequiredArgsConstructor
24+
@EqualsAndHashCode(callSuper = false)
25+
@ToString
26+
public class Expand extends UnresolvedPlan{
27+
private UnresolvedPlan child;
28+
@Getter
29+
private final Field field;
30+
@Getter
31+
private final Optional<UnresolvedExpression> alias;
32+
33+
@Override
34+
public Expand attach(UnresolvedPlan child) {
35+
this.child = child;
36+
return this;
37+
}
38+
39+
@Override
40+
public List<? extends Node> getChild() {
41+
return child == null ? List.of() : List.of(child);
42+
}
43+
44+
@Override
45+
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
46+
return nodeVisitor.visitExpand(this, context);
47+
}
48+
}

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

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,33 +56,9 @@
5656
import org.opensearch.sql.ast.expression.UnresolvedExpression;
5757
import org.opensearch.sql.ast.expression.WindowFrame;
5858
import org.opensearch.sql.ast.expression.subquery.SubqueryExpression;
59-
import org.opensearch.sql.ast.tree.AD;
60-
import org.opensearch.sql.ast.tree.Aggregation;
61-
import org.opensearch.sql.ast.tree.CloseCursor;
62-
import org.opensearch.sql.ast.tree.Dedupe;
63-
import org.opensearch.sql.ast.tree.Eval;
64-
import org.opensearch.sql.ast.tree.FetchCursor;
65-
import org.opensearch.sql.ast.tree.FillNull;
66-
import org.opensearch.sql.ast.tree.Filter;
67-
import org.opensearch.sql.ast.tree.Head;
68-
import org.opensearch.sql.ast.tree.Join;
69-
import org.opensearch.sql.ast.tree.Kmeans;
70-
import org.opensearch.sql.ast.tree.Lookup;
59+
import org.opensearch.sql.ast.tree.*;
7160
import org.opensearch.sql.ast.tree.Lookup.OutputStrategy;
72-
import org.opensearch.sql.ast.tree.ML;
73-
import org.opensearch.sql.ast.tree.Paginate;
74-
import org.opensearch.sql.ast.tree.Parse;
75-
import org.opensearch.sql.ast.tree.Project;
76-
import org.opensearch.sql.ast.tree.RareTopN;
77-
import org.opensearch.sql.ast.tree.Relation;
78-
import org.opensearch.sql.ast.tree.Rename;
79-
import org.opensearch.sql.ast.tree.Sort;
8061
import org.opensearch.sql.ast.tree.Sort.SortOption;
81-
import org.opensearch.sql.ast.tree.SubqueryAlias;
82-
import org.opensearch.sql.ast.tree.TableFunction;
83-
import org.opensearch.sql.ast.tree.Trendline;
84-
import org.opensearch.sql.ast.tree.UnresolvedPlan;
85-
import org.opensearch.sql.ast.tree.Window;
8662
import org.opensearch.sql.calcite.plan.OpenSearchConstants;
8763
import org.opensearch.sql.calcite.utils.JoinAndLookupUtils;
8864
import org.opensearch.sql.calcite.utils.PlanUtils;
@@ -847,4 +823,9 @@ public RelNode visitTableFunction(TableFunction node, CalcitePlanContext context
847823
public RelNode visitTrendline(Trendline node, CalcitePlanContext context) {
848824
throw new CalciteUnsupportedException("Trendline command is unsupported in Calcite");
849825
}
826+
827+
@Override
828+
public RelNode visitExpand(Expand expand, CalcitePlanContext context) {
829+
throw new CalciteUnsupportedException("Expand command is unsupported in Calcite");
830+
}
850831
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
*
3+
* * Copyright OpenSearch Contributors
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package org.opensearch.sql.planner.logical;
9+
10+
import lombok.EqualsAndHashCode;
11+
import lombok.Getter;
12+
import lombok.ToString;
13+
import org.opensearch.sql.expression.Expression;
14+
15+
import java.util.Collections;
16+
17+
@ToString
18+
@EqualsAndHashCode(callSuper = true)
19+
public class LogicalExpand extends LogicalPlan{
20+
21+
@Getter
22+
private final Expression field;
23+
@Getter
24+
private final Expression alias;
25+
26+
public LogicalExpand(LogicalPlan child, Expression field, Expression alias) {
27+
super(Collections.singletonList(child));
28+
this.field = field;
29+
this.alias = alias;
30+
}
31+
32+
@Override
33+
public <R, C> R accept(LogicalPlanNodeVisitor<R, C> visitor, C context) {
34+
return visitor.visitExpand(this, context);
35+
}
36+
}

core/src/main/java/org/opensearch/sql/planner/logical/LogicalPlanNodeVisitor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ public R visitAD(LogicalAD plan, C context) {
104104
return visitNode(plan, context);
105105
}
106106

107+
public R visitExpand(LogicalExpand plan, C context) {
108+
return visitNode(plan, context);
109+
}
110+
107111
public R visitTrendline(LogicalTrendline plan, C context) {
108112
return visitNode(plan, context);
109113
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
*
3+
* * Copyright OpenSearch Contributors
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package org.opensearch.sql.calcite.remote;
9+
10+
import org.opensearch.sql.ppl.ExpandCommandIT;
11+
12+
public class CalciteExpandIT extends ExpandCommandIT {
13+
@Override
14+
public void init() throws Exception {
15+
super.init();
16+
enableCalcite();
17+
disallowCalciteFallback();
18+
}
19+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
*
3+
* * Copyright OpenSearch Contributors
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package org.opensearch.sql.ppl;
9+
10+
import static org.opensearch.sql.legacy.TestsConstants.TEST_INDEX_NESTED_SIMPLE;
11+
import static org.opensearch.sql.util.MatcherUtils.schema;
12+
import static org.opensearch.sql.util.MatcherUtils.verifyNumOfRows;
13+
import static org.opensearch.sql.util.MatcherUtils.verifySchema;
14+
15+
import org.json.JSONObject;
16+
import org.junit.jupiter.api.Test;
17+
18+
public class ExpandCommandIT extends PPLIntegTestCase {
19+
@Override
20+
public void init() throws Exception {
21+
super.init();
22+
loadIndex(Index.NESTED_SIMPLE);
23+
}
24+
25+
@Test
26+
public void testExpand() throws Exception {
27+
JSONObject response =
28+
executeQuery(String.format("source=%s | expand address", TEST_INDEX_NESTED_SIMPLE));
29+
verifySchema(
30+
response, schema("name", "string"), schema("age", "integer"), schema("id", "integer"), schema("address", "object"));
31+
verifyNumOfRows(response, 11);
32+
}
33+
34+
@Test
35+
public void testExpandWithAlias() throws Exception {
36+
JSONObject response =
37+
executeQuery(String.format("source=%s | expand address as addr", TEST_INDEX_NESTED_SIMPLE));
38+
verifySchema(
39+
response,
40+
schema("name", "string"),
41+
schema("age", "integer"),
42+
schema("id", "integer"),
43+
schema("address", "array"),
44+
schema("addr", "object"));
45+
verifyNumOfRows(response, 11);
46+
}
47+
}

ppl/src/main/antlr/OpenSearchPPLLexer.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ KMEANS: 'KMEANS';
3737
AD: 'AD';
3838
ML: 'ML';
3939
FILLNULL: 'FILLNULL';
40+
EXPAND: 'EXPAND';
4041
TRENDLINE: 'TRENDLINE';
4142
SIMPLE_PATTERN: 'SIMPLE_PATTERN';
4243
BRAIN: 'BRAIN';

ppl/src/main/antlr/OpenSearchPPLParser.g4

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ commands
6969
| adCommand
7070
| mlCommand
7171
| fillnullCommand
72+
| expandCommand
7273
| trendlineCommand
7374
;
7475

@@ -96,6 +97,7 @@ commandName
9697
| AD
9798
| ML
9899
| FILLNULL
100+
| EXPAND
99101
| TRENDLINE
100102
| EXPLAIN
101103
;
@@ -221,6 +223,10 @@ fillNullUsing
221223
: USING replacementPair (COMMA replacementPair)*
222224
;
223225

226+
expandCommand
227+
: EXPAND fieldExpression (AS alias = qualifiedName)?
228+
;
229+
224230
replacementPair
225231
: fieldExpression EQUAL replacement = valueExpression
226232
;

ppl/src/main/java/org/opensearch/sql/ppl/parser/AstBuilder.java

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,31 +55,8 @@
5555
import org.opensearch.sql.ast.expression.UnresolvedArgument;
5656
import org.opensearch.sql.ast.expression.UnresolvedExpression;
5757
import org.opensearch.sql.ast.expression.WindowFunction;
58-
import org.opensearch.sql.ast.tree.AD;
59-
import org.opensearch.sql.ast.tree.Aggregation;
60-
import org.opensearch.sql.ast.tree.Dedupe;
61-
import org.opensearch.sql.ast.tree.DescribeRelation;
62-
import org.opensearch.sql.ast.tree.Eval;
63-
import org.opensearch.sql.ast.tree.FillNull;
64-
import org.opensearch.sql.ast.tree.Filter;
65-
import org.opensearch.sql.ast.tree.Head;
66-
import org.opensearch.sql.ast.tree.Join;
67-
import org.opensearch.sql.ast.tree.Kmeans;
68-
import org.opensearch.sql.ast.tree.Lookup;
69-
import org.opensearch.sql.ast.tree.ML;
70-
import org.opensearch.sql.ast.tree.Parse;
71-
import org.opensearch.sql.ast.tree.Patterns;
72-
import org.opensearch.sql.ast.tree.Project;
73-
import org.opensearch.sql.ast.tree.RareTopN;
58+
import org.opensearch.sql.ast.tree.*;
7459
import org.opensearch.sql.ast.tree.RareTopN.CommandType;
75-
import org.opensearch.sql.ast.tree.Relation;
76-
import org.opensearch.sql.ast.tree.Rename;
77-
import org.opensearch.sql.ast.tree.Sort;
78-
import org.opensearch.sql.ast.tree.SubqueryAlias;
79-
import org.opensearch.sql.ast.tree.TableFunction;
80-
import org.opensearch.sql.ast.tree.Trendline;
81-
import org.opensearch.sql.ast.tree.UnresolvedPlan;
82-
import org.opensearch.sql.ast.tree.Window;
8360
import org.opensearch.sql.common.setting.Settings;
8461
import org.opensearch.sql.common.setting.Settings.Key;
8562
import org.opensearch.sql.common.utils.StringUtils;
@@ -651,6 +628,13 @@ public UnresolvedPlan visitFillNullUsing(OpenSearchPPLParser.FillNullUsingContex
651628
return FillNull.ofVariousValue(replacementsBuilder.build());
652629
}
653630

631+
/** expand command. */
632+
@Override
633+
public UnresolvedPlan visitExpandCommand(OpenSearchPPLParser.ExpandCommandContext ctx) {
634+
return new Expand((Field) internalVisitExpression(ctx.fieldExpression()),
635+
ctx.alias!=null ? Optional.of(internalVisitExpression(ctx.alias)) : Optional.empty());
636+
}
637+
654638
/** trendline command. */
655639
@Override
656640
public UnresolvedPlan visitTrendlineCommand(OpenSearchPPLParser.TrendlineCommandContext ctx) {

0 commit comments

Comments
 (0)