beyond1920 commented on a change in pull request #8977: 
[FLINK-13071][table-planner-blink] QueryOperationConverter in Blink planner 
support add kinds of QueryOperations.
URL: https://github.com/apache/flink/pull/8977#discussion_r300521093
 
 

 ##########
 File path: 
flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/expressions/RexNodeConverter.java
 ##########
 @@ -344,4 +875,125 @@ private RexNode 
visitResolvedDistinctKeyReference(ResolvedDistinctKeyReference r
                                
typeFactory.createFieldTypeFromLogicalType(type),
                                type);
        }
+
+       private RexNode visit(UnresolvedCallExpression call) {
+               FunctionDefinition func = call.getFunctionDefinition();
+               switch (func.getKind()) {
+                       case SCALAR:
+                               if (func instanceof ScalarFunctionDefinition) {
+                                       ScalarFunction scalaFunc = 
((ScalarFunctionDefinition) func).getScalarFunction();
+                                       List<RexNode> child = 
convertCallChildren(call.getChildren());
+                                       SqlFunction sqlFunction = 
UserDefinedFunctionUtils.createScalarSqlFunction(
+                                                       
scalaFunc.functionIdentifier(),
+                                                       scalaFunc.toString(),
+                                                       scalaFunc,
+                                                       typeFactory);
+                                       return relBuilder.call(sqlFunction, 
child);
+                               } else {
+                                       FunctionDefinition def = 
call.getFunctionDefinition();
+                                       if 
(conversionsOfBuiltInFunc.containsKey(def)) {
+                                               RexNodeConversion conversion = 
conversionsOfBuiltInFunc.get(def);
+                                               return conversion.convert(call);
+                                       } else {
+                                               throw new 
UnsupportedOperationException(def.toString());
+                                       }
+                               }
+
+                       default:
+                               throw new UnsupportedOperationException();
+               }
+       }
+
+       private RexNode createCollation(RexNode node, 
RelFieldCollation.Direction direction,
+                       RelFieldCollation.NullDirection nullDirection, 
Set<SqlKind> kinds) {
+               switch (node.getKind()) {
+                       case DESCENDING:
+                               kinds.add(node.getKind());
+                               return createCollation(((RexCall) 
node).getOperands().get(0), RelFieldCollation.Direction.DESCENDING,
+                                               nullDirection, kinds);
+                       case NULLS_FIRST:
+                               kinds.add(node.getKind());
+                               return createCollation(((RexCall) 
node).getOperands().get(0), direction,
+                                               
RelFieldCollation.NullDirection.FIRST, kinds);
+                       case NULLS_LAST:
+                               kinds.add(node.getKind());
+                               return createCollation(((RexCall) 
node).getOperands().get(0), direction,
+                                               
RelFieldCollation.NullDirection.LAST, kinds);
+                       default:
+                               if (nullDirection == null) {
+                                       // Set the null direction if not 
specified.
+                                       // Consistent with 
HIVE/SPARK/MYSQL/BLINK-RUNTIME.
+                                       if 
(FlinkPlannerImpl.defaultNullCollation()
+                                                       
.last(direction.equals(RelFieldCollation.Direction.DESCENDING))) {
+                                               kinds.add(SqlKind.NULLS_LAST);
+                                       } else {
+                                               kinds.add(SqlKind.NULLS_FIRST);
+                                       }
+                               }
+                               return node;
+               }
+       }
+
+       private RexWindowBound createBound(Expression bound, SqlKind sqlKind) {
+               if (bound instanceof CallExpression) {
+                       CallExpression callExpr = (CallExpression) bound;
+                       FunctionDefinition func = 
callExpr.getFunctionDefinition();
+                       if 
(BuiltInFunctionDefinitions.UNBOUNDED_ROW.equals(func) || 
BuiltInFunctionDefinitions.UNBOUNDED_RANGE
+                                       .equals(func)) {
+                               SqlNode unbounded = 
sqlKind.equals(SqlKind.PRECEDING) ? SqlWindow
+                                               
.createUnboundedPreceding(SqlParserPos.ZERO) :
+                                               
SqlWindow.createUnboundedFollowing(SqlParserPos.ZERO);
+                               return RexWindowBound.create(unbounded, null);
+                       } else if 
(BuiltInFunctionDefinitions.CURRENT_ROW.equals(func) || 
BuiltInFunctionDefinitions.CURRENT_RANGE
+                                       .equals(func)) {
+                               SqlNode currentRow = 
SqlWindow.createCurrentRow(SqlParserPos.ZERO);
+                               return RexWindowBound.create(currentRow, null);
+                       } else {
+                               throw new IllegalArgumentException("Unexpected 
expression: " + bound);
+                       }
+               } else if (bound instanceof ValueLiteralExpression) {
+                       int DECIMAL_PRECISION_NEEDED_FOR_LONG = 19;
 
 Review comment:
   sorry for that, @JingsongLi fixed the compile error in 
https://github.com/apache/flink/pull/8689

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to