Search in sources :

Example 1 with SamzaSqlFieldType

use of org.apache.samza.sql.schema.SamzaSqlFieldType in project samza by apache.

the class Checker method checkOperandTypes.

@Override
public boolean checkOperandTypes(SqlCallBinding callBinding, boolean throwOnFailure) {
    if (!udfMetadataOptional.isPresent() || udfMetadataOptional.get().isDisableArgCheck() || !throwOnFailure) {
        return true;
    } else {
        // 1. Generate a mapping from argument index to parsed calcite-type for the sql UDF.
        Map<Integer, RelDataType> argumentIndexToCalciteType = IntStream.range(0, callBinding.getOperandCount()).boxed().collect(Collectors.toMap(operandIndex -> operandIndex, callBinding::getOperandType, (a, b) -> b));
        UdfMetadata udfMetadata = udfMetadataOptional.get();
        List<SamzaSqlFieldType> udfArguments = udfMetadata.getArguments();
        // calcite parser engine.
        for (int udfArgumentIndex = 0; udfArgumentIndex < udfArguments.size(); ++udfArgumentIndex) {
            SamzaSqlFieldType udfArgumentType = udfArguments.get(udfArgumentIndex);
            SqlTypeName udfArgumentAsSqlType = toCalciteSqlType(udfArgumentType);
            RelDataType parsedSqlArgType = argumentIndexToCalciteType.get(udfArgumentIndex);
            // 3(a). Special-case, where static strings used as method-arguments in udf-methods during invocation are parsed as the Char type by calcite.
            if (parsedSqlArgType.getSqlTypeName() == SqlTypeName.CHAR && udfArgumentAsSqlType == SqlTypeName.VARCHAR) {
                return true;
            } else if (!Objects.equals(parsedSqlArgType.getSqlTypeName(), udfArgumentAsSqlType) && !ANY_SQL_TYPE_NAMES.contains(udfArgumentAsSqlType) && !ANY_SQL_TYPE_NAMES.contains(parsedSqlArgType.getSqlTypeName()) && hasOneUdfMethod(udfMetadata)) {
                // 3(b). Throw up and fail on mismatch between the SamzaSqlType and CalciteType for any argument.
                String msg = String.format("Type mismatch in udf class: %s at argument index: %d." + "Expected type: %s, actual type: %s.", udfMetadata.getName(), udfArgumentIndex, parsedSqlArgType.getSqlTypeName(), udfArgumentAsSqlType);
                LOG.error(msg);
                throw new SamzaSqlValidatorException(msg);
            }
        }
    }
    // 4. The SamzaSqlFieldType and CalciteType has matched for all the arguments in the UDF.
    return true;
}
Also used : IntStream(java.util.stream.IntStream) SamzaSqlUdfMethod(org.apache.samza.sql.udfs.SamzaSqlUdfMethod) RelDataType(org.apache.calcite.rel.type.RelDataType) Logger(org.slf4j.Logger) SqlTypeName(org.apache.calcite.sql.type.SqlTypeName) SqlOperandCountRanges(org.apache.calcite.sql.type.SqlOperandCountRanges) SqlOperandTypeChecker(org.apache.calcite.sql.type.SqlOperandTypeChecker) LoggerFactory(org.slf4j.LoggerFactory) SqlCallBinding(org.apache.calcite.sql.SqlCallBinding) SamzaSqlFieldType(org.apache.samza.sql.schema.SamzaSqlFieldType) Collectors(java.util.stream.Collectors) SamzaException(org.apache.samza.SamzaException) Objects(java.util.Objects) List(java.util.List) UdfMetadata(org.apache.samza.sql.interfaces.UdfMetadata) ImmutableList(com.google.common.collect.ImmutableList) Map(java.util.Map) SqlOperandCountRange(org.apache.calcite.sql.SqlOperandCountRange) Optional(java.util.Optional) VisibleForTesting(com.google.common.annotations.VisibleForTesting) SqlOperator(org.apache.calcite.sql.SqlOperator) Method(java.lang.reflect.Method) SamzaSqlFieldType(org.apache.samza.sql.schema.SamzaSqlFieldType) SqlTypeName(org.apache.calcite.sql.type.SqlTypeName) RelDataType(org.apache.calcite.rel.type.RelDataType) UdfMetadata(org.apache.samza.sql.interfaces.UdfMetadata)

Aggregations

VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 ImmutableList (com.google.common.collect.ImmutableList)1 Method (java.lang.reflect.Method)1 List (java.util.List)1 Map (java.util.Map)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 Collectors (java.util.stream.Collectors)1 IntStream (java.util.stream.IntStream)1 RelDataType (org.apache.calcite.rel.type.RelDataType)1 SqlCallBinding (org.apache.calcite.sql.SqlCallBinding)1 SqlOperandCountRange (org.apache.calcite.sql.SqlOperandCountRange)1 SqlOperator (org.apache.calcite.sql.SqlOperator)1 SqlOperandCountRanges (org.apache.calcite.sql.type.SqlOperandCountRanges)1 SqlOperandTypeChecker (org.apache.calcite.sql.type.SqlOperandTypeChecker)1 SqlTypeName (org.apache.calcite.sql.type.SqlTypeName)1 SamzaException (org.apache.samza.SamzaException)1 UdfMetadata (org.apache.samza.sql.interfaces.UdfMetadata)1 SamzaSqlFieldType (org.apache.samza.sql.schema.SamzaSqlFieldType)1 SamzaSqlUdfMethod (org.apache.samza.sql.udfs.SamzaSqlUdfMethod)1