Java 类com.facebook.presto.sql.tree.ArithmeticUnaryExpression 实例源码

项目:presto-query-formatter    文件:ExpressionFormatter.java   
@Override
protected String visitArithmeticUnary(ArithmeticUnaryExpression node, StackableAstVisitorContext<Integer> indent)
{
    String value = process(node.getValue(), indent);

    switch (node.getSign()) {
        case MINUS:
            // this is to avoid turning a sequence of "-" into a comment (i.e., "-- comment")
            String separator = value.startsWith("-") ? " " : "";
            return "-" + separator + value;
        case PLUS:
            return "+" + value;
        default:
            throw new UnsupportedOperationException("Unsupported sign: " + node.getSign());
    }
}
项目:presto    文件:SqlToRowExpressionTranslator.java   
@Override
protected RowExpression visitArithmeticUnary(ArithmeticUnaryExpression node, Void context)
{
    RowExpression expression = process(node.getValue(), context);

    switch (node.getSign()) {
        case PLUS:
            return expression;
        case MINUS:
            return call(
                    arithmeticNegationSignature(types.get(node), expression.getType()),
                    types.get(node),
                    expression);
    }

    throw new UnsupportedOperationException("Unsupported unary operator: " + node.getSign());
}
项目:presto    文件:ExpressionAnalyzer.java   
@Override
protected Type visitArithmeticUnary(ArithmeticUnaryExpression node, StackableAstVisitorContext<AnalysisContext> context)
{
    switch (node.getSign()) {
        case PLUS:
            Type type = process(node.getValue(), context);

            if (!type.equals(BIGINT) && !type.equals(DOUBLE)) {
                // TODO: figure out a type-agnostic way of dealing with this. Maybe add a special unary operator
                // that types can chose to implement, or piggyback on the existence of the negation operator
                throw new SemanticException(TYPE_MISMATCH, node, "Unary '+' operator cannot by applied to %s type", type);
            }
            expressionTypes.put(node, type);
            return type;
        case MINUS:
            return getOperator(context, node, OperatorType.NEGATION, node.getValue());
    }

    throw new UnsupportedOperationException("Unsupported unary operator: " + node.getSign());
}
项目:presto    文件:ExpressionFormatter.java   
@Override
protected String visitArithmeticUnary(ArithmeticUnaryExpression node, Boolean unmangleNames)
{
    String value = process(node.getValue(), unmangleNames);

    switch (node.getSign()) {
        case MINUS:
            // this is to avoid turning a sequence of "-" into a comment (i.e., "-- comment")
            String separator = value.startsWith("-") ? " " : "";
            return "-" + separator + value;
        case PLUS:
            return "+" + value;
        default:
            throw new UnsupportedOperationException("Unsupported sign: " + node.getSign());
    }
}
项目:EchoQuery    文件:ExpressionFormatter.java   
@Override
protected String visitArithmeticUnary(ArithmeticUnaryExpression node, Boolean unmangleNames)
{
    String value = process(node.getValue(), unmangleNames);

    switch (node.getSign()) {
        case MINUS:
            // this is to avoid turning a sequence of "-" into a comment (i.e., "-- comment")
            String separator = value.startsWith("-") ? " " : "";
            return "-" + separator + value;
        case PLUS:
            return "+" + value;
        default:
            throw new UnsupportedOperationException("Unsupported sign: " + node.getSign());
    }
}
项目:sql4es    文件:WhereParser.java   
/**
 * Extracts the literal value from an expression (if expression is supported)
 * @param expression
 * @param state
 * @return a Long, Boolean, Double or String object
 */
