private static SignatureBuilder functionSignature(List<String> arguments, String returnType, List<TypeVariableConstraint> typeVariableConstraints) { ImmutableSet<String> literalParameters = ImmutableSet.of("p", "s", "p1", "s1", "p2", "s2", "p3", "s3"); List<TypeSignature> argumentSignatures = arguments.stream() .map((signature) -> TypeSignature.parseTypeSignature(signature, literalParameters)) .collect(toImmutableList()); return new SignatureBuilder() .returnType(TypeSignature.parseTypeSignature(returnType, literalParameters)) .argumentTypes(argumentSignatures) .typeVariableConstraints(typeVariableConstraints) .kind(SCALAR); }
private static PolymorphicScalarFunctionBuilder makeBinaryOperatorFunctionBuilder(OperatorType operatorType) { Signature signature = Signature.builder() .kind(SCALAR) .operatorType(operatorType) .argumentTypes(DECIMAL_SIGNATURE, DECIMAL_SIGNATURE) .returnType(parseTypeSignature(BOOLEAN)) .build(); return SqlScalarFunction.builder(DecimalInequalityOperators.class) .signature(signature) .deterministic(true); }
private static SignatureBuilder functionSignature() { return new SignatureBuilder() .name("function") .kind(SCALAR); }
@Test public void testBindUnknownToTypeParameter() { Signature function = functionSignature() .returnType(parseTypeSignature("T")) .argumentTypes(parseTypeSignature("T")) .typeVariableConstraints(ImmutableList.of(typeVariable("T"))) .build(); assertThat(function) .boundTo("unknown") .withCoercion() .produces(new BoundVariables( ImmutableMap.of("T", type("unknown")), ImmutableMap.of())); }
@Test public void testBindDifferentLiteralParameters() { TypeSignature argType = parseTypeSignature("decimal(p,s)", ImmutableSet.of("p", "s")); Signature function = functionSignature() .returnType(parseTypeSignature(StandardTypes.BOOLEAN)) .argumentTypes(argType, argType) .build(); assertThat(function) .boundTo("decimal(2,1)", "decimal(3,1)") .fails(); }
@Test public void testTypeParameters() throws Throwable { Signature signature = Signature.builder() .name("foo") .kind(SCALAR) .typeVariableConstraints(comparableWithVariadicBound("V", VARCHAR)) .returnType(parseTypeSignature("V")) .argumentTypes(parseTypeSignature("V")) .build(); SqlScalarFunction function = SqlScalarFunction.builder(TestMethods.class) .signature(signature) .deterministic(true) .choice(choice -> choice .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, REGISTRY); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); }
public static SignatureBuilder modulusSignatureBuilder() { TypeSignature decimalLeftSignature = parseTypeSignature("decimal(a_precision, a_scale)", ImmutableSet.of("a_precision", "a_scale")); TypeSignature decimalRightSignature = parseTypeSignature("decimal(b_precision, b_scale)", ImmutableSet.of("b_precision", "b_scale")); TypeSignature decimalResultSignature = parseTypeSignature("decimal(r_precision, r_scale)", ImmutableSet.of("r_precision", "r_scale")); return Signature.builder() .longVariableConstraints( longVariableExpression("r_precision", "min(b_precision - b_scale, a_precision - a_scale) + max(a_scale, b_scale)"), longVariableExpression("r_scale", "max(a_scale, b_scale)")) .argumentTypes(decimalLeftSignature, decimalRightSignature) .returnType(decimalResultSignature); }
private static SqlScalarFunction decimalModulusOperator() { Signature signature = modulusSignatureBuilder() .operatorType(MODULUS) .build(); return modulusScalarFunction(signature); }
public static SignatureBuilder builder() { return new SignatureBuilder(); } }
public SignatureBuilder typeVariableConstraints(TypeVariableConstraint... typeVariableConstraints) { return typeVariableConstraints(asList(requireNonNull(typeVariableConstraints, "typeVariableConstraints is null"))); }
public SignatureBuilder argumentTypes(TypeSignature... argumentTypes) { return argumentTypes(asList(requireNonNull(argumentTypes, "argumentTypes is Null"))); }
public SignatureBuilder longVariableConstraints(LongVariableConstraint... longVariableConstraints) { return longVariableConstraints(asList(requireNonNull(longVariableConstraints, "longVariableConstraints is null"))); }
@Test public void testResolveFunctionWithVariableArity() { assertThatResolveFunction() .among( functionSignature("double", "double", "double"), functionSignature("decimal(p,s)").setVariableArity(true)) .forParameters("bigint", "bigint", "bigint") .returns(functionSignature("decimal(19,0)", "decimal(19,0)", "decimal(19,0)")); assertThatResolveFunction() .among( functionSignature("double", "double", "double"), functionSignature("bigint").setVariableArity(true)) .forParameters("bigint", "bigint", "bigint") .returns(functionSignature("bigint", "bigint", "bigint")); }
@Test public void testBindUnknownToTypeParameter() { Signature function = functionSignature() .returnType(parseTypeSignature("T")) .argumentTypes(parseTypeSignature("T")) .typeVariableConstraints(ImmutableList.of(typeVariable("T"))) .build(); assertThat(function) .boundTo("unknown") .withCoercion() .produces(new BoundVariables( ImmutableMap.of("T", type("unknown")), ImmutableMap.of())); }
@Test public void testBindDifferentLiteralParameters() { TypeSignature argType = parseTypeSignature("decimal(p,s)", ImmutableSet.of("p", "s")); Signature function = functionSignature() .returnType(parseTypeSignature(StandardTypes.BOOLEAN)) .argumentTypes(argType, argType) .build(); assertThat(function) .boundTo("decimal(2,1)", "decimal(3,1)") .fails(); }
@Test public void testSameLiteralInArgumentsAndReturnValue() throws Throwable { Signature signature = Signature.builder() .name("foo") .kind(SCALAR) .returnType(parseTypeSignature("varchar(x)", ImmutableSet.of("x"))) .argumentTypes(parseTypeSignature("varchar(x)", ImmutableSet.of("x"))) .build(); SqlScalarFunction function = SqlScalarFunction.builder(TestMethods.class) .signature(signature) .deterministic(true) .choice(choice -> choice .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, REGISTRY); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); }