use of io.confluent.ksql.function.UdfFactory in project ksql by confluentinc.
the class SqlToJavaVisitorTest method shouldImplicitlyCastFunctionCallParameters.
@Test
public void shouldImplicitlyCastFunctionCallParameters() {
// Given:
final UdfFactory udfFactory = mock(UdfFactory.class);
final KsqlScalarFunction udf = mock(KsqlScalarFunction.class);
givenUdf("FOO", udfFactory, udf, SqlTypes.STRING);
when(udf.parameters()).thenReturn(ImmutableList.of(ParamTypes.DOUBLE, ParamTypes.LONG));
// When:
final String javaExpression = sqlToJavaVisitor.process(new FunctionCall(FunctionName.of("FOO"), ImmutableList.of(new DecimalLiteral(new BigDecimal("1.2")), new IntegerLiteral(1))));
// Then:
final String doubleCast = CastEvaluator.generateCode("new BigDecimal(\"1.2\")", SqlTypes.decimal(2, 1), SqlTypes.DOUBLE, ksqlConfig);
final String longCast = CastEvaluator.generateCode("1", SqlTypes.INTEGER, SqlTypes.BIGINT, ksqlConfig);
assertThat(javaExpression, is("((String) FOO_0.evaluate(" + doubleCast + ", " + longCast + "))"));
}
use of io.confluent.ksql.function.UdfFactory in project ksql by confluentinc.
the class SqlToJavaVisitorTest method shouldGenerateCorrectCodeForLambdaExpression.
@Test
public void shouldGenerateCorrectCodeForLambdaExpression() {
// Given:
final UdfFactory udfFactory = mock(UdfFactory.class);
final KsqlScalarFunction udf = mock(KsqlScalarFunction.class);
givenUdf("ABS", udfFactory, udf, SqlTypes.STRING);
givenUdf("TRANSFORM", udfFactory, udf, SqlTypes.STRING);
when(udf.parameters()).thenReturn(ImmutableList.of(ArrayType.of(ParamTypes.DOUBLE), LambdaType.of(ImmutableList.of(ParamTypes.DOUBLE), ParamTypes.DOUBLE)));
final Expression expression = new FunctionCall(FunctionName.of("TRANSFORM"), ImmutableList.of(ARRAYCOL, new LambdaFunctionCall(ImmutableList.of("x"), (new FunctionCall(FunctionName.of("ABS"), ImmutableList.of(new LambdaVariable("X")))))));
// When:
final String javaExpression = sqlToJavaVisitor.process(expression);
// Then
assertThat(javaExpression, equalTo("((String) TRANSFORM_0.evaluate(COL4, new Function() {\n @Override\n public Object apply(Object arg1) {\n final Double x = (Double) arg1;\n return ((String) ABS_1.evaluate(X));\n }\n}))"));
}
use of io.confluent.ksql.function.UdfFactory in project ksql by confluentinc.
the class SqlToJavaVisitorTest method shouldPostfixFunctionInstancesWithUniqueId.
@Test
public void shouldPostfixFunctionInstancesWithUniqueId() {
// Given:
final UdfFactory ssFactory = mock(UdfFactory.class);
final KsqlScalarFunction ssFunction = mock(KsqlScalarFunction.class);
final UdfFactory catFactory = mock(UdfFactory.class);
final KsqlScalarFunction catFunction = mock(KsqlScalarFunction.class);
givenUdf("SUBSTRING", ssFactory, ssFunction, SqlTypes.STRING);
when(ssFunction.parameters()).thenReturn(ImmutableList.of(ParamTypes.STRING, ParamTypes.INTEGER, ParamTypes.INTEGER));
givenUdf("CONCAT", catFactory, catFunction, SqlTypes.STRING);
when(catFunction.parameters()).thenReturn(ImmutableList.of(ParamTypes.STRING, ParamTypes.STRING));
final FunctionName ssName = FunctionName.of("SUBSTRING");
final FunctionName catName = FunctionName.of("CONCAT");
final FunctionCall substring1 = new FunctionCall(ssName, ImmutableList.of(COL1, new IntegerLiteral(1), new IntegerLiteral(3)));
final FunctionCall substring2 = new FunctionCall(ssName, ImmutableList.of(COL1, new IntegerLiteral(4), new IntegerLiteral(5)));
final FunctionCall concat = new FunctionCall(catName, ImmutableList.of(new StringLiteral("-"), substring2));
final Expression expression = new FunctionCall(catName, ImmutableList.of(substring1, concat));
// When:
final String javaExpression = sqlToJavaVisitor.process(expression);
// Then:
assertThat(javaExpression, is("((String) CONCAT_0.evaluate(" + "((String) SUBSTRING_1.evaluate(COL1, 1, 3)), " + "((String) CONCAT_2.evaluate(\"-\"," + " ((String) SUBSTRING_3.evaluate(COL1, 4, 5))))))"));
}
use of io.confluent.ksql.function.UdfFactory in project ksql by confluentinc.
the class TermCompiler method visitFunctionCall.
@Override
public Term visitFunctionCall(final FunctionCall node, final Context context) {
final UdfFactory udfFactory = functionRegistry.getUdfFactory(node.getName());
final FunctionTypeInfo argumentsAndContext = FunctionArgumentsUtil.getFunctionTypeInfo(expressionTypeManager, node, udfFactory, context.getLambdaSqlTypeMapping());
final List<ArgumentInfo> argumentInfos = argumentsAndContext.getArgumentInfos();
final KsqlScalarFunction function = argumentsAndContext.getFunction();
final SqlType functionReturnSchema = argumentsAndContext.getReturnType();
final Class<?> javaClass = SchemaConverters.sqlToJavaConverter().toJavaType(functionReturnSchema);
final List<Expression> arguments = node.getArguments();
final List<Term> args = new ArrayList<>();
for (int i = 0; i < arguments.size(); i++) {
final Expression arg = arguments.get(i);
// lambda arguments and null values are considered to have null type
final SqlType sqlType = argumentInfos.get(i).getSqlArgument().getSqlType().orElse(null);
;
final ParamType paramType;
if (i >= function.parameters().size() - 1 && function.isVariadic()) {
paramType = ((ArrayType) Iterables.getLast(function.parameters())).element();
} else {
paramType = function.parameters().get(i);
}
// This will attempt to cast to the expected argument type and will throw an error if
// it cannot be done.
final Term argTerm = process(convertArgument(arg, sqlType, paramType), new Context(argumentInfos.get(i).getLambdaSqlTypeMapping()));
args.add(argTerm);
}
final Kudf kudf = function.newInstance(ksqlConfig);
return new FunctionCallTerm(kudf, args, javaClass, functionReturnSchema);
}
use of io.confluent.ksql.function.UdfFactory in project ksql by confluentinc.
the class ExpressionTypeManagerTest method init.
@Before
public void init() {
expressionTypeManager = new ExpressionTypeManager(SCHEMA, functionRegistry);
final UdfFactory internalFactory = mock(UdfFactory.class);
final UdfMetadata metadata = mock(UdfMetadata.class);
when(internalFactory.getMetadata()).thenReturn(metadata);
when(functionRegistry.getUdfFactory(any())).thenReturn(internalFactory);
}
Aggregations