20
20
import org .apache .calcite .rex .RexBuilder ;
21
21
import org .apache .calcite .rex .RexNode ;
22
22
import org .apache .calcite .sql .SqlIntervalQualifier ;
23
+ import org .apache .calcite .sql .SqlOperator ;
23
24
import org .apache .calcite .sql .fun .SqlStdOperatorTable ;
24
25
import org .apache .calcite .sql .parser .SqlParserUtil ;
25
26
import org .apache .calcite .sql .type .SqlTypeName ;
29
30
import org .opensearch .sql .ast .AbstractNodeVisitor ;
30
31
import org .opensearch .sql .ast .expression .Alias ;
31
32
import org .opensearch .sql .ast .expression .And ;
33
+ import org .opensearch .sql .ast .expression .Between ;
34
+ import org .opensearch .sql .ast .expression .Cast ;
32
35
import org .opensearch .sql .ast .expression .Compare ;
33
36
import org .opensearch .sql .ast .expression .EqualTo ;
34
37
import org .opensearch .sql .ast .expression .Function ;
37
40
import org .opensearch .sql .ast .expression .Not ;
38
41
import org .opensearch .sql .ast .expression .Or ;
39
42
import org .opensearch .sql .ast .expression .QualifiedName ;
43
+ import org .opensearch .sql .ast .expression .RelevanceFieldList ;
40
44
import org .opensearch .sql .ast .expression .Span ;
41
45
import org .opensearch .sql .ast .expression .SpanUnit ;
42
46
import org .opensearch .sql .ast .expression .UnresolvedExpression ;
47
+ import org .opensearch .sql .ast .expression .When ;
43
48
import org .opensearch .sql .ast .expression .Xor ;
44
49
import org .opensearch .sql .ast .expression .subquery .ExistsSubquery ;
45
50
import org .opensearch .sql .ast .expression .subquery .InSubquery ;
46
51
import org .opensearch .sql .ast .expression .subquery .ScalarSubquery ;
47
52
import org .opensearch .sql .ast .tree .UnresolvedPlan ;
48
53
import org .opensearch .sql .calcite .utils .BuiltinFunctionUtils ;
54
+ import org .opensearch .sql .common .utils .StringUtils ;
55
+ import org .opensearch .sql .exception .CalciteUnsupportedException ;
49
56
import org .opensearch .sql .exception .SemanticCheckException ;
50
57
51
58
@ RequiredArgsConstructor
@@ -125,12 +132,9 @@ public RexNode visitOr(Or node, CalcitePlanContext context) {
125
132
126
133
@ Override
127
134
public RexNode visitXor (Xor node , CalcitePlanContext context ) {
128
- final RelDataType booleanType =
129
- context .rexBuilder .getTypeFactory ().createSqlType (SqlTypeName .BOOLEAN );
130
135
final RexNode left = analyze (node .getLeft (), context );
131
136
final RexNode right = analyze (node .getRight (), context );
132
- return context .rexBuilder .makeCall (
133
- booleanType , SqlStdOperatorTable .BIT_XOR , List .of (left , right ));
137
+ return context .relBuilder .notEquals (left , right );
134
138
}
135
139
136
140
@ Override
@@ -141,12 +145,28 @@ public RexNode visitNot(Not node, CalcitePlanContext context) {
141
145
142
146
@ Override
143
147
public RexNode visitCompare (Compare node , CalcitePlanContext context ) {
144
- final RelDataType booleanType =
145
- context .rexBuilder .getTypeFactory ().createSqlType (SqlTypeName .BOOLEAN );
148
+ SqlOperator op = BuiltinFunctionUtils .translate (node .getOperator ());
146
149
final RexNode left = analyze (node .getLeft (), context );
147
150
final RexNode right = analyze (node .getRight (), context );
148
- return context .rexBuilder .makeCall (
149
- booleanType , BuiltinFunctionUtils .translate (node .getOperator ()), List .of (left , right ));
151
+ return context .relBuilder .call (op , left , right );
152
+ }
153
+
154
+ @ Override
155
+ public RexNode visitBetween (Between node , CalcitePlanContext context ) {
156
+ RexNode value = analyze (node .getValue (), context );
157
+ RexNode lowerBound = analyze (node .getLowerBound (), context );
158
+ RexNode upperBound = analyze (node .getUpperBound (), context );
159
+ RelDataType commonType = context .rexBuilder .commonType (value , lowerBound , upperBound );
160
+ if (commonType != null ) {
161
+ lowerBound = context .rexBuilder .makeCast (commonType , lowerBound );
162
+ upperBound = context .rexBuilder .makeCast (commonType , upperBound );
163
+ } else {
164
+ throw new SemanticCheckException (
165
+ StringUtils .format (
166
+ "BETWEEN expression types are incompatible: [%s, %s, %s]" ,
167
+ value .getType (), lowerBound .getType (), upperBound .getType ()));
168
+ }
169
+ return context .relBuilder .between (value , lowerBound , upperBound );
150
170
}
151
171
152
172
@ Override
@@ -337,4 +357,22 @@ private RelNode resolveSubqueryPlan(UnresolvedPlan subquery, CalcitePlanContext
337
357
}
338
358
return subqueryRel ;
339
359
}
360
+
361
+ /*
362
+ * Unsupported Expressions of PPL with Calcite for OpenSearch 3.0.0-beta
363
+ */
364
+ @ Override
365
+ public RexNode visitCast (Cast node , CalcitePlanContext context ) {
366
+ throw new CalciteUnsupportedException ("CastWhen function is unsupported in Calcite" );
367
+ }
368
+
369
+ @ Override
370
+ public RexNode visitWhen (When node , CalcitePlanContext context ) {
371
+ throw new CalciteUnsupportedException ("CastWhen function is unsupported in Calcite" );
372
+ }
373
+
374
+ @ Override
375
+ public RexNode visitRelevanceFieldList (RelevanceFieldList node , CalcitePlanContext context ) {
376
+ throw new CalciteUnsupportedException ("Relevance fields expression is unsupported in Calcite" );
377
+ }
340
378
}
0 commit comments