27
27
import org .apache .calcite .sql .SqlLiteral ;
28
28
import org .apache .calcite .sql .SqlNode ;
29
29
import org .apache .calcite .sql .SqlNodeList ;
30
+ import org .apache .calcite .sql .fun .SqlCase ;
30
31
import org .apache .calcite .sql .type .SqlTypeName ;
31
32
import org .codehaus .commons .compiler .CompileException ;
32
33
import org .codehaus .commons .compiler .Location ;
@@ -82,17 +83,51 @@ public static ExpressionEvaluator compileExpression(
82
83
}
83
84
84
85
public static String translateSqlNodeToJaninoExpression (SqlNode transform ) {
85
- if (transform instanceof SqlIdentifier ) {
86
- SqlIdentifier sqlIdentifier = (SqlIdentifier ) transform ;
87
- return sqlIdentifier .names .get (sqlIdentifier .names .size () - 1 );
88
- } else if (transform instanceof SqlBasicCall ) {
89
- Java .Rvalue rvalue = translateJaninoAST ((SqlBasicCall ) transform );
86
+ Java .Rvalue rvalue = translateSqlNodeToJaninoRvalue (transform );
87
+ if (rvalue != null ) {
90
88
return rvalue .toString ();
91
89
}
92
90
return "" ;
93
91
}
94
92
95
- private static Java .Rvalue translateJaninoAST (SqlBasicCall sqlBasicCall ) {
93
+ public static Java .Rvalue translateSqlNodeToJaninoRvalue (SqlNode transform ) {
94
+ if (transform instanceof SqlIdentifier ) {
95
+ return translateSqlIdentifier ((SqlIdentifier ) transform );
96
+ } else if (transform instanceof SqlBasicCall ) {
97
+ return translateSqlBasicCall ((SqlBasicCall ) transform );
98
+ } else if (transform instanceof SqlCase ) {
99
+ return translateSqlCase ((SqlCase ) transform );
100
+ } else if (transform instanceof SqlLiteral ) {
101
+ return translateSqlSqlLiteral ((SqlLiteral ) transform );
102
+ }
103
+ return null ;
104
+ }
105
+
106
+ private static Java .Rvalue translateSqlIdentifier (SqlIdentifier sqlIdentifier ) {
107
+ String columnName = sqlIdentifier .names .get (sqlIdentifier .names .size () - 1 );
108
+ if (NO_OPERAND_TIMESTAMP_FUNCTIONS .contains (columnName )) {
109
+ return generateNoOperandTimestampFunctionOperation (columnName );
110
+ } else {
111
+ return new Java .AmbiguousName (Location .NOWHERE , new String [] {columnName });
112
+ }
113
+ }
114
+
115
+ private static Java .Rvalue translateSqlSqlLiteral (SqlLiteral sqlLiteral ) {
116
+ if (sqlLiteral .getValue () == null ) {
117
+ return new Java .NullLiteral (Location .NOWHERE );
118
+ }
119
+ String value = sqlLiteral .getValue ().toString ();
120
+ if (sqlLiteral instanceof SqlCharStringLiteral ) {
121
+ // Double quotation marks represent strings in Janino.
122
+ value = "\" " + value .substring (1 , value .length () - 1 ) + "\" " ;
123
+ }
124
+ if (SQL_TYPE_NAME_IGNORE .contains (sqlLiteral .getTypeName ())) {
125
+ value = "\" " + value + "\" " ;
126
+ }
127
+ return new Java .AmbiguousName (Location .NOWHERE , new String [] {value });
128
+ }
129
+
130
+ private static Java .Rvalue translateSqlBasicCall (SqlBasicCall sqlBasicCall ) {
96
131
List <SqlNode > operandList = sqlBasicCall .getOperandList ();
97
132
List <Java .Rvalue > atoms = new ArrayList <>();
98
133
for (SqlNode sqlNode : operandList ) {
@@ -105,32 +140,44 @@ private static Java.Rvalue translateJaninoAST(SqlBasicCall sqlBasicCall) {
105
140
return sqlBasicCallToJaninoRvalue (sqlBasicCall , atoms .toArray (new Java .Rvalue [0 ]));
106
141
}
107
142
143
+ private static Java .Rvalue translateSqlCase (SqlCase sqlCase ) {
144
+ SqlNodeList whenOperands = sqlCase .getWhenOperands ();
145
+ SqlNodeList thenOperands = sqlCase .getThenOperands ();
146
+ SqlNode elseOperand = sqlCase .getElseOperand ();
147
+ List <Java .Rvalue > whenAtoms = new ArrayList <>();
148
+ for (SqlNode sqlNode : whenOperands ) {
149
+ translateSqlNodeToAtoms (sqlNode , whenAtoms );
150
+ }
151
+ List <Java .Rvalue > thenAtoms = new ArrayList <>();
152
+ for (SqlNode sqlNode : thenOperands ) {
153
+ translateSqlNodeToAtoms (sqlNode , thenAtoms );
154
+ }
155
+ Java .Rvalue elseAtoms = translateSqlNodeToJaninoRvalue (elseOperand );
156
+ Java .Rvalue sqlCaseRvalueTemp = elseAtoms ;
157
+ for (int i = whenAtoms .size () - 1 ; i >= 0 ; i --) {
158
+ sqlCaseRvalueTemp =
159
+ new Java .ConditionalExpression (
160
+ Location .NOWHERE ,
161
+ whenAtoms .get (i ),
162
+ thenAtoms .get (i ),
163
+ sqlCaseRvalueTemp );
164
+ }
165
+ return new Java .ParenthesizedExpression (Location .NOWHERE , sqlCaseRvalueTemp );
166
+ }
167
+
108
168
private static void translateSqlNodeToAtoms (SqlNode sqlNode , List <Java .Rvalue > atoms ) {
109
169
if (sqlNode instanceof SqlIdentifier ) {
110
- SqlIdentifier sqlIdentifier = (SqlIdentifier ) sqlNode ;
111
- String columnName = sqlIdentifier .names .get (sqlIdentifier .names .size () - 1 );
112
- if (NO_OPERAND_TIMESTAMP_FUNCTIONS .contains (columnName )) {
113
- atoms .add (generateNoOperandTimestampFunctionOperation (columnName ));
114
- } else {
115
- atoms .add (new Java .AmbiguousName (Location .NOWHERE , new String [] {columnName }));
116
- }
170
+ atoms .add (translateSqlIdentifier ((SqlIdentifier ) sqlNode ));
117
171
} else if (sqlNode instanceof SqlLiteral ) {
118
- SqlLiteral sqlLiteral = (SqlLiteral ) sqlNode ;
119
- String value = sqlLiteral .getValue ().toString ();
120
- if (sqlLiteral instanceof SqlCharStringLiteral ) {
121
- // Double quotation marks represent strings in Janino.
122
- value = "\" " + value .substring (1 , value .length () - 1 ) + "\" " ;
123
- }
124
- if (SQL_TYPE_NAME_IGNORE .contains (sqlLiteral .getTypeName ())) {
125
- value = "\" " + value + "\" " ;
126
- }
127
- atoms .add (new Java .AmbiguousName (Location .NOWHERE , new String [] {value }));
172
+ atoms .add (translateSqlSqlLiteral ((SqlLiteral ) sqlNode ));
128
173
} else if (sqlNode instanceof SqlBasicCall ) {
129
- atoms .add (translateJaninoAST ((SqlBasicCall ) sqlNode ));
174
+ atoms .add (translateSqlBasicCall ((SqlBasicCall ) sqlNode ));
130
175
} else if (sqlNode instanceof SqlNodeList ) {
131
176
for (SqlNode node : (SqlNodeList ) sqlNode ) {
132
177
translateSqlNodeToAtoms (node , atoms );
133
178
}
179
+ } else if (sqlNode instanceof SqlCase ) {
180
+ atoms .add (translateSqlCase ((SqlCase ) sqlNode ));
134
181
}
135
182
}
136
183
0 commit comments