Search in sources :

Example 1 with Kudf

use of io.confluent.ksql.function.udf.Kudf in project ksql by confluentinc.

the class CodeGenRunner method buildCodeGenFromParseTree.

public ExpressionMetadata buildCodeGenFromParseTree(final Expression expression) throws Exception {
    Map<String, Class> parameterMap = getParameterInfo(expression);
    String[] parameterNames = new String[parameterMap.size()];
    Class[] parameterTypes = new Class[parameterMap.size()];
    int[] columnIndexes = new int[parameterMap.size()];
    Kudf[] kudfObjects = new Kudf[parameterMap.size()];
    int index = 0;
    for (Map.Entry<String, Class> entry : parameterMap.entrySet()) {
        parameterNames[index] = entry.getKey();
        parameterTypes[index] = entry.getValue();
        columnIndexes[index] = SchemaUtil.getFieldIndexByName(schema, entry.getKey());
        if (columnIndexes[index] < 0) {
            kudfObjects[index] = (Kudf) entry.getValue().newInstance();
        } else {
            kudfObjects[index] = null;
        }
        index++;
    }
    String javaCode = new SqlToJavaVisitor(schema, functionRegistry).process(expression);
    IExpressionEvaluator ee = CompilerFactoryFactory.getDefaultCompilerFactory().newExpressionEvaluator();
    // The expression will have two "int" parameters: "a" and "b".
    ee.setParameters(parameterNames, parameterTypes);
    // And the expression (i.e. "result") type is also "int".
    ExpressionTypeManager expressionTypeManager = new ExpressionTypeManager(schema, functionRegistry);
    Schema expressionType = expressionTypeManager.getExpressionType(expression);
    ee.setExpressionType(SchemaUtil.getJavaType(expressionType));
    // And now we "cook" (scan, parse, compile and load) the fabulous expression.
    ee.cook(javaCode);
    return new ExpressionMetadata(ee, columnIndexes, kudfObjects, expressionType);
}
Also used : ExpressionTypeManager(io.confluent.ksql.util.ExpressionTypeManager) Schema(org.apache.kafka.connect.data.Schema) IExpressionEvaluator(org.codehaus.commons.compiler.IExpressionEvaluator) Kudf(io.confluent.ksql.function.udf.Kudf) ExpressionMetadata(io.confluent.ksql.util.ExpressionMetadata) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with Kudf

use of io.confluent.ksql.function.udf.Kudf in project ksql by confluentinc.

the class SqlPredicate method getWindowedKeyPredicate.

private Predicate getWindowedKeyPredicate() {
    final ExpressionMetadata expressionEvaluator = createExpressionMetadata();
    return (Predicate<Windowed<String>, GenericRow>) (key, row) -> {
        try {
            Kudf[] kudfs = expressionEvaluator.getUdfs();
            Object[] values = new Object[columnIndexes.length];
            for (int i = 0; i < values.length; i++) {
                if (columnIndexes[i] < 0) {
                    values[i] = kudfs[i];
                } else {
                    values[i] = genericRowValueTypeEnforcer.enforceFieldType(columnIndexes[i], row.getColumns().get(columnIndexes[i]));
                }
            }
            return (Boolean) ee.evaluate(values);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.error("Invalid format: " + key + " : " + row);
        return false;
    };
}
Also used : ExpressionMetadata(io.confluent.ksql.util.ExpressionMetadata) KsqlException(io.confluent.ksql.util.KsqlException) Predicate(org.apache.kafka.streams.kstream.Predicate) Kudf(io.confluent.ksql.function.udf.Kudf)

Aggregations

Kudf (io.confluent.ksql.function.udf.Kudf)2 ExpressionMetadata (io.confluent.ksql.util.ExpressionMetadata)2 ExpressionTypeManager (io.confluent.ksql.util.ExpressionTypeManager)1 KsqlException (io.confluent.ksql.util.KsqlException)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Schema (org.apache.kafka.connect.data.Schema)1 Predicate (org.apache.kafka.streams.kstream.Predicate)1 IExpressionEvaluator (org.codehaus.commons.compiler.IExpressionEvaluator)1