/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.sql.relational;
import com.facebook.presto.metadata.Signature;
import com.facebook.presto.spi.function.OperatorType;
import com.facebook.presto.spi.type.BigintType;
import com.facebook.presto.spi.type.StandardTypes;
import com.facebook.presto.spi.type.Type;
import com.facebook.presto.spi.type.TypeSignature;
import com.facebook.presto.sql.tree.ArithmeticBinaryExpression;
import com.facebook.presto.sql.tree.ComparisonExpressionType;
import com.facebook.presto.sql.tree.LogicalBinaryExpression;
import com.facebook.presto.type.LikePatternType;
import com.facebook.presto.type.RowType;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.util.List;
import static com.facebook.presto.metadata.FunctionKind.SCALAR;
import static com.facebook.presto.metadata.FunctionRegistry.mangleOperatorName;
import static com.facebook.presto.metadata.Signature.internalOperator;
import static com.facebook.presto.metadata.Signature.internalScalarFunction;
import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT;
import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature;
import static com.facebook.presto.sql.tree.ArrayConstructor.ARRAY_CONSTRUCTOR;
import static com.google.common.collect.ImmutableList.toImmutableList;
public final class Signatures
{
public static final String IF = "IF";
public static final String NULL_IF = "NULL_IF";
public static final String SWITCH = "SWITCH";
public static final String CAST = mangleOperatorName("CAST");
public static final String TRY_CAST = "TRY_CAST";
public static final String IS_NULL = "IS_NULL";
public static final String COALESCE = "COALESCE";
public static final String IN = "IN";
public static final String TRY = "TRY";
public static final String DEREFERENCE = "DEREFERENCE";
public static final String ROW_CONSTRUCTOR = "ROW_CONSTRUCTOR";
public static final String BIND = "$INTERNAL$BIND";
private Signatures()
{
}
// **************** sql operators ****************
public static Signature notSignature()
{
return new Signature("not", SCALAR, parseTypeSignature(StandardTypes.BOOLEAN), ImmutableList.of(parseTypeSignature(StandardTypes.BOOLEAN)));
}
public static Signature betweenSignature(Type valueType, Type minType, Type maxType)
{
return internalOperator("BETWEEN", parseTypeSignature(StandardTypes.BOOLEAN), valueType.getTypeSignature(), minType.getTypeSignature(), maxType.getTypeSignature());
}
public static Signature likeSignature()
{
return internalScalarFunction("LIKE", parseTypeSignature(StandardTypes.BOOLEAN), parseTypeSignature(StandardTypes.VARCHAR), parseTypeSignature(LikePatternType.NAME));
}
public static Signature likePatternSignature()
{
return internalScalarFunction("LIKE_PATTERN", parseTypeSignature(LikePatternType.NAME), parseTypeSignature(StandardTypes.VARCHAR), parseTypeSignature(StandardTypes.VARCHAR));
}
public static Signature castSignature(Type returnType, Type valueType)
{
// Name has already been mangled, so don't use internalOperator
return internalScalarFunction(CAST, returnType.getTypeSignature(), valueType.getTypeSignature());
}
public static Signature tryCastSignature(Type returnType, Type valueType)
{
return internalScalarFunction(TRY_CAST, returnType.getTypeSignature(), valueType.getTypeSignature());
}
public static Signature logicalExpressionSignature(LogicalBinaryExpression.Type expressionType)
{
return internalScalarFunction(expressionType.name(), parseTypeSignature(StandardTypes.BOOLEAN), parseTypeSignature(StandardTypes.BOOLEAN), parseTypeSignature(StandardTypes.BOOLEAN));
}
public static Signature arithmeticNegationSignature(Type returnType, Type valueType)
{
return internalOperator("NEGATION", returnType.getTypeSignature(), valueType.getTypeSignature());
}
public static Signature arithmeticExpressionSignature(ArithmeticBinaryExpression.Type expressionType, Type returnType, Type leftType, Type rightType)
{
return internalOperator(expressionType.name(), returnType.getTypeSignature(), leftType.getTypeSignature(), rightType.getTypeSignature());
}
public static Signature subscriptSignature(Type returnType, Type leftType, Type rightType)
{
return internalOperator(SUBSCRIPT.name(), returnType.getTypeSignature(), leftType.getTypeSignature(), rightType.getTypeSignature());
}
public static Signature arrayConstructorSignature(Type returnType, List<? extends Type> argumentTypes)
{
return internalScalarFunction(ARRAY_CONSTRUCTOR, returnType.getTypeSignature(), Lists.transform(argumentTypes, Type::getTypeSignature));
}
public static Signature arrayConstructorSignature(TypeSignature returnType, List<TypeSignature> argumentTypes)
{
return internalScalarFunction(ARRAY_CONSTRUCTOR, returnType, argumentTypes);
}
public static Signature comparisonExpressionSignature(ComparisonExpressionType expressionType, Type leftType, Type rightType)
{
for (OperatorType operatorType : OperatorType.values()) {
if (operatorType.name().equals(expressionType.name())) {
return internalOperator(expressionType.name(), parseTypeSignature(StandardTypes.BOOLEAN), leftType.getTypeSignature(), rightType.getTypeSignature());
}
}
return internalScalarFunction(expressionType.name(), parseTypeSignature(StandardTypes.BOOLEAN), leftType.getTypeSignature(), rightType.getTypeSignature());
}
// **************** special forms (lazy evaluation, etc) ****************
public static Signature ifSignature(Type returnType)
{
return new Signature(IF, SCALAR, returnType.getTypeSignature());
}
public static Signature nullIfSignature(Type returnType, Type firstType, Type secondType)
{
return new Signature(NULL_IF, SCALAR, returnType.getTypeSignature(), firstType.getTypeSignature(), secondType.getTypeSignature());
}
public static Signature switchSignature(Type returnType)
{
return new Signature(SWITCH, SCALAR, returnType.getTypeSignature());
}
public static Signature whenSignature(Type returnType)
{
return new Signature("WHEN", SCALAR, returnType.getTypeSignature());
}
public static Signature trySignature(Type returnType)
{
return new Signature(TRY, SCALAR, returnType.getTypeSignature());
}
public static Signature bindSignature(Type returnType, Type valueType, Type functionType)
{
return new Signature(BIND, SCALAR, returnType.getTypeSignature(), valueType.getTypeSignature(), functionType.getTypeSignature());
}
// **************** functions that require varargs and/or complex types (e.g., lists) ****************
public static Signature inSignature()
{
return internalScalarFunction(IN, parseTypeSignature(StandardTypes.BOOLEAN));
}
public static Signature rowConstructorSignature(Type returnType, List<Type> argumentTypes)
{
return internalScalarFunction(ROW_CONSTRUCTOR, returnType.getTypeSignature(), argumentTypes.stream().map(Type::getTypeSignature).collect(toImmutableList()));
}
// **************** functions that need to do special null handling ****************
public static Signature isNullSignature(Type argumentType)
{
return internalScalarFunction(IS_NULL, parseTypeSignature(StandardTypes.BOOLEAN), argumentType.getTypeSignature());
}
public static Signature coalesceSignature(Type returnType, List<Type> argumentTypes)
{
return internalScalarFunction(COALESCE, returnType.getTypeSignature(), Lists.transform(argumentTypes, Type::getTypeSignature));
}
public static Signature dereferenceSignature(Type returnType, RowType rowType)
{
return internalScalarFunction(DEREFERENCE, returnType.getTypeSignature(), ImmutableList.of(rowType.getTypeSignature(), BigintType.BIGINT.getTypeSignature()));
}
}