private Optional<BoundVariables> bindVariables() { assertNotNull(argumentTypes); SignatureBinder signatureBinder = new SignatureBinder(typeRegistry, function, allowCoercion); if (returnType == null) { return signatureBinder.bindVariables(argumentTypes); } else { return signatureBinder.bindVariables(argumentTypes, returnType); } } }
public static List<TypeSignature> applyBoundVariables(List<TypeSignature> typeSignatures, BoundVariables boundVariables) { ImmutableList.Builder<TypeSignature> builder = ImmutableList.builder(); for (TypeSignature typeSignature : typeSignatures) { builder.add(applyBoundVariables(typeSignature, boundVariables)); } return builder.build(); }
private boolean appendConstraintSolversForArguments(ImmutableList.Builder<TypeConstraintSolver> resultBuilder, List<? extends TypeSignatureProvider> actualTypes) { boolean variableArity = declaredSignature.isVariableArity(); List<TypeSignature> formalTypeSignatures = declaredSignature.getArgumentTypes(); if (variableArity) { if (actualTypes.size() < formalTypeSignatures.size() - 1) { return false; } formalTypeSignatures = expandVarargFormalTypeSignature(formalTypeSignatures, actualTypes.size()); } if (formalTypeSignatures.size() != actualTypes.size()) { return false; } for (int i = 0; i < formalTypeSignatures.size(); i++) { if (!appendTypeRelationshipConstraintSolver(resultBuilder, formalTypeSignatures.get(i), actualTypes.get(i), allowCoercion)) { return false; } } return appendConstraintSolvers(resultBuilder, formalTypeSignatures, actualTypes, allowCoercion); }
public Optional<BoundVariables> bindVariables(List<? extends TypeSignatureProvider> actualArgumentTypes) { ImmutableList.Builder<TypeConstraintSolver> constraintSolvers = ImmutableList.builder(); if (!appendConstraintSolversForArguments(constraintSolvers, actualArgumentTypes)) { return Optional.empty(); } return iterativeSolve(constraintSolvers.build()); }
private boolean appendConstraintSolversForReturnValue(ImmutableList.Builder<TypeConstraintSolver> resultBuilder, TypeSignatureProvider actualReturnType) { TypeSignature formalReturnTypeSignature = declaredSignature.getReturnType(); return appendTypeRelationshipConstraintSolver(resultBuilder, formalReturnTypeSignature, actualReturnType, false) && appendConstraintSolvers(resultBuilder, formalReturnTypeSignature, actualReturnType, false); }
public Optional<Signature> bind(List<? extends TypeSignatureProvider> actualArgumentTypes) { Optional<BoundVariables> boundVariables = bindVariables(actualArgumentTypes); if (!boundVariables.isPresent()) { return Optional.empty(); } return Optional.of(applyBoundVariables(declaredSignature, boundVariables.get(), actualArgumentTypes.size())); }
List<TypeSignatureProvider> argumentTypeSignatureProviders = fromTypeSignatures(signature.getArgumentTypes()); for (SqlFunction candidate : candidates) { Optional<BoundVariables> boundVariables = new SignatureBinder(typeManager, candidate.getSignature(), false) .bindVariables(argumentTypeSignatureProviders, returnType); if (boundVariables.isPresent()) { return new SpecializedFunctionKey(candidate, boundVariables.get(), argumentTypeSignatureProviders.size()); SignatureBinder binder = new SignatureBinder(typeManager, candidate.getSignature(), true); Optional<BoundVariables> boundVariables = binder.bindVariables(argumentTypeSignatureProviders, returnType); if (!boundVariables.isPresent()) { continue; Signature boundSignature = applyBoundVariables(candidate.getSignature(), boundVariables.get(), argumentTypes.size());
public Optional<BoundVariables> bindVariables(List<? extends TypeSignatureProvider> actualArgumentTypes, Type actualReturnType) { ImmutableList.Builder<TypeConstraintSolver> constraintSolvers = ImmutableList.builder(); if (!appendConstraintSolversForReturnValue(constraintSolvers, new TypeSignatureProvider(actualReturnType.getTypeSignature()))) { return Optional.empty(); } if (!appendConstraintSolversForArguments(constraintSolvers, actualArgumentTypes)) { return Optional.empty(); } return iterativeSolve(constraintSolvers.build()); }
private List<ApplicableFunction> identifyApplicableFunctions(Collection<SqlFunction> candidates, List<TypeSignatureProvider> actualParameters, boolean allowCoercion) { ImmutableList.Builder<ApplicableFunction> applicableFunctions = ImmutableList.builder(); for (SqlFunction function : candidates) { Signature declaredSignature = function.getSignature(); Optional<Signature> boundSignature = new SignatureBinder(typeManager, declaredSignature, allowCoercion) .bind(actualParameters); if (boundSignature.isPresent()) { applicableFunctions.add(new ApplicableFunction(declaredSignature, boundSignature.get())); } } return applicableFunctions.build(); }
public static Signature applyBoundVariables(Signature signature, BoundVariables boundVariables, int arity) { List<TypeSignature> argumentSignatures; if (signature.isVariableArity()) { argumentSignatures = expandVarargFormalTypeSignature(signature.getArgumentTypes(), arity); } else { checkArgument(signature.getArgumentTypes().size() == arity); argumentSignatures = signature.getArgumentTypes(); } List<TypeSignature> boundArgumentSignatures = applyBoundVariables(argumentSignatures, boundVariables); TypeSignature boundReturnTypeSignature = applyBoundVariables(signature.getReturnType(), boundVariables); return new Signature( signature.getName(), signature.getKind(), ImmutableList.of(), ImmutableList.of(), boundReturnTypeSignature, boundArgumentSignatures, false); }
List<TypeSignature> formalTypeParameterTypeSignatures = formalTypeSignature.getTypeParametersAsTypeSignatures(); resultBuilder.add(new FunctionSolver( getLambdaArgumentTypeSignatures(formalTypeSignature), formalTypeParameterTypeSignatures.get(formalTypeParameterTypeSignatures.size() - 1), actualTypeSignatureProvider)); if (isTypeWithLiteralParameters(formalTypeSignature)) { resultBuilder.add(new TypeWithLiteralParametersSolver(formalTypeSignature, actualType)); return true; return appendConstraintSolvers( resultBuilder, formalTypeParameterTypeSignatures.build(),
calculateVariableValuesForLongConstraints(boundVariablesBuilder); if (!allTypeVariablesBound(boundVariables)) { return Optional.empty();
private boolean appendConstraintSolvers( ImmutableList.Builder<TypeConstraintSolver> resultBuilder, List<? extends TypeSignature> formalTypeSignatures, List<? extends TypeSignatureProvider> actualTypes, boolean allowCoercion) { if (formalTypeSignatures.size() != actualTypes.size()) { return false; } for (int i = 0; i < formalTypeSignatures.size(); i++) { if (!appendConstraintSolvers(resultBuilder, formalTypeSignatures.get(i), actualTypes.get(i), allowCoercion)) { return false; } } return true; }
List<TypeSignatureProvider> argumentTypeSignatureProviders = fromTypeSignatures(signature.getArgumentTypes()); for (SqlFunction candidate : candidates) { Optional<BoundVariables> boundVariables = new SignatureBinder(typeManager, candidate.getSignature(), false) .bindVariables(argumentTypeSignatureProviders, returnType); if (boundVariables.isPresent()) { return new SpecializedFunctionKey(candidate, boundVariables.get(), argumentTypeSignatureProviders.size()); SignatureBinder binder = new SignatureBinder(typeManager, candidate.getSignature(), true); Optional<BoundVariables> boundVariables = binder.bindVariables(argumentTypeSignatureProviders, returnType); if (!boundVariables.isPresent()) { continue; Signature boundSignature = applyBoundVariables(candidate.getSignature(), boundVariables.get(), argumentTypes.size());
public Optional<Signature> bind(List<? extends TypeSignatureProvider> actualArgumentTypes, Type actualReturnType) { Optional<BoundVariables> boundVariables = bindVariables(actualArgumentTypes, actualReturnType); if (!boundVariables.isPresent()) { return Optional.empty(); } return Optional.of(applyBoundVariables(declaredSignature, boundVariables.get(), actualArgumentTypes.size())); }
public Optional<BoundVariables> bindVariables(List<? extends TypeSignatureProvider> actualArgumentTypes, Type actualReturnType) { ImmutableList.Builder<TypeConstraintSolver> constraintSolvers = ImmutableList.builder(); if (!appendConstraintSolversForReturnValue(constraintSolvers, new TypeSignatureProvider(actualReturnType.getTypeSignature()))) { return Optional.empty(); } if (!appendConstraintSolversForArguments(constraintSolvers, actualArgumentTypes)) { return Optional.empty(); } return iterativeSolve(constraintSolvers.build()); }
private List<ApplicableFunction> identifyApplicableFunctions(Collection<SqlFunction> candidates, List<TypeSignatureProvider> actualParameters, boolean allowCoercion) { ImmutableList.Builder<ApplicableFunction> applicableFunctions = ImmutableList.builder(); for (SqlFunction function : candidates) { Signature declaredSignature = function.getSignature(); Optional<Signature> boundSignature = new SignatureBinder(typeManager, declaredSignature, allowCoercion) .bind(actualParameters); if (boundSignature.isPresent()) { applicableFunctions.add(new ApplicableFunction(declaredSignature, boundSignature.get())); } } return applicableFunctions.build(); }
public static Signature applyBoundVariables(Signature signature, BoundVariables boundVariables, int arity) { List<TypeSignature> argumentSignatures; if (signature.isVariableArity()) { argumentSignatures = expandVarargFormalTypeSignature(signature.getArgumentTypes(), arity); } else { checkArgument(signature.getArgumentTypes().size() == arity); argumentSignatures = signature.getArgumentTypes(); } List<TypeSignature> boundArgumentSignatures = applyBoundVariables(argumentSignatures, boundVariables); TypeSignature boundReturnTypeSignature = applyBoundVariables(signature.getReturnType(), boundVariables); return new Signature( signature.getName(), signature.getKind(), ImmutableList.of(), ImmutableList.of(), boundReturnTypeSignature, boundArgumentSignatures, false); }
List<TypeSignature> formalTypeParameterTypeSignatures = formalTypeSignature.getTypeParametersAsTypeSignatures(); resultBuilder.add(new FunctionSolver( getLambdaArgumentTypeSignatures(formalTypeSignature), formalTypeParameterTypeSignatures.get(formalTypeParameterTypeSignatures.size() - 1), actualTypeSignatureProvider)); if (isTypeWithLiteralParameters(formalTypeSignature)) { resultBuilder.add(new TypeWithLiteralParametersSolver(formalTypeSignature, actualType)); return true; return appendConstraintSolvers( resultBuilder, formalTypeParameterTypeSignatures.build(),
private boolean appendConstraintSolversForReturnValue(ImmutableList.Builder<TypeConstraintSolver> resultBuilder, TypeSignatureProvider actualReturnType) { TypeSignature formalReturnTypeSignature = declaredSignature.getReturnType(); return appendTypeRelationshipConstraintSolver(resultBuilder, formalReturnTypeSignature, actualReturnType, false) && appendConstraintSolvers(resultBuilder, formalReturnTypeSignature, actualReturnType, false); }