private static Pipe addFunction( RelOptCluster cluster, RexProgram program, Pipe pipe ) { final Fields incomingFields = createTypedFields( cluster, program.getInputRowType(), false ); BlockBuilder statements = new BlockBuilder(); List<Expression> expressionList = RexToLixTranslator.translateProjects( program, (JavaTypeFactory) cluster.getTypeFactory(), statements, new RexToLixTranslator.InputGetter() { public Expression field( BlockBuilder list, int index ) { final Type type = incomingFields.getType( index ); final String name = incomingFields.get( index ).toString(); return Expressions.parameter( type, name ); } } ); Expression record = Expressions.newArrayInit( Object.class, expressionList ); record = Expressions.new_( getConstructor(), record ); statements.add( Expressions.return_( null, record ) ); BlockStatement block = statements.toBlock(); String expression = Expressions.toString( block ); Fields outgoingFields = createTypedFields( cluster, program.getOutputRowType(), false ); LOG.debug( "function parameters: {}", program.getInputRowType() ); LOG.debug( "function results: {}", outgoingFields ); LOG.debug( "function expression: {}", expression ); Function scriptFunction = new ScriptTupleFunction( outgoingFields, expression, incomingFields.getTypesClasses() ); return new Each( pipe, scriptFunction, Fields.RESULTS ); }
private Object evaluate( String expression, Class returnType, TupleEntry tupleEntry ) { ScriptTupleFunction function = new ScriptTupleFunction( new Fields( "result", returnType ), expression ); ConcreteCall<ExpressionOperation.Context> call = new ConcreteCall<ExpressionOperation.Context>( tupleEntry.getFields(), function.getFieldDeclaration() ); function.prepare( FlowProcess.NULL, call ); return function.evaluate( call.getContext(), tupleEntry ); }
private Object evaluate( String expression, String[] names, Class[] types, TupleEntry tupleEntry ) { ScriptTupleFunction function = new ScriptTupleFunction( new Fields( "result" ), expression, names, types ); ConcreteCall<ExpressionOperation.Context> call = new ConcreteCall<ExpressionOperation.Context>( tupleEntry.getFields(), function.getFieldDeclaration() ); function.prepare( FlowProcess.NULL, call ); return function.evaluate( call.getContext(), tupleEntry ); }
private Object evaluate( String expression, Class returnType, TupleEntry tupleEntry ) { ScriptTupleFunction function = new ScriptTupleFunction( new Fields( "result", returnType ), expression ); ConcreteCall<ExpressionOperation.Context> call = new ConcreteCall<ExpressionOperation.Context>( tupleEntry.getFields(), function.getFieldDeclaration() ); function.prepare( FlowProcess.NULL, call ); return function.evaluate( call.getContext(), tupleEntry ); }
private Object evaluate( String expression, String[] names, Class[] types, TupleEntry tupleEntry ) { ScriptTupleFunction function = new ScriptTupleFunction( new Fields( "result" ), expression, names, types ); ConcreteCall<ExpressionOperation.Context> call = new ConcreteCall<ExpressionOperation.Context>( tupleEntry.getFields(), function.getFieldDeclaration() ); function.prepare( FlowProcess.NULL, call ); return function.evaluate( call.getContext(), tupleEntry ); }