@Override public Double visit(UnnestArrayPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(CorrelatePlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(CorrelatePlan plan) { Double lhsRows = plan.getDelegate().accept(this); if (lhsRows != null) { return lhsRows * SEMI_OR_ANTI_JOIN_FACTOR; } return null; }
@Override public Double visit(CursorFetchPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(CursorFetchPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(ClientAggregatePlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(TupleProjectionPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(TupleProjectionPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(UnnestArrayPlan plan) { return plan.getDelegate().accept(this); }
@Override public Double visit(UnionPlan plan) { Double sum = 0.0; for (QueryPlan subPlan : plan.getSubPlans()) { Double avgWidth = subPlan.accept(this); if (avgWidth == null) { return null; } sum += avgWidth; } return sum / plan.getSubPlans().size(); }
@Override public Double visit(UnionPlan plan) { int count = plan.getSubPlans().size(); double[] inputRows = new double[count]; for (int i = 0; i < count; i++) { Double b = plan.getSubPlans().get(i).accept(this); if (b != null) { inputRows[i] = b.doubleValue(); } else { return null; } } return limit(union(true, inputRows),plan.getLimit()); }
@Override public List<QueryPlan> visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
@Override public List<QueryPlan> visit(TupleProjectionPlan plan) { return plan.getDelegate().accept(this); }
@Override public List<QueryPlan> visit(ClientAggregatePlan plan) { return plan.getDelegate().accept(this); }
@Override public Cost getCost() { Double lhsByteCount = delegate.accept(new ByteCountVisitor()); Double rhsRowCount = rhs.accept(new RowCountVisitor()); if (lhsByteCount == null || rhsRowCount == null) { return Cost.UNKNOWN; } Cost cost = new Cost(0, 0, lhsByteCount * rhsRowCount); Cost lhsCost = delegate.getCost(); return cost.plus(lhsCost).plus(rhs.getCost()); }
@Override public Double visit(ClientScanPlan plan) { if (plan.getLimit() != null) { return (double) plan.getLimit(); } Double b = plan.getDelegate().accept(this); if (b != null) { return limit( filter(b.doubleValue(), plan.getWhere()), plan.getLimit()); } return null; }