Skip to content

Commit 5205a4e

Browse files
committed
WIP: merge udf with existing type checking
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
2 parents a7f252f + 8262890 commit 5205a4e

241 files changed

Lines changed: 8355 additions & 5339 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.

DEVELOPER_GUIDE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ Most of the time you just need to run ./gradlew build which will make sure you p
231231
- Run all unit tests.
232232
* - ./gradlew :integ-test:integTest
233233
- Run all integration test (this takes time).
234+
* - ./gradlew :integ-test:yamlRestTest
235+
- Run rest integration test.
234236
* - ./gradlew :doctest:doctest
235237
- Run doctests
236238
* - ./gradlew build

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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.opensearch.sql.ast.expression.AggregateFunction;
99
import org.opensearch.sql.ast.expression.Alias;
1010
import org.opensearch.sql.ast.expression.AllFields;
11+
import org.opensearch.sql.ast.expression.AllFieldsExcludeMeta;
1112
import org.opensearch.sql.ast.expression.And;
1213
import org.opensearch.sql.ast.expression.Argument;
1314
import org.opensearch.sql.ast.expression.AttributeList;
@@ -58,6 +59,7 @@
5859
import org.opensearch.sql.ast.tree.ML;
5960
import org.opensearch.sql.ast.tree.Paginate;
6061
import org.opensearch.sql.ast.tree.Parse;
62+
import org.opensearch.sql.ast.tree.Patterns;
6163
import org.opensearch.sql.ast.tree.Project;
6264
import org.opensearch.sql.ast.tree.RareTopN;
6365
import org.opensearch.sql.ast.tree.Relation;
@@ -254,6 +256,10 @@ public T visitAllFields(AllFields node, C context) {
254256
return visitChildren(node, context);
255257
}
256258

259+
public T visitAllFieldsExcludeMeta(AllFieldsExcludeMeta node, C context) {
260+
return visitChildren(node, context);
261+
}
262+
257263
public T visitNestedAllTupleFields(NestedAllTupleFields node, C context) {
258264
return visitChildren(node, context);
259265
}
@@ -338,6 +344,10 @@ public T visitFillNull(FillNull fillNull, C context) {
338344
return visitChildren(fillNull, context);
339345
}
340346

347+
public T visitPatterns(Patterns patterns, C context) {
348+
return visitChildren(patterns, context);
349+
}
350+
341351
public T visitWindow(Window window, C context) {
342352
return visitChildren(window, context);
343353
}

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/Alias.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,20 @@
55

66
package org.opensearch.sql.ast.expression;
77

8-
import lombok.AllArgsConstructor;
98
import lombok.EqualsAndHashCode;
109
import lombok.Getter;
11-
import lombok.RequiredArgsConstructor;
1210
import lombok.ToString;
1311
import org.opensearch.sql.ast.AbstractNodeVisitor;
12+
import org.opensearch.sql.calcite.plan.OpenSearchConstants;
1413

1514
/**
1615
* Alias abstraction that associate an unnamed expression with a name. The name information
1716
* preserved is useful for semantic analysis and response formatting eventually. This can avoid
1817
* restoring the info in toString() method which is inaccurate because original info is already
1918
* lost.
2019
*/
21-
@AllArgsConstructor
2220
@EqualsAndHashCode(callSuper = false)
2321
@Getter
24-
@RequiredArgsConstructor
2522
@ToString
2623
public class Alias extends UnresolvedExpression {
2724

@@ -35,7 +32,41 @@ public class Alias extends UnresolvedExpression {
3532
private final UnresolvedExpression delegated;
3633

3734
/** TODO. Optional field alias. This field is OpenSearch SQL-only */
38-
private String alias;
35+
private final String alias;
36+
37+
public Alias(String name, UnresolvedExpression expr) {
38+
this(name, expr, false);
39+
}
40+
41+
public Alias(String name, UnresolvedExpression expr, String alias) {
42+
this(name, expr, alias, false);
43+
}
44+
45+
public Alias(String name, UnresolvedExpression expr, boolean metaDataFieldAllowed) {
46+
this(name, expr, null, metaDataFieldAllowed);
47+
}
48+
49+
/**
50+
* @param metadataFieldAllowed Whether do we allow metadata field as alias name. Should Only be
51+
* true for SQL, see {@link Alias::newAliasAllowMetaMetaField}
52+
*/
53+
private Alias(
54+
String name, UnresolvedExpression expr, String alias, boolean metadataFieldAllowed) {
55+
if (!metadataFieldAllowed && OpenSearchConstants.METADATAFIELD_TYPE_MAP.containsKey(name)) {
56+
throw new IllegalArgumentException(
57+
String.format("Cannot use metadata field [%s] as the alias.", name));
58+
}
59+
this.name = name;
60+
this.delegated = expr;
61+
this.alias = alias;
62+
}
63+
64+
// TODO: Only for SQL. We never allow metadata field as alias but SQL view all select items as
65+
// alias. Need to remove this tricky logic after SQL fix it.
66+
public static Alias newAliasAllowMetaMetaField(
67+
String name, UnresolvedExpression expr, String alias) {
68+
return new Alias(name, expr, alias, true);
69+
}
3970

4071
@Override
4172
public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
public class AllFields extends UnresolvedExpression {
1919
public static final AllFields INSTANCE = new AllFields();
2020

21-
private AllFields() {}
21+
public AllFields() {}
2222

2323
public static AllFields of() {
2424
return INSTANCE;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.ast.expression;
7+
8+
import java.util.Collections;
9+
import java.util.List;
10+
import lombok.EqualsAndHashCode;
11+
import lombok.ToString;
12+
import org.opensearch.sql.ast.AbstractNodeVisitor;
13+
import org.opensearch.sql.ast.Node;
14+
15+
/**
16+
* Represent the All fields but excluding metadata fields if user never uses them in the previous
17+
* fields command
18+
*/
19+
@ToString
20+
@EqualsAndHashCode(callSuper = false)
21+
public class AllFieldsExcludeMeta extends AllFields {
22+
public static final AllFieldsExcludeMeta INSTANCE = new AllFieldsExcludeMeta();
23+
24+
private AllFieldsExcludeMeta() {
25+
super();
26+
}
27+
28+
public static AllFieldsExcludeMeta of() {
29+
return INSTANCE;
30+
}
31+
32+
@Override
33+
public List<? extends Node> getChild() {
34+
return Collections.emptyList();
35+
}
36+
37+
@Override
38+
public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
39+
return nodeVisitor.visitAllFieldsExcludeMeta(this, context);
40+
}
41+
}

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

0 commit comments

Comments
 (0)