@@ -60,47 +60,59 @@ public class UnifiedFunctionCalciteAdapter implements UnifiedFunction {
6060 */
6161 private final String compiledCode ;
6262
63+ @ Override
64+ public Object eval (List <Object > inputs ) {
65+ RexExecutable rexExecutor = new RexExecutable (compiledCode , functionName );
66+ DataContext dataContext = DataContexts .of (Map .of (INPUT_RECORD_KEY , inputs .toArray ()));
67+ rexExecutor .setDataContext (dataContext );
68+
69+ Object [] results = rexExecutor .execute ();
70+ return (results == null || results .length == 0 ) ? null : results [0 ];
71+ }
72+
6373 /**
6474 * Creates Calcite RexNode adapter for a unified function.
6575 *
66- * <p>Note this method pre-compiles the resolved function expression and stores the generated
76+ * <p>Note: this method pre-compiles the resolved function expression and stores the generated
6777 * source code as a string. This avoids serializing {@link RexNode} instances and simplifies
6878 * distribution across execution engines. If performance or security concerns arise, we can change
6979 * this internal implementation.
7080 *
7181 * @param rexBuilder RexBuilder for creating expressions
72- * @param functionName function name (e.g., "UPPER", "CONCAT", "ABS")
73- * @param inputTypeNames function argument types as SQL type names (e.g., "VARCHAR", "INTEGER")
82+ * @param functionName function name
83+ * @param inputTypes function argument types
7484 * @return configured adapter instance
7585 */
7686 public static UnifiedFunctionCalciteAdapter create (
77- RexBuilder rexBuilder , String functionName , List <String > inputTypeNames ) {
78- RelDataTypeFactory typeFactory = rexBuilder .getTypeFactory ();
79- RelDataTypeFactory .Builder rowTypeBuilder = typeFactory .builder ();
80- RexNode [] inputRefs = new RexNode [inputTypeNames .size ()];
81- for (int i = 0 ; i < inputTypeNames .size (); i ++) {
82- SqlTypeName sqlType = SqlTypeName .valueOf (inputTypeNames .get (i ));
83- RelDataType relType = typeFactory .createSqlType (sqlType );
84- rowTypeBuilder .add ("_" + i , relType );
85- inputRefs [i ] = rexBuilder .makeInputRef (relType , i );
86- }
87-
88- RelDataType inputRowType = rowTypeBuilder .build ();
87+ RexBuilder rexBuilder , String functionName , List <String > inputTypes ) {
88+ RexNode [] inputRefs = makeInputRefs (rexBuilder , inputTypes );
8989 RexNode resolved = PPLFuncImpTable .INSTANCE .resolve (rexBuilder , functionName , inputRefs );
90+ RelDataType inputRowType = buildInputRowType (rexBuilder , inputTypes );
9091 RexExecutable executable =
9192 RexExecutorImpl .getExecutable (rexBuilder , List .of (resolved ), inputRowType );
92- String returnTypeName = resolved .getType ().getSqlTypeName ().getName ();
93+ String returnType = resolved .getType ().getSqlTypeName ().getName ();
94+
9395 return new UnifiedFunctionCalciteAdapter (
94- functionName , returnTypeName , List .copyOf (inputTypeNames ), executable .getSource ());
96+ functionName , returnType , List .copyOf (inputTypes ), executable .getSource ());
9597 }
9698
97- @ Override
98- public Object eval (List <Object > inputs ) {
99- RexExecutable rexExecutor = new RexExecutable (compiledCode , functionName );
100- DataContext dataContext = DataContexts .of (Map .of (INPUT_RECORD_KEY , inputs .toArray ()));
101- rexExecutor .setDataContext (dataContext );
99+ private static RelDataType buildInputRowType (RexBuilder rexBuilder , List <String > inputTypes ) {
100+ RelDataTypeFactory typeFactory = rexBuilder .getTypeFactory ();
101+ RelDataTypeFactory .Builder builder = typeFactory .builder ();
102+ for (int i = 0 ; i < inputTypes .size (); i ++) {
103+ RelDataType relType = typeFactory .createSqlType (SqlTypeName .valueOf (inputTypes .get (i )));
104+ builder .add ("_" + i , relType );
105+ }
106+ return builder .build ();
107+ }
102108
103- Object [] results = rexExecutor .execute ();
104- return (results == null || results .length == 0 ) ? null : results [0 ];
109+ private static RexNode [] makeInputRefs (RexBuilder rexBuilder , List <String > inputTypes ) {
110+ RelDataTypeFactory typeFactory = rexBuilder .getTypeFactory ();
111+ RexNode [] inputRefs = new RexNode [inputTypes .size ()];
112+ for (int i = 0 ; i < inputTypes .size (); i ++) {
113+ RelDataType relType = typeFactory .createSqlType (SqlTypeName .valueOf (inputTypes .get (i )));
114+ inputRefs [i ] = rexBuilder .makeInputRef (relType , i );
115+ }
116+ return inputRefs ;
105117 }
106118}
0 commit comments