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;
}
Aggregations