private Object getLiteralValue(Expression expression, QueryState state){
    if(expression instanceof LongLiteral) return ((LongLiteral)expression).getValue();
    else if(expression instanceof BooleanLiteral) return ((BooleanLiteral)expression).getValue();
    else if(expression instanceof DoubleLiteral) return ((DoubleLiteral)expression).getValue();
    else if(expression instanceof StringLiteral) return ((StringLiteral)expression).getValue();
    else if(expression instanceof ArithmeticUnaryExpression){
        ArithmeticUnaryExpression unaryExp = (ArithmeticUnaryExpression)expression;
        Sign sign = unaryExp.getSign();
        Number num = (Number)getLiteralValue(unaryExp.getValue(), state);
        if(sign == Sign.MINUS){
            if(num instanceof Long) return -1*num.longValue();
            else if(num instanceof Double) return -1*num.doubleValue();
            else {
                state.addException("Unsupported numeric literal expression encountered : "+num.getClass());
                return null;
            }
        }
        return num;
    } else if(expression instanceof FunctionCall){
        FunctionCall fc = (FunctionCall)expression;
        if(fc.getName().toString().equals("now")) return new Date();
        else state.addException("Function '"+fc.getName()+"' is not supported");
    }else if(expression instanceof CurrentTime){
        CurrentTime ct = (CurrentTime)expression;
        if(ct.getType() == CurrentTime.Type.DATE) return new LocalDate().toDate();
        else if(ct.getType() == CurrentTime.Type.TIME) return new Date(new LocalTime(DateTimeZone.UTC).getMillisOfDay());
        else if(ct.getType() == CurrentTime.Type.TIMESTAMP) return new Date();
        else if(ct.getType() == CurrentTime.Type.LOCALTIME) return new Date(new LocalTime(DateTimeZone.UTC).getMillisOfDay());
        else if(ct.getType() == CurrentTime.Type.LOCALTIMESTAMP) return new Date();
        else state.addException("CurrentTime function '"+ct.getType()+"' is not supported");

    }else state.addException("Literal type "+expression.getClass().getSimpleName()+" is not supported");
    return null;
}
项目:presto    文件:ExpressionInterpreter.java   
@Override
protected Object visitArithmeticUnary(ArithmeticUnaryExpression node, Object context)
{
    Object value = process(node.getValue(), context);
    if (value == null) {
        return null;
    }
    if (value instanceof Expression) {
        return new ArithmeticUnaryExpression(node.getSign(), toExpression(value, expressionTypes.get(node.getValue())));
    }

    switch (node.getSign()) {
        case PLUS:
            return value;
        case MINUS:
            Signature operatorSignature = metadata.getFunctionRegistry().resolveOperator(OperatorType.NEGATION, types(node.getValue()));
            MethodHandle handle = metadata.getFunctionRegistry().getScalarFunctionImplementation(operatorSignature).getMethodHandle();

            if (handle.type().parameterCount() > 0 && handle.type().parameterType(0) == ConnectorSession.class) {
                handle = handle.bindTo(session);
            }
            try {
                return handle.invokeWithArguments(value);
            }
            catch (Throwable throwable) {
                Throwables.propagateIfInstanceOf(throwable, RuntimeException.class);
                Throwables.propagateIfInstanceOf(throwable, Error.class);
                throw new RuntimeException(throwable.getMessage(), throwable);
            }
    }

    throw new UnsupportedOperationException("Unsupported unary operator: " + node.getSign());
}
项目:presto    文件:AstBuilder.java   
@Override
public Node visitArithmeticUnary(SqlBaseParser.ArithmeticUnaryContext context)
{
    Expression child = (Expression) visit(context.valueExpression());

    switch (context.operator.getType()) {
        case SqlBaseLexer.MINUS:
            return ArithmeticUnaryExpression.negative(getLocation(context), child);
        case SqlBaseLexer.PLUS:
            return ArithmeticUnaryExpression.positive(getLocation(context), child);
        default:
            throw new UnsupportedOperationException("Unsupported sign: " + context.operator.getText());
    }
}
项目:presto    文件:AggregationAnalyzer.java   
@Override
protected Boolean visitArithmeticUnary(ArithmeticUnaryExpression node, Void context)
{
    return process(node.getValue(), context);
}