Skip to content

Commit

Permalink
Rename TypeParameter to TypeParameterRequirement
Browse files Browse the repository at this point in the history
It more accurately describes a constraint that a type argument
needs to satisfy.
  • Loading branch information
pnowojski authored and martint committed Jan 8, 2016
1 parent 3dbb3ba commit a633f0a
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 59 deletions.
Expand Up @@ -453,7 +453,7 @@ public Signature resolveFunction(QualifiedName name, List<TypeSignature> paramet
expectedParameters.add(format("%s(%s) %s", expectedParameters.add(format("%s(%s) %s",
name, name,
Joiner.on(", ").join(function.getSignature().getArgumentTypes()), Joiner.on(", ").join(function.getSignature().getArgumentTypes()),
Joiner.on(", ").join(function.getSignature().getTypeParameters()))); Joiner.on(", ").join(function.getSignature().getTypeParameterRequirements())));
} }
String parameters = Joiner.on(", ").join(parameterTypes); String parameters = Joiner.on(", ").join(parameterTypes);
String message = format("Function %s not registered", name); String message = format("Function %s not registered", name);
Expand Down Expand Up @@ -509,7 +509,7 @@ private SqlFunction getRowFieldReference(String field, TypeSignature rowTypeSign
public WindowFunctionSupplier getWindowFunctionImplementation(Signature signature) public WindowFunctionSupplier getWindowFunctionImplementation(Signature signature)
{ {
checkArgument(signature.getKind() == WINDOW || signature.getKind() == AGGREGATE, "%s is not a window function", signature); checkArgument(signature.getKind() == WINDOW || signature.getKind() == AGGREGATE, "%s is not a window function", signature);
checkArgument(signature.getTypeParameters().isEmpty(), "%s has unbound type parameters", signature); checkArgument(signature.getTypeParameterRequirements().isEmpty(), "%s has unbound type parameters", signature);
Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName())); Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName()));
// search for exact match // search for exact match
for (SqlFunction operator : candidates) { for (SqlFunction operator : candidates) {
Expand All @@ -531,7 +531,7 @@ public WindowFunctionSupplier getWindowFunctionImplementation(Signature signatur
public InternalAggregationFunction getAggregateFunctionImplementation(Signature signature) public InternalAggregationFunction getAggregateFunctionImplementation(Signature signature)
{ {
checkArgument(signature.getKind() == AGGREGATE || signature.getKind() == APPROXIMATE_AGGREGATE, "%s is not an aggregate function", signature); checkArgument(signature.getKind() == AGGREGATE || signature.getKind() == APPROXIMATE_AGGREGATE, "%s is not an aggregate function", signature);
checkArgument(signature.getTypeParameters().isEmpty(), "%s has unbound type parameters", signature); checkArgument(signature.getTypeParameterRequirements().isEmpty(), "%s has unbound type parameters", signature);
Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName())); Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName()));
// search for exact match // search for exact match
for (SqlFunction operator : candidates) { for (SqlFunction operator : candidates) {
Expand All @@ -553,7 +553,7 @@ public InternalAggregationFunction getAggregateFunctionImplementation(Signature
public ScalarFunctionImplementation getScalarFunctionImplementation(Signature signature) public ScalarFunctionImplementation getScalarFunctionImplementation(Signature signature)
{ {
checkArgument(signature.getKind() == SCALAR, "%s is not a scalar function", signature); checkArgument(signature.getKind() == SCALAR, "%s is not a scalar function", signature);
checkArgument(signature.getTypeParameters().isEmpty(), "%s has unbound type parameters", signature); checkArgument(signature.getTypeParameterRequirements().isEmpty(), "%s has unbound type parameters", signature);
Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName())); Iterable<SqlFunction> candidates = functions.get(QualifiedName.of(signature.getName()));
// search for exact match // search for exact match
Type returnType = typeManager.getType(signature.getReturnType()); Type returnType = typeManager.getType(signature.getReturnType());
Expand Down
Expand Up @@ -45,7 +45,7 @@ public final class Signature
{ {
private final String name; private final String name;
private final FunctionKind kind; private final FunctionKind kind;
private final List<TypeParameter> typeParameters; private final List<TypeParameterRequirement> typeParameterRequirements;
private final TypeSignature returnType; private final TypeSignature returnType;
private final List<TypeSignature> argumentTypes; private final List<TypeSignature> argumentTypes;
private final boolean variableArity; private final boolean variableArity;
Expand All @@ -54,30 +54,30 @@ public final class Signature
public Signature( public Signature(
@JsonProperty("name") String name, @JsonProperty("name") String name,
@JsonProperty("kind") FunctionKind kind, @JsonProperty("kind") FunctionKind kind,
@JsonProperty("typeParameters") List<TypeParameter> typeParameters, @JsonProperty("typeParameterRequirements") List<TypeParameterRequirement> typeParameterRequirements,
@JsonProperty("returnType") TypeSignature returnType, @JsonProperty("returnType") TypeSignature returnType,
@JsonProperty("argumentTypes") List<TypeSignature> argumentTypes, @JsonProperty("argumentTypes") List<TypeSignature> argumentTypes,
@JsonProperty("variableArity") boolean variableArity) @JsonProperty("variableArity") boolean variableArity)
{ {
requireNonNull(name, "name is null"); requireNonNull(name, "name is null");
requireNonNull(typeParameters, "typeParameters is null"); requireNonNull(typeParameterRequirements, "typeParameters is null");


this.name = name; this.name = name;
this.kind = requireNonNull(kind, "type is null"); this.kind = requireNonNull(kind, "type is null");
this.typeParameters = ImmutableList.copyOf(typeParameters); this.typeParameterRequirements = ImmutableList.copyOf(typeParameterRequirements);
this.returnType = requireNonNull(returnType, "returnType is null"); this.returnType = requireNonNull(returnType, "returnType is null");
this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null")); this.argumentTypes = ImmutableList.copyOf(requireNonNull(argumentTypes, "argumentTypes is null"));
this.variableArity = variableArity; this.variableArity = variableArity;
} }


public Signature(String name, FunctionKind kind, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes, boolean variableArity) public Signature(String name, FunctionKind kind, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes, boolean variableArity)
{ {
this(name, kind, typeParameters, parseTypeSignature(returnType), Lists.transform(argumentTypes, TypeSignature::parseTypeSignature), variableArity); this(name, kind, typeParameterRequirements, parseTypeSignature(returnType), Lists.transform(argumentTypes, TypeSignature::parseTypeSignature), variableArity);
} }


public Signature(String name, FunctionKind kind, String returnType, List<String> argumentTypes) public Signature(String name, FunctionKind kind, String returnType, List<String> argumentTypes)
{ {
this(name, kind, ImmutableList.<TypeParameter>of(), parseTypeSignature(returnType), Lists.transform(argumentTypes, TypeSignature::parseTypeSignature), false); this(name, kind, ImmutableList.<TypeParameterRequirement>of(), parseTypeSignature(returnType), Lists.transform(argumentTypes, TypeSignature::parseTypeSignature), false);
} }


public Signature(String name, FunctionKind kind, String returnType, String... argumentTypes) public Signature(String name, FunctionKind kind, String returnType, String... argumentTypes)
Expand All @@ -87,7 +87,7 @@ public Signature(String name, FunctionKind kind, String returnType, String... ar


public Signature(String name, FunctionKind kind, TypeSignature returnType, List<TypeSignature> argumentTypes) public Signature(String name, FunctionKind kind, TypeSignature returnType, List<TypeSignature> argumentTypes)
{ {
this(name, kind, ImmutableList.<TypeParameter>of(), returnType, argumentTypes, false); this(name, kind, ImmutableList.<TypeParameterRequirement>of(), returnType, argumentTypes, false);
} }


public Signature(String name, FunctionKind kind, TypeSignature returnType, TypeSignature... argumentTypes) public Signature(String name, FunctionKind kind, TypeSignature returnType, TypeSignature... argumentTypes)
Expand Down Expand Up @@ -117,7 +117,7 @@ public static Signature internalScalarFunction(String name, String returnType, S


public static Signature internalScalarFunction(String name, String returnType, List<String> argumentTypes) public static Signature internalScalarFunction(String name, String returnType, List<String> argumentTypes)
{ {
return new Signature(name, SCALAR, ImmutableList.<TypeParameter>of(), returnType, argumentTypes, false); return new Signature(name, SCALAR, ImmutableList.<TypeParameterRequirement>of(), returnType, argumentTypes, false);
} }


public static Signature internalScalarFunction(String name, TypeSignature returnType, TypeSignature... argumentTypes) public static Signature internalScalarFunction(String name, TypeSignature returnType, TypeSignature... argumentTypes)
Expand All @@ -127,7 +127,7 @@ public static Signature internalScalarFunction(String name, TypeSignature return


public static Signature internalScalarFunction(String name, TypeSignature returnType, List<TypeSignature> argumentTypes) public static Signature internalScalarFunction(String name, TypeSignature returnType, List<TypeSignature> argumentTypes)
{ {
return new Signature(name, SCALAR, ImmutableList.<TypeParameter>of(), returnType, argumentTypes, false); return new Signature(name, SCALAR, ImmutableList.<TypeParameterRequirement>of(), returnType, argumentTypes, false);
} }


@JsonProperty @JsonProperty
Expand Down Expand Up @@ -161,20 +161,20 @@ public boolean isVariableArity()
} }


@JsonProperty @JsonProperty
public List<TypeParameter> getTypeParameters() public List<TypeParameterRequirement> getTypeParameterRequirements()
{ {
return typeParameters; return typeParameterRequirements;
} }


@Override @Override
public int hashCode() public int hashCode()
{ {
return Objects.hash(name, kind, typeParameters, returnType, argumentTypes, variableArity); return Objects.hash(name, kind, typeParameterRequirements, returnType, argumentTypes, variableArity);
} }


Signature withAlias(String name) Signature withAlias(String name)
{ {
return new Signature(name, kind, typeParameters, getReturnType(), getArgumentTypes(), variableArity); return new Signature(name, kind, typeParameterRequirements, getReturnType(), getArgumentTypes(), variableArity);
} }


@Override @Override
Expand All @@ -189,7 +189,7 @@ public boolean equals(Object obj)
Signature other = (Signature) obj; Signature other = (Signature) obj;
return Objects.equals(this.name, other.name) && return Objects.equals(this.name, other.name) &&
Objects.equals(this.kind, other.kind) && Objects.equals(this.kind, other.kind) &&
Objects.equals(this.typeParameters, other.typeParameters) && Objects.equals(this.typeParameterRequirements, other.typeParameterRequirements) &&
Objects.equals(this.returnType, other.returnType) && Objects.equals(this.returnType, other.returnType) &&
Objects.equals(this.argumentTypes, other.argumentTypes) && Objects.equals(this.argumentTypes, other.argumentTypes) &&
Objects.equals(this.variableArity, other.variableArity); Objects.equals(this.variableArity, other.variableArity);
Expand All @@ -198,19 +198,19 @@ public boolean equals(Object obj)
@Override @Override
public String toString() public String toString()
{ {
return name + (typeParameters.isEmpty() ? "" : "<" + Joiner.on(",").join(typeParameters) + ">") + "(" + Joiner.on(",").join(argumentTypes) + "):" + returnType; return name + (typeParameterRequirements.isEmpty() ? "" : "<" + Joiner.on(",").join(typeParameterRequirements) + ">") + "(" + Joiner.on(",").join(argumentTypes) + "):" + returnType;
} }


@Nullable @Nullable
public Map<String, Type> bindTypeParameters(Type returnType, List<? extends Type> types, boolean allowCoercion, TypeManager typeManager) public Map<String, Type> bindTypeParameters(Type returnType, List<? extends Type> types, boolean allowCoercion, TypeManager typeManager)
{ {
Map<String, Type> boundParameters = new HashMap<>(); Map<String, Type> boundParameters = new HashMap<>();
ImmutableMap.Builder<String, TypeParameter> builder = ImmutableMap.builder(); ImmutableMap.Builder<String, TypeParameterRequirement> builder = ImmutableMap.builder();
for (TypeParameter parameter : typeParameters) { for (TypeParameterRequirement parameter : typeParameterRequirements) {
builder.put(parameter.getName(), parameter); builder.put(parameter.getName(), parameter);
} }


ImmutableMap<String, TypeParameter> parameters = builder.build(); ImmutableMap<String, TypeParameterRequirement> parameters = builder.build();
if (!matchAndBind(boundParameters, parameters, this.returnType, returnType, allowCoercion, typeManager)) { if (!matchAndBind(boundParameters, parameters, this.returnType, returnType, allowCoercion, typeManager)) {
return null; return null;
} }
Expand All @@ -232,12 +232,12 @@ public Map<String, Type> bindTypeParameters(Type returnType, List<? extends Type
public Map<String, Type> bindTypeParameters(List<? extends Type> types, boolean allowCoercion, TypeManager typeManager) public Map<String, Type> bindTypeParameters(List<? extends Type> types, boolean allowCoercion, TypeManager typeManager)
{ {
Map<String, Type> boundParameters = new HashMap<>(); Map<String, Type> boundParameters = new HashMap<>();
ImmutableMap.Builder<String, TypeParameter> builder = ImmutableMap.builder(); ImmutableMap.Builder<String, TypeParameterRequirement> builder = ImmutableMap.builder();
for (TypeParameter parameter : typeParameters) { for (TypeParameterRequirement parameter : typeParameterRequirements) {
builder.put(parameter.getName(), parameter); builder.put(parameter.getName(), parameter);
} }


ImmutableMap<String, TypeParameter> parameters = builder.build(); ImmutableMap<String, TypeParameterRequirement> parameters = builder.build();
if (!matchArguments(boundParameters, parameters, argumentTypes, types, allowCoercion, variableArity, typeManager)) { if (!matchArguments(boundParameters, parameters, argumentTypes, types, allowCoercion, variableArity, typeManager)) {
return null; return null;
} }
Expand All @@ -249,7 +249,7 @@ public Map<String, Type> bindTypeParameters(List<? extends Type> types, boolean


private static boolean matchArguments( private static boolean matchArguments(
Map<String, Type> boundParameters, Map<String, Type> boundParameters,
Map<String, TypeParameter> parameters, Map<String, TypeParameterRequirement> parameters,
List<TypeSignature> argumentTypes, List<TypeSignature> argumentTypes,
List<? extends Type> types, List<? extends Type> types,
boolean allowCoercion, boolean allowCoercion,
Expand Down Expand Up @@ -290,7 +290,7 @@ private static boolean matchArguments(
return true; return true;
} }


private static boolean matchAndBind(Map<String, Type> boundParameters, Map<String, TypeParameter> typeParameters, TypeSignature parameter, Type type, boolean allowCoercion, TypeManager typeManager) private static boolean matchAndBind(Map<String, Type> boundParameters, Map<String, TypeParameterRequirement> typeParameters, TypeSignature parameter, Type type, boolean allowCoercion, TypeManager typeManager)
{ {
// TODO: add literals to Types and switch to TypeSignatureParameter so boundParameters map includes also literal parameter bindings // TODO: add literals to Types and switch to TypeSignatureParameter so boundParameters map includes also literal parameter bindings
List<TypeSignature> typeSignatures = parameter.getTypeParametersAsTypeSignatures(); List<TypeSignature> typeSignatures = parameter.getTypeParametersAsTypeSignatures();
Expand Down Expand Up @@ -329,8 +329,8 @@ else if (canCoerce(boundParameters.get(parameter.getBase()), type) && typeParame


// Bind parameter, if this is a free type parameter // Bind parameter, if this is a free type parameter
if (typeParameters.containsKey(parameter.getBase())) { if (typeParameters.containsKey(parameter.getBase())) {
TypeParameter typeParameter = typeParameters.get(parameter.getBase()); TypeParameterRequirement typeParameterRequirement = typeParameters.get(parameter.getBase());
if (!typeParameter.canBind(type)) { if (!typeParameterRequirement.canBind(type)) {
return false; return false;
} }
boundParameters.put(parameter.getBase(), type); boundParameters.put(parameter.getBase(), type);
Expand All @@ -354,28 +354,28 @@ else if (canCoerce(boundParameters.get(parameter.getBase()), type) && typeParame
/* /*
* similar to T extends MyClass<?...>, if Java supported varargs wildcards * similar to T extends MyClass<?...>, if Java supported varargs wildcards
*/ */
public static TypeParameter withVariadicBound(String name, String variadicBound) public static TypeParameterRequirement withVariadicBound(String name, String variadicBound)
{ {
return new TypeParameter(name, false, false, variadicBound); return new TypeParameterRequirement(name, false, false, variadicBound);
} }


public static TypeParameter comparableWithVariadicBound(String name, String variadicBound) public static TypeParameterRequirement comparableWithVariadicBound(String name, String variadicBound)
{ {
return new TypeParameter(name, true, false, variadicBound); return new TypeParameterRequirement(name, true, false, variadicBound);
} }


public static TypeParameter typeParameter(String name) public static TypeParameterRequirement typeParameter(String name)
{ {
return new TypeParameter(name, false, false, null); return new TypeParameterRequirement(name, false, false, null);
} }


public static TypeParameter comparableTypeParameter(String name) public static TypeParameterRequirement comparableTypeParameter(String name)
{ {
return new TypeParameter(name, true, false, null); return new TypeParameterRequirement(name, true, false, null);
} }


public static TypeParameter orderableTypeParameter(String name) public static TypeParameterRequirement orderableTypeParameter(String name)
{ {
return new TypeParameter(name, false, true, null); return new TypeParameterRequirement(name, false, true, null);
} }
} }
Expand Up @@ -38,19 +38,19 @@ public static SqlAggregationFunction create(String name, String description, Int
return new SimpleSqlAggregationFunction(name, description, function); return new SimpleSqlAggregationFunction(name, description, function);
} }


protected SqlAggregationFunction(String name, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes) protected SqlAggregationFunction(String name, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes)
{ {
this(name, typeParameters, returnType, argumentTypes, AGGREGATE); this(name, typeParameterRequirements, returnType, argumentTypes, AGGREGATE);
} }


protected SqlAggregationFunction(String name, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes, FunctionKind kind) protected SqlAggregationFunction(String name, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes, FunctionKind kind)
{ {
requireNonNull(name, "name is null"); requireNonNull(name, "name is null");
requireNonNull(typeParameters, "typeParameters is null"); requireNonNull(typeParameterRequirements, "typeParameters is null");
requireNonNull(returnType, "returnType is null"); requireNonNull(returnType, "returnType is null");
requireNonNull(argumentTypes, "argumentTypes is null"); requireNonNull(argumentTypes, "argumentTypes is null");
checkArgument(kind == AGGREGATE || kind == APPROXIMATE_AGGREGATE, "kind must be an aggregate"); checkArgument(kind == AGGREGATE || kind == APPROXIMATE_AGGREGATE, "kind must be an aggregate");
this.signature = new Signature(name, kind, ImmutableList.copyOf(typeParameters), returnType, ImmutableList.copyOf(argumentTypes), false); this.signature = new Signature(name, kind, ImmutableList.copyOf(typeParameterRequirements), returnType, ImmutableList.copyOf(argumentTypes), false);
} }


@Override @Override
Expand Down Expand Up @@ -85,7 +85,7 @@ public SimpleSqlAggregationFunction(
InternalAggregationFunction function) InternalAggregationFunction function)
{ {
super(name, super(name,
ImmutableList.<TypeParameter>of(), ImmutableList.<TypeParameterRequirement>of(),
function.getFinalType().getTypeSignature().toString(), function.getFinalType().getTypeSignature().toString(),
function.getParameterTypes().stream() function.getParameterTypes().stream()
.map(Type::getTypeSignature) .map(Type::getTypeSignature)
Expand Down
Expand Up @@ -43,9 +43,9 @@ public static SqlOperator create(
return new SimpleSqlOperator(operatorType, argumentTypes, returnType, methodHandle, instanceFactory, nullable, nullableArguments); return new SimpleSqlOperator(operatorType, argumentTypes, returnType, methodHandle, instanceFactory, nullable, nullableArguments);
} }


protected SqlOperator(OperatorType operatorType, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes) protected SqlOperator(OperatorType operatorType, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes)
{ {
super(mangleOperatorName(operatorType), typeParameters, returnType, argumentTypes); super(mangleOperatorName(operatorType), typeParameterRequirements, returnType, argumentTypes);
} }


@Override @Override
Expand Down
Expand Up @@ -47,18 +47,18 @@ public static SqlScalarFunction create(
return new SimpleSqlScalarFunction(signature, description, hidden, methodHandle, instanceFactory, deterministic, nullable, nullableArguments); return new SimpleSqlScalarFunction(signature, description, hidden, methodHandle, instanceFactory, deterministic, nullable, nullableArguments);
} }


protected SqlScalarFunction(String name, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes) protected SqlScalarFunction(String name, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes)
{ {
this(name, typeParameters, returnType, argumentTypes, false); this(name, typeParameterRequirements, returnType, argumentTypes, false);
} }


protected SqlScalarFunction(String name, List<TypeParameter> typeParameters, String returnType, List<String> argumentTypes, boolean variableArity) protected SqlScalarFunction(String name, List<TypeParameterRequirement> typeParameterRequirements, String returnType, List<String> argumentTypes, boolean variableArity)
{ {
requireNonNull(name, "name is null"); requireNonNull(name, "name is null");
requireNonNull(typeParameters, "typeParameters is null"); requireNonNull(typeParameterRequirements, "typeParameters is null");
requireNonNull(returnType, "returnType is null"); requireNonNull(returnType, "returnType is null");
requireNonNull(argumentTypes, "argumentTypes is null"); requireNonNull(argumentTypes, "argumentTypes is null");
this.signature = new Signature(name, SCALAR, ImmutableList.copyOf(typeParameters), returnType, ImmutableList.copyOf(argumentTypes), variableArity); this.signature = new Signature(name, SCALAR, ImmutableList.copyOf(typeParameterRequirements), returnType, ImmutableList.copyOf(argumentTypes), variableArity);
} }


@Override @Override
Expand Down Expand Up @@ -96,7 +96,7 @@ public SimpleSqlScalarFunction(
signature.getArgumentTypes().stream() signature.getArgumentTypes().stream()
.map(TypeSignature::toString) .map(TypeSignature::toString)
.collect(ImmutableCollectors.toImmutableList())); .collect(ImmutableCollectors.toImmutableList()));
checkArgument(signature.getTypeParameters().isEmpty(), "%s is parametric", signature); checkArgument(signature.getTypeParameterRequirements().isEmpty(), "%s is parametric", signature);
this.description = description; this.description = description;
this.hidden = hidden; this.hidden = hidden;
this.methodHandle = requireNonNull(methodHandle, "methodHandle is null"); this.methodHandle = requireNonNull(methodHandle, "methodHandle is null");
Expand Down

0 comments on commit a633f0a

Please sign in to comment.