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

项目:hue    文件:VeroGenExpFormatter.java   
@Override
public String visitWindowFrame(WindowFrame node, Void context)
{
    StringBuilder builder = new StringBuilder();

    builder.append(node.getType().toString()).append(' ');

    if (node.getEnd().isPresent()) {
        builder.append("BETWEEN ")
                .append(process(node.getStart(), null))
                .append(" AND ")
                .append(process(node.getEnd().get(), null));
    }
    else {
        builder.append(process(node.getStart(), null));
    }

    return builder.toString();
}
项目:hue    文件:VeroRedshiftExpFormatter.java   
@Override
public String visitWindow(Window node, Void context)
{
    List<String> parts = new ArrayList<>();

    if (!node.getPartitionBy().isEmpty()) {
        parts.add("PARTITION BY " + joinExpressions(node.getPartitionBy()));
    }
    if (!node.getOrderBy().isEmpty()) {
        parts.add("ORDER BY " + formatSortItems(node.getOrderBy()));
    }
    if (node.getFrame().isPresent()) {
        parts.add(process(node.getFrame().get(), null));
    } else {
        if (!windowFunctionName.equalsIgnoreCase("rank")) {
            if (!node.getOrderBy().isEmpty()) {
                // Redshift needs to specify frame explicitly if there is order by and the function is not rank()
                FrameBound fb = new FrameBound(FrameBound.Type.UNBOUNDED_PRECEDING);
                WindowFrame wf = new WindowFrame(WindowFrame.Type.ROWS, fb, null);
                parts.add(process(wf, null));
            }
        }
    }

    return '(' + Joiner.on(' ').join(parts) + ')';
}
项目:presto-query-formatter    文件:ExpressionFormatter.java   
@Override
public String visitWindowFrame(WindowFrame node, StackableAstVisitorContext<Integer> indent)
{
    StringBuilder builder = new StringBuilder();

    builder.append(node.getType().toString()).append(' ');

    if (node.getEnd().isPresent()) {
        builder.append("BETWEEN ")
                .append(process(node.getStart(), indent))
                .append(" AND ")
                .append(process(node.getEnd().get(), indent));
    }
    else {
        builder.append(process(node.getStart(), indent));
    }

    return builder.toString();
}
项目:presto    文件:AggregationAnalyzer.java   
@Override
public Boolean visitWindowFrame(WindowFrame node, Void context)
{
    Optional<Expression> start = node.getStart().getValue();
    if (start.isPresent()) {
        if (!process(start.get(), context)) {
            throw new SemanticException(MUST_BE_AGGREGATE_OR_GROUP_BY, start.get(), "Window frame start must be an aggregate expression or appear in GROUP BY clause");
        }
    }
    if (node.getEnd().isPresent() && node.getEnd().get().getValue().isPresent()) {
        Expression endValue = node.getEnd().get().getValue().get();
        if (!process(endValue, context)) {
            throw new SemanticException(MUST_BE_AGGREGATE_OR_GROUP_BY, endValue, "Window frame end must be an aggregate expression or appear in GROUP BY clause");
        }
    }

    return true;
}
项目:presto    文件:ExpressionFormatter.java   
@Override
public String visitWindowFrame(WindowFrame node, Boolean unmangleNames)
{
    StringBuilder builder = new StringBuilder();

    builder.append(node.getType().toString()).append(' ');

    if (node.getEnd().isPresent()) {
        builder.append("BETWEEN ")
                .append(process(node.getStart(), unmangleNames))
                .append(" AND ")
                .append(process(node.getEnd().get(), unmangleNames));
    }
    else {
        builder.append(process(node.getStart(), unmangleNames));
    }

    return builder.toString();
}
项目:EchoQuery    文件:ExpressionFormatter.java   
@Override
public String visitWindowFrame(WindowFrame node, Boolean unmangleNames)
{
    StringBuilder builder = new StringBuilder();

    builder.append(node.getType().toString()).append(' ');

    if (node.getEnd().isPresent()) {
        builder.append("BETWEEN ")
                .append(process(node.getStart(), unmangleNames))
                .append(" AND ")
                .append(process(node.getEnd().get(), unmangleNames));
    }
    else {
        builder.append(process(node.getStart(), unmangleNames));
    }

    return builder.toString();
}
项目:presto    文件:FrameInfo.java   
public FrameInfo(
        WindowFrame.Type type,
        FrameBound.Type startType,
        Optional<Integer> startChannel,
        FrameBound.Type endType,
        Optional<Integer> endChannel)
{
    this.type = requireNonNull(type, "type is null");
    this.startType = requireNonNull(startType, "startType is null");
    this.startChannel = requireNonNull(startChannel, "startChannel is null").orElse(-1);
    this.endType = requireNonNull(endType, "endType is null");
    this.endChannel = requireNonNull(endChannel, "endChannel is null").orElse(-1);
}
项目:presto    文件:WindowNode.java   
@JsonCreator
public Frame(
        @JsonProperty("type") WindowFrame.Type type,
        @JsonProperty("startType") FrameBound.Type startType,
        @JsonProperty("startValue") Optional<Symbol> startValue,
        @JsonProperty("endType") FrameBound.Type endType,
        @JsonProperty("endValue") Optional<Symbol> endValue)
{
    this.startType = requireNonNull(startType, "startType is null");
    this.startValue = requireNonNull(startValue, "startValue is null");
    this.endType = requireNonNull(endType, "endType is null");
    this.endValue = requireNonNull(endValue, "endValue is null");
    this.type = requireNonNull(type, "type is null");
}
项目:presto    文件:StatementAnalyzer.java   
private static void analyzeWindowFrame(WindowFrame frame)
{
    FrameBound.Type startType = frame.getStart().getType();
    FrameBound.Type endType = frame.getEnd().orElse(new FrameBound(CURRENT_ROW)).getType();

    if (startType == UNBOUNDED_FOLLOWING) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame start cannot be UNBOUNDED FOLLOWING");
    }
    if (endType == UNBOUNDED_PRECEDING) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame end cannot be UNBOUNDED PRECEDING");
    }
    if ((startType == CURRENT_ROW) && (endType == PRECEDING)) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from CURRENT ROW cannot end with PRECEDING");
    }
    if ((startType == FOLLOWING) && (endType == PRECEDING)) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from FOLLOWING cannot end with PRECEDING");
    }
    if ((startType == FOLLOWING) && (endType == CURRENT_ROW)) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from FOLLOWING cannot end with CURRENT ROW");
    }
    if ((frame.getType() == RANGE) && ((startType == PRECEDING) || (endType == PRECEDING))) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame RANGE PRECEDING is only supported with UNBOUNDED");
    }
    if ((frame.getType() == RANGE) && ((startType == FOLLOWING) || (endType == FOLLOWING))) {
        throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame RANGE FOLLOWING is only supported with UNBOUNDED");
    }
}
项目:presto    文件:TestEffectivePredicateExtractor.java   
@Test
public void testWindow()
        throws Exception
{
    PlanNode node = new WindowNode(newId(),
            filter(baseTableScan,
                    and(
                            equals(AE, BE),
                            equals(BE, CE),
                            lessThan(CE, number(10)))),
            ImmutableList.of(A),
            ImmutableList.of(A),
            ImmutableMap.of(A, SortOrder.ASC_NULLS_LAST),
            new WindowNode.Frame(WindowFrame.Type.RANGE,
                    FrameBound.Type.UNBOUNDED_PRECEDING, Optional.empty(),
                    FrameBound.Type.CURRENT_ROW, Optional.empty()),
            ImmutableMap.<Symbol, FunctionCall>of(),
            ImmutableMap.<Symbol, Signature>of(),
            Optional.empty(),
            ImmutableSet.of(),
            0);

    Expression effectivePredicate = EffectivePredicateExtractor.extract(node, TYPES);

    // Pass through
    Assert.assertEquals(normalizeConjuncts(effectivePredicate),
            normalizeConjuncts(
                    equals(AE, BE),
                    equals(BE, CE),
                    lessThan(CE, number(10))));
}
项目:presto    文件:AstBuilder.java   
@Override
public Node visitOver(SqlBaseParser.OverContext context)
{
    return new Window(
            getLocation(context),
            visit(context.partition, Expression.class),
            visit(context.sortItem(), SortItem.class),
            visitIfPresent(context.windowFrame(), WindowFrame.class));
}
项目:presto    文件:AstBuilder.java   
@Override
public Node visitWindowFrame(SqlBaseParser.WindowFrameContext context)
{
    return new WindowFrame(
            getLocation(context),
            getFrameType(context.frameType),
            (FrameBound) visit(context.start),
            visitIfPresent(context.end, FrameBound.class));
}
项目:presto    文件:AstBuilder.java   
private static WindowFrame.Type getFrameType(Token type)
{
    switch (type.getType()) {
        case SqlBaseLexer.RANGE:
            return WindowFrame.Type.RANGE;
        case SqlBaseLexer.ROWS:
            return WindowFrame.Type.ROWS;
    }

    throw new IllegalArgumentException("Unsupported frame type: " + type.getText());
}
项目:presto    文件:FrameInfo.java   
public WindowFrame.Type getType()
{
    return type;
}
项目:presto    文件:WindowNode.java   
@JsonProperty
public WindowFrame.Type getType()
{
    return type;
}