public SignatureBinder(TypeManager typeManager, Signature declaredSignature, boolean allowCoercion) { checkNoLiteralVariableUsageAcrossTypes(declaredSignature); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.declaredSignature = requireNonNull(declaredSignature, "parametrizedSignature is null"); this.allowCoercion = allowCoercion; this.typeVariableConstraints = declaredSignature.getTypeVariableConstraints().stream() .collect(toMap(TypeVariableConstraint::getName, identity())); }
public SignatureBinder(TypeManager typeManager, Signature declaredSignature, boolean allowCoercion) { checkNoLiteralVariableUsageAcrossTypes(declaredSignature); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.declaredSignature = requireNonNull(declaredSignature, "parametrizedSignature is null"); this.allowCoercion = allowCoercion; this.typeVariableConstraints = declaredSignature.getTypeVariableConstraints().stream() .collect(toMap(TypeVariableConstraint::getName, identity())); }
/** * Example of not allowed literal variable usages across typeSignatures: * <p><ul> * <li>x used in different base types: char(x) and varchar(x) * <li>x used in different positions of the same base type: decimal(x,y) and decimal(z,x) * <li>p used in combination with different literals, types, or literal variables: decimal(p,s1) and decimal(p,s2) * </ul> */ private static void checkNoLiteralVariableUsageAcrossTypes(Signature declaredSignature) { Map<String, TypeSignature> existingUsages = new HashMap<>(); for (TypeSignature parameter : declaredSignature.getArgumentTypes()) { checkNoLiteralVariableUsageAcrossTypes(parameter, existingUsages); } }
/** * Example of not allowed literal variable usages across typeSignatures: * <p><ul> * <li>x used in different base types: char(x) and varchar(x) * <li>x used in different positions of the same base type: decimal(x,y) and decimal(z,x) * <li>p used in combination with different literals, types, or literal variables: decimal(p,s1) and decimal(p,s2) * </ul> */ private static void checkNoLiteralVariableUsageAcrossTypes(Signature declaredSignature) { Map<String, TypeSignature> existingUsages = new HashMap<>(); for (TypeSignature parameter : declaredSignature.getArgumentTypes()) { checkNoLiteralVariableUsageAcrossTypes(parameter, existingUsages); } }
private static void checkNoLiteralVariableUsageAcrossTypes(TypeSignature typeSignature, Map<String, TypeSignature> existingUsages) { List<TypeSignatureParameter> variables = typeSignature.getParameters().stream() .filter(TypeSignatureParameter::isVariable) .collect(toList()); for (TypeSignatureParameter variable : variables) { TypeSignature existing = existingUsages.get(variable.getVariable()); if (existing != null && !existing.equals(typeSignature)) { throw new UnsupportedOperationException("Literal parameters may not be shared across different types"); } existingUsages.put(variable.getVariable(), typeSignature); } for (TypeSignatureParameter parameter : typeSignature.getParameters()) { if (parameter.isLongLiteral() || parameter.isVariable()) { continue; } checkNoLiteralVariableUsageAcrossTypes(parameter.getTypeSignatureOrNamedTypeSignature().get(), existingUsages); } }
private static void checkNoLiteralVariableUsageAcrossTypes(TypeSignature typeSignature, Map<String, TypeSignature> existingUsages) { List<TypeSignatureParameter> variables = typeSignature.getParameters().stream() .filter(TypeSignatureParameter::isVariable) .collect(toList()); for (TypeSignatureParameter variable : variables) { TypeSignature existing = existingUsages.get(variable.getVariable()); if (existing != null && !existing.equals(typeSignature)) { throw new UnsupportedOperationException("Literal parameters may not be shared across different types"); } existingUsages.put(variable.getVariable(), typeSignature); } for (TypeSignatureParameter parameter : typeSignature.getParameters()) { if (parameter.isLongLiteral() || parameter.isVariable()) { continue; } checkNoLiteralVariableUsageAcrossTypes(parameter.getTypeSignatureOrNamedTypeSignature().get(), existingUsages); } }