Search in sources :

Example 1 with Order

use of io.crate.planner.operators.Order in project crate by crate.

the class MoveOrderBeneathUnion method apply.

@Override
public LogicalPlan apply(Order order, Captures captures, TableStats tableStats, TransactionContext txnCtx, NodeContext nodeCtx) {
    Union union = captures.get(unionCapture);
    List<LogicalPlan> unionSources = union.sources();
    assert unionSources.size() == 2 : "A UNION must have exactly 2 unionSources";
    Order lhsOrder = updateSources(order, unionSources.get(0));
    Order rhsOrder = updateSources(order, unionSources.get(1));
    return union.replaceSources(List.of(lhsOrder, rhsOrder));
}
Also used : Order(io.crate.planner.operators.Order) LogicalPlan(io.crate.planner.operators.LogicalPlan) Union(io.crate.planner.operators.Union)

Example 2 with Order

use of io.crate.planner.operators.Order in project crate by crate.

the class MoveOrderBeneathRename method apply.

@Override
public LogicalPlan apply(Order plan, Captures captures, TableStats tableStats, TransactionContext txnCtx, NodeContext nodeCtx) {
    Rename rename = captures.get(renameCapture);
    Function<? super Symbol, ? extends Symbol> mapField = FieldReplacer.bind(rename::resolveField);
    OrderBy mappedOrderBy = plan.orderBy().map(mapField);
    if (rename.source().outputs().containsAll(mappedOrderBy.orderBySymbols())) {
        Order newOrder = new Order(rename.source(), mappedOrderBy);
        return rename.replaceSources(List.of(newOrder));
    } else {
        return null;
    }
}
Also used : OrderBy(io.crate.analyze.OrderBy) Order(io.crate.planner.operators.Order) Rename(io.crate.planner.operators.Rename)

Example 3 with Order

use of io.crate.planner.operators.Order in project crate by crate.

the class MoveOrderBeneathNestedLoop method apply.

@Override
public LogicalPlan apply(Order order, Captures captures, TableStats tableStats, TransactionContext txnCtx, NodeContext nodeCtx) {
    NestedLoopJoin nestedLoop = captures.get(nlCapture);
    Set<RelationName> relationsInOrderBy = Collections.newSetFromMap(new IdentityHashMap<>());
    Consumer<ScopedSymbol> gatherRelationsFromField = f -> relationsInOrderBy.add(f.relation());
    Consumer<Reference> gatherRelationsFromRef = r -> relationsInOrderBy.add(r.ident().tableIdent());
    OrderBy orderBy = order.orderBy();
    for (Symbol orderExpr : orderBy.orderBySymbols()) {
        FieldsVisitor.visitFields(orderExpr, gatherRelationsFromField);
        RefVisitor.visitRefs(orderExpr, gatherRelationsFromRef);
    }
    if (relationsInOrderBy.size() == 1) {
        RelationName relationInOrderBy = relationsInOrderBy.iterator().next();
        if (relationInOrderBy == nestedLoop.topMostLeftRelation().relationName()) {
            LogicalPlan lhs = nestedLoop.sources().get(0);
            LogicalPlan newLhs = order.replaceSources(List.of(lhs));
            return new NestedLoopJoin(newLhs, nestedLoop.sources().get(1), nestedLoop.joinType(), nestedLoop.joinCondition(), nestedLoop.isFiltered(), nestedLoop.topMostLeftRelation(), true, nestedLoop.isRewriteFilterOnOuterJoinToInnerJoinDone());
        }
    }
    return null;
}
Also used : TransactionContext(io.crate.metadata.TransactionContext) NodeContext(io.crate.metadata.NodeContext) LogicalPlan(io.crate.planner.operators.LogicalPlan) Captures(io.crate.planner.optimizer.matcher.Captures) IdentityHashMap(java.util.IdentityHashMap) RelationName(io.crate.metadata.RelationName) Reference(io.crate.metadata.Reference) Pattern(io.crate.planner.optimizer.matcher.Pattern) Set(java.util.Set) NestedLoopJoin(io.crate.planner.operators.NestedLoopJoin) Rule(io.crate.planner.optimizer.Rule) Consumer(java.util.function.Consumer) Order(io.crate.planner.operators.Order) RefVisitor(io.crate.expression.symbol.RefVisitor) List(java.util.List) OrderBy(io.crate.analyze.OrderBy) TableStats(io.crate.statistics.TableStats) Symbol(io.crate.expression.symbol.Symbol) Pattern.typeOf(io.crate.planner.optimizer.matcher.Pattern.typeOf) ScopedSymbol(io.crate.expression.symbol.ScopedSymbol) Patterns.source(io.crate.planner.optimizer.matcher.Patterns.source) Collections(java.util.Collections) FieldsVisitor(io.crate.expression.symbol.FieldsVisitor) Capture(io.crate.planner.optimizer.matcher.Capture) OrderBy(io.crate.analyze.OrderBy) Reference(io.crate.metadata.Reference) Symbol(io.crate.expression.symbol.Symbol) ScopedSymbol(io.crate.expression.symbol.ScopedSymbol) NestedLoopJoin(io.crate.planner.operators.NestedLoopJoin) RelationName(io.crate.metadata.RelationName) LogicalPlan(io.crate.planner.operators.LogicalPlan) ScopedSymbol(io.crate.expression.symbol.ScopedSymbol)

Aggregations

Order (io.crate.planner.operators.Order)3 OrderBy (io.crate.analyze.OrderBy)2 LogicalPlan (io.crate.planner.operators.LogicalPlan)2 FieldsVisitor (io.crate.expression.symbol.FieldsVisitor)1 RefVisitor (io.crate.expression.symbol.RefVisitor)1 ScopedSymbol (io.crate.expression.symbol.ScopedSymbol)1 Symbol (io.crate.expression.symbol.Symbol)1 NodeContext (io.crate.metadata.NodeContext)1 Reference (io.crate.metadata.Reference)1 RelationName (io.crate.metadata.RelationName)1 TransactionContext (io.crate.metadata.TransactionContext)1 NestedLoopJoin (io.crate.planner.operators.NestedLoopJoin)1 Rename (io.crate.planner.operators.Rename)1 Union (io.crate.planner.operators.Union)1 Rule (io.crate.planner.optimizer.Rule)1 Capture (io.crate.planner.optimizer.matcher.Capture)1 Captures (io.crate.planner.optimizer.matcher.Captures)1 Pattern (io.crate.planner.optimizer.matcher.Pattern)1 Pattern.typeOf (io.crate.planner.optimizer.matcher.Pattern.typeOf)1 Patterns.source (io.crate.planner.optimizer.matcher.Patterns.source)1