Skip to content

Commit d2711f2

Browse files
committed
Merge origin/main into crypto-udf
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
2 parents 629cb34 + 788da98 commit d2711f2

87 files changed

Lines changed: 2259 additions & 606 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
buildscript {
88
ext {
9-
opensearch_version = System.getProperty("opensearch.version", "3.0.0-beta1-SNAPSHOT")
9+
opensearch_version = System.getProperty("opensearch.version", "3.1.0-SNAPSHOT")
1010
isSnapshot = "true" == System.getProperty("build.snapshot", "true")
11-
buildVersionQualifier = System.getProperty("build.version_qualifier", "beta1")
11+
buildVersionQualifier = System.getProperty("build.version_qualifier", "")
1212
version_tokens = opensearch_version.tokenize('-')
1313
opensearch_build = version_tokens[0] + '.0'
1414
prometheus_binary_version = "2.37.2"

core/src/main/java/org/opensearch/sql/analysis/Analyzer.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static org.opensearch.sql.ast.tree.Sort.NullOrder.NULL_LAST;
1111
import static org.opensearch.sql.ast.tree.Sort.SortOrder.ASC;
1212
import static org.opensearch.sql.ast.tree.Sort.SortOrder.DESC;
13+
import static org.opensearch.sql.common.setting.Settings.Key.CALCITE_ENGINE_ENABLED;
1314
import static org.opensearch.sql.data.type.ExprCoreType.DATE;
1415
import static org.opensearch.sql.data.type.ExprCoreType.STRUCT;
1516
import static org.opensearch.sql.data.type.ExprCoreType.TIME;
@@ -53,11 +54,14 @@
5354
import org.opensearch.sql.ast.tree.FillNull;
5455
import org.opensearch.sql.ast.tree.Filter;
5556
import org.opensearch.sql.ast.tree.Head;
57+
import org.opensearch.sql.ast.tree.Join;
5658
import org.opensearch.sql.ast.tree.Kmeans;
5759
import org.opensearch.sql.ast.tree.Limit;
60+
import org.opensearch.sql.ast.tree.Lookup;
5861
import org.opensearch.sql.ast.tree.ML;
5962
import org.opensearch.sql.ast.tree.Paginate;
6063
import org.opensearch.sql.ast.tree.Parse;
64+
import org.opensearch.sql.ast.tree.Patterns;
6165
import org.opensearch.sql.ast.tree.Project;
6266
import org.opensearch.sql.ast.tree.RareTopN;
6367
import org.opensearch.sql.ast.tree.Relation;
@@ -70,7 +74,6 @@
7074
import org.opensearch.sql.ast.tree.Trendline;
7175
import org.opensearch.sql.ast.tree.UnresolvedPlan;
7276
import org.opensearch.sql.ast.tree.Values;
73-
import org.opensearch.sql.ast.tree.Window;
7477
import org.opensearch.sql.common.antlr.SyntaxCheckException;
7578
import org.opensearch.sql.data.model.ExprMissingValue;
7679
import org.opensearch.sql.data.type.ExprCoreType;
@@ -162,8 +165,8 @@ public LogicalPlan visitSubqueryAlias(SubqueryAlias node, AnalysisContext contex
162165
STRUCT);
163166
return child;
164167
} else {
165-
// TODO
166-
throw new UnsupportedOperationException("SubqueryAlias is only supported in table alias");
168+
throw new UnsupportedOperationException(
169+
"Subsearch is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
167170
}
168171
}
169172

@@ -490,7 +493,7 @@ public LogicalPlan visitParse(Parse node, AnalysisContext context) {
490493
}
491494

492495
@Override
493-
public LogicalPlan visitWindow(Window node, AnalysisContext context) {
496+
public LogicalPlan visitPatterns(Patterns node, AnalysisContext context) {
494497
LogicalPlan child = node.getChild().get(0).accept(this, context);
495498
WindowExpressionAnalyzer windowAnalyzer =
496499
new WindowExpressionAnalyzer(expressionAnalyzer, child);
@@ -685,6 +688,18 @@ public LogicalPlan visitCloseCursor(CloseCursor closeCursor, AnalysisContext con
685688
return new LogicalCloseCursor(closeCursor.getChild().get(0).accept(this, context));
686689
}
687690

691+
@Override
692+
public LogicalPlan visitJoin(Join node, AnalysisContext context) {
693+
throw new UnsupportedOperationException(
694+
"Join is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
695+
}
696+
697+
@Override
698+
public LogicalPlan visitLookup(Lookup node, AnalysisContext context) {
699+
throw new UnsupportedOperationException(
700+
"Lookup is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
701+
}
702+
688703
private LogicalSort buildSort(
689704
LogicalPlan child, AnalysisContext context, List<Field> sortFields) {
690705
ExpressionReferenceOptimizer optimizer =

core/src/main/java/org/opensearch/sql/analysis/ExpressionAnalyzer.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.opensearch.sql.ast.dsl.AstDSL.and;
99
import static org.opensearch.sql.ast.dsl.AstDSL.compare;
10+
import static org.opensearch.sql.common.setting.Settings.Key.CALCITE_ENGINE_ENABLED;
1011

1112
import com.google.common.collect.ImmutableList;
1213
import com.google.common.collect.ImmutableMap;
@@ -49,6 +50,9 @@
4950
import org.opensearch.sql.ast.expression.When;
5051
import org.opensearch.sql.ast.expression.WindowFunction;
5152
import org.opensearch.sql.ast.expression.Xor;
53+
import org.opensearch.sql.ast.expression.subquery.ExistsSubquery;
54+
import org.opensearch.sql.ast.expression.subquery.InSubquery;
55+
import org.opensearch.sql.ast.expression.subquery.ScalarSubquery;
5256
import org.opensearch.sql.data.model.ExprValueUtils;
5357
import org.opensearch.sql.data.type.ExprCoreType;
5458
import org.opensearch.sql.data.type.ExprType;
@@ -336,7 +340,7 @@ public Expression visitCase(Case node, AnalysisContext context) {
336340
}
337341

338342
Expression defaultResult =
339-
(node.getElseClause() == null) ? null : analyze(node.getElseClause(), context);
343+
node.getElseClause().map(elseClause -> analyze(elseClause, context)).orElse(null);
340344
CaseClause caseClause = new CaseClause(whens, defaultResult);
341345

342346
// To make this simple, require all result type same regardless of implicit convert
@@ -406,6 +410,24 @@ public Expression visitArgument(Argument node, AnalysisContext context) {
406410
return new NamedArgumentExpression(node.getArgName(), node.getValue().accept(this, context));
407411
}
408412

413+
@Override
414+
public Expression visitScalarSubquery(ScalarSubquery node, AnalysisContext context) {
415+
throw new UnsupportedOperationException(
416+
"Subsearch is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
417+
}
418+
419+
@Override
420+
public Expression visitExistsSubquery(ExistsSubquery node, AnalysisContext context) {
421+
throw new UnsupportedOperationException(
422+
"Subsearch is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
423+
}
424+
425+
@Override
426+
public Expression visitInSubquery(InSubquery node, AnalysisContext context) {
427+
throw new UnsupportedOperationException(
428+
"Subsearch is supported only when " + CALCITE_ENGINE_ENABLED.getKeyValue() + "=true");
429+
}
430+
409431
/**
410432
* If QualifiedName is actually a reserved metadata field, return the expr type associated with
411433
* the metadata field.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.opensearch.sql.ast.tree.ML;
6060
import org.opensearch.sql.ast.tree.Paginate;
6161
import org.opensearch.sql.ast.tree.Parse;
62+
import org.opensearch.sql.ast.tree.Patterns;
6263
import org.opensearch.sql.ast.tree.Project;
6364
import org.opensearch.sql.ast.tree.RareTopN;
6465
import org.opensearch.sql.ast.tree.Relation;
@@ -69,7 +70,6 @@
6970
import org.opensearch.sql.ast.tree.TableFunction;
7071
import org.opensearch.sql.ast.tree.Trendline;
7172
import org.opensearch.sql.ast.tree.Values;
72-
import org.opensearch.sql.ast.tree.Window;
7373

7474
/** AST nodes visitor Defines the traverse path. */
7575
public abstract class AbstractNodeVisitor<T, C> {
@@ -343,8 +343,8 @@ public T visitFillNull(FillNull fillNull, C context) {
343343
return visitChildren(fillNull, context);
344344
}
345345

346-
public T visitWindow(Window window, C context) {
347-
return visitChildren(window, context);
346+
public T visitPatterns(Patterns patterns, C context) {
347+
return visitChildren(patterns, context);
348348
}
349349

350350
public T visitJoin(Join node, C context) {

core/src/main/java/org/opensearch/sql/ast/dsl/AstDSL.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.opensearch.sql.ast.tree.Head;
5959
import org.opensearch.sql.ast.tree.Limit;
6060
import org.opensearch.sql.ast.tree.Parse;
61+
import org.opensearch.sql.ast.tree.Patterns;
6162
import org.opensearch.sql.ast.tree.Project;
6263
import org.opensearch.sql.ast.tree.RareTopN;
6364
import org.opensearch.sql.ast.tree.RareTopN.CommandType;
@@ -71,7 +72,6 @@
7172
import org.opensearch.sql.ast.tree.Trendline;
7273
import org.opensearch.sql.ast.tree.UnresolvedPlan;
7374
import org.opensearch.sql.ast.tree.Values;
74-
import org.opensearch.sql.ast.tree.Window;
7575

7676
/** Class of static methods to create specific node instances. */
7777
@UtilityClass
@@ -293,7 +293,7 @@ public UnresolvedExpression caseWhen(UnresolvedExpression elseClause, When... wh
293293
*/
294294
public UnresolvedExpression caseWhen(
295295
UnresolvedExpression caseValueExpr, UnresolvedExpression elseClause, When... whenClauses) {
296-
return new Case(caseValueExpr, Arrays.asList(whenClauses), elseClause);
296+
return new Case(caseValueExpr, Arrays.asList(whenClauses), Optional.ofNullable(elseClause));
297297
}
298298

299299
public UnresolvedExpression cast(UnresolvedExpression expr, Literal type) {
@@ -504,7 +504,7 @@ public static Parse parse(
504504
return new Parse(parseMethod, sourceField, pattern, arguments, input);
505505
}
506506

507-
public static Window window(
507+
public static Patterns patterns(
508508
UnresolvedPlan input,
509509
PatternMethod patternMethod,
510510
UnresolvedExpression sourceField,
@@ -513,7 +513,7 @@ public static Window window(
513513
List<UnresolvedExpression> funArgs = new ArrayList<>();
514514
funArgs.add(sourceField);
515515
funArgs.addAll(arguments);
516-
return new Window(
516+
return new Patterns(
517517
new Alias(
518518
alias,
519519
new WindowFunction(

core/src/main/java/org/opensearch/sql/ast/expression/Case.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.google.common.collect.ImmutableList;
99
import java.util.List;
10+
import java.util.Optional;
1011
import lombok.AllArgsConstructor;
1112
import lombok.EqualsAndHashCode;
1213
import lombok.Getter;
@@ -31,7 +32,7 @@ public class Case extends UnresolvedExpression {
3132
private final List<When> whenClauses;
3233

3334
/** Expression that represents ELSE statement result. */
34-
private final UnresolvedExpression elseClause;
35+
private final Optional<UnresolvedExpression> elseClause;
3536

3637
@Override
3738
public List<? extends Node> getChild() {
@@ -40,10 +41,7 @@ public List<? extends Node> getChild() {
4041
children.add(caseValue);
4142
}
4243
children.addAll(whenClauses);
43-
44-
if (elseClause != null) {
45-
children.add(elseClause);
46-
}
44+
elseClause.ifPresent(children::add);
4745
return children.build();
4846
}
4947

core/src/main/java/org/opensearch/sql/ast/expression/ParseMethod.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
@RequiredArgsConstructor
1212
public enum ParseMethod {
1313
REGEX("regex"),
14-
GROK("grok");
14+
GROK("grok"),
15+
PATTERNS("patterns");
1516

1617
@Getter private final String name;
1718
}

core/src/main/java/org/opensearch/sql/ast/statement/Explain.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public <R, C> R accept(AbstractNodeVisitor<R, C> visitor, C context) {
4040
public enum ExplainFormat {
4141
SIMPLE,
4242
STANDARD,
43-
EXTENDED
43+
EXTENDED,
44+
COST
4445
}
4546

4647
public static ExplainFormat format(String format) {

core/src/main/java/org/opensearch/sql/ast/tree/Window.java renamed to core/src/main/java/org/opensearch/sql/ast/tree/Patterns.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,24 @@
1616
import org.opensearch.sql.ast.AbstractNodeVisitor;
1717
import org.opensearch.sql.ast.expression.UnresolvedExpression;
1818

19+
/**
20+
* Logical plan node of Patterns command to represent complex nested function calling than single
21+
* window function.
22+
*/
1923
@Getter
2024
@Setter
2125
@ToString
2226
@EqualsAndHashCode(callSuper = false)
2327
@RequiredArgsConstructor
2428
@AllArgsConstructor
25-
public class Window extends UnresolvedPlan {
29+
public class Patterns extends UnresolvedPlan {
2630

2731
private final UnresolvedExpression windowFunction;
2832

2933
private UnresolvedPlan child;
3034

3135
@Override
32-
public Window attach(UnresolvedPlan child) {
36+
public Patterns attach(UnresolvedPlan child) {
3337
this.child = child;
3438
return this;
3539
}
@@ -41,6 +45,6 @@ public List<UnresolvedPlan> getChild() {
4145

4246
@Override
4347
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
44-
return nodeVisitor.visitWindow(this, context);
48+
return nodeVisitor.visitPatterns(this, context);
4549
}
4650
}

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static org.opensearch.sql.ast.tree.Sort.SortOrder.ASC;
1313
import static org.opensearch.sql.ast.tree.Sort.SortOrder.DESC;
1414

15+
import com.google.common.base.Strings;
1516
import com.google.common.collect.ImmutableList;
1617
import com.google.common.collect.Iterables;
1718
import java.util.ArrayList;
@@ -31,8 +32,8 @@
3132
import org.apache.calcite.rex.RexLiteral;
3233
import org.apache.calcite.rex.RexNode;
3334
import org.apache.calcite.rex.RexWindowBounds;
34-
import org.apache.calcite.sql.fun.SqlLibraryOperators;
3535
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
36+
import org.apache.calcite.sql.type.SqlTypeName;
3637
import org.apache.calcite.tools.RelBuilder;
3738
import org.apache.calcite.tools.RelBuilder.AggCall;
3839
import org.apache.calcite.util.Holder;
@@ -78,6 +79,7 @@
7879
import org.opensearch.sql.calcite.utils.JoinAndLookupUtils;
7980
import org.opensearch.sql.exception.CalciteUnsupportedException;
8081
import org.opensearch.sql.exception.SemanticCheckException;
82+
import org.opensearch.sql.expression.function.PPLFuncImpTable;
8183
import org.opensearch.sql.utils.ParseUtils;
8284

8385
public class CalciteRelNodeVisitor extends AbstractNodeVisitor<RelNode, CalcitePlanContext> {
@@ -283,21 +285,28 @@ public RelNode visitHead(Head node, CalcitePlanContext context) {
283285
@Override
284286
public RelNode visitParse(Parse node, CalcitePlanContext context) {
285287
visitChildren(node, context);
286-
List<String> originalFieldNames = context.relBuilder.peek().getRowType().getFieldNames();
287288
RexNode sourceField = rexVisitor.analyze(node.getSourceField(), context);
288289
ParseMethod parseMethod = node.getParseMethod();
289290
java.util.Map<String, Literal> arguments = node.getArguments();
290-
String pattern = (String) node.getPattern().getValue();
291+
String patternValue = (String) node.getPattern().getValue();
292+
String pattern =
293+
ParseMethod.PATTERNS.equals(parseMethod) && Strings.isNullOrEmpty(patternValue)
294+
? "[a-zA-Z0-9]"
295+
: patternValue;
291296
List<String> groupCandidates =
292297
ParseUtils.getNamedGroupCandidates(parseMethod, pattern, arguments);
293298
List<RexNode> newFields =
294299
groupCandidates.stream()
295300
.map(
296301
group ->
297-
context.rexBuilder.makeCall(
298-
SqlLibraryOperators.REGEXP_EXTRACT,
302+
PPLFuncImpTable.INSTANCE.resolve(
303+
context.rexBuilder,
304+
ParseUtils.BUILTIN_FUNCTION_MAP.get(parseMethod),
299305
sourceField,
300-
context.rexBuilder.makeLiteral(pattern)))
306+
context.rexBuilder.makeLiteral(
307+
pattern,
308+
context.rexBuilder.getTypeFactory().createSqlType(SqlTypeName.VARCHAR),
309+
true)))
301310
.toList();
302311
projectPlusOverriding(newFields, groupCandidates, context);
303312
return context.relBuilder.peek();

0 commit comments

Comments
 (0)