@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; }
@Override public Cost getCost() { Double inputBytes = this.getDelegate().accept(new ByteCountVisitor()); Double outputBytes = this.accept(new ByteCountVisitor()); if (inputBytes == null || outputBytes == null) { return Cost.UNKNOWN; } int parallelLevel = CostUtil.estimateParallelLevel( false, context.getConnection().getQueryServices()); Cost cost = new Cost(0, 0, 0); if (!orderBy.getOrderByExpressions().isEmpty()) { Cost orderByCost = CostUtil.estimateOrderByCost(inputBytes, outputBytes, parallelLevel); cost = cost.plus(orderByCost); } return super.getCost().plus(cost); }
@Override public Double visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
? new ClientAggregatePlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, groupBy, having, plan) : new ClientScanPlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, plan);
SortMergeJoinPlan sortMergeJoinPlan=(SortMergeJoinPlan)((ClientScanPlan)queryPlan).getDelegate(); OrderBy orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); ScanPlan innerScanPlan=(ScanPlan)((TupleProjectionPlan)lhsOuterPlan.getDelegate()).getDelegate(); orderBy=innerScanPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); orderBy=rhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("BID")); innerScanPlan=(ScanPlan)((TupleProjectionPlan)rhsOuterPlan.getDelegate()).getDelegate(); orderBy=innerScanPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); sortMergeJoinPlan=(SortMergeJoinPlan)((ClientScanPlan)queryPlan).getDelegate(); orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); AggregatePlan innerAggregatePlan=(AggregatePlan)((TupleProjectionPlan)lhsOuterPlan.getDelegate()).getDelegate(); orderBy=innerAggregatePlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); orderBy=rhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("BID")); innerAggregatePlan=(AggregatePlan)((TupleProjectionPlan)rhsOuterPlan.getDelegate()).getDelegate();
@Override public List<QueryPlan> visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
private void testCorrelatePlan(Object[][] leftRelation, Object[][] rightRelation, int leftCorrelColumn, int rightCorrelColumn, JoinType type, Object[][] expectedResult, Integer offset) throws SQLException { TableRef leftTable = createProjectedTableFromLiterals(leftRelation[0]); TableRef rightTable = createProjectedTableFromLiterals(rightRelation[0]); String varName = "$cor0"; RuntimeContext runtimeContext = new RuntimeContextImpl(); runtimeContext.defineCorrelateVariable(varName, leftTable); QueryPlan leftPlan = newLiteralResultIterationPlan(leftRelation, offset); QueryPlan rightPlan = newLiteralResultIterationPlan(rightRelation, offset); Expression columnExpr = new ColumnRef(rightTable, rightCorrelColumn).newColumnExpression(); Expression fieldAccess = new CorrelateVariableFieldAccessExpression(runtimeContext, varName, new ColumnRef(leftTable, leftCorrelColumn).newColumnExpression()); Expression filter = ComparisonExpression.create(CompareOp.EQUAL, Arrays.asList(columnExpr, fieldAccess), CONTEXT.getTempPtr(), false); rightPlan = new ClientScanPlan(CONTEXT, SelectStatement.SELECT_ONE, rightTable, RowProjector.EMPTY_PROJECTOR, null, null, filter, OrderBy.EMPTY_ORDER_BY, rightPlan); PTable joinedTable = JoinCompiler.joinProjectedTables(leftTable.getTable(), rightTable.getTable(), type); CorrelatePlan correlatePlan = new CorrelatePlan(leftPlan, rightPlan, varName, type, false, runtimeContext, joinedTable, leftTable.getTable(), rightTable.getTable(), leftTable.getTable().getColumns().size()); ResultIterator iter = correlatePlan.iterator(); ImmutableBytesWritable ptr = new ImmutableBytesWritable(); for (Object[] row : expectedResult) { Tuple next = iter.next(); assertNotNull(next); for (int i = 0; i < row.length; i++) { PColumn column = joinedTable.getColumns().get(i); boolean eval = new ProjectedColumnExpression(column, joinedTable, column.getName().getString()).evaluate(next, ptr); Object o = eval ? column.getDataType().toObject(ptr) : null; assertEquals(row[i], o); } } }
@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; }
@Override public Cost getCost() { Double inputBytes = this.getDelegate().accept(new ByteCountVisitor()); Double outputBytes = this.accept(new ByteCountVisitor()); if (inputBytes == null || outputBytes == null) { return Cost.UNKNOWN; } int parallelLevel = CostUtil.estimateParallelLevel( false, context.getConnection().getQueryServices()); Cost cost = new Cost(0, 0, 0); if (!orderBy.getOrderByExpressions().isEmpty()) { Cost orderByCost = CostUtil.estimateOrderByCost(inputBytes, outputBytes, parallelLevel); cost = cost.plus(orderByCost); } return super.getCost().plus(cost); }
@Override public Double visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
? new ClientAggregatePlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, groupBy, having, plan) : new ClientScanPlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, plan);
@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; }
@Override public Cost getCost() { Double inputBytes = this.getDelegate().accept(new ByteCountVisitor()); Double outputBytes = this.accept(new ByteCountVisitor()); if (inputBytes == null || outputBytes == null) { return Cost.UNKNOWN; } int parallelLevel = CostUtil.estimateParallelLevel( false, context.getConnection().getQueryServices()); Cost cost = new Cost(0, 0, 0); if (!orderBy.getOrderByExpressions().isEmpty()) { Cost orderByCost = CostUtil.estimateOrderByCost(inputBytes, outputBytes, parallelLevel); cost = cost.plus(orderByCost); } return super.getCost().plus(cost); }
@Override public Double visit(ClientScanPlan plan) { return plan.getDelegate().accept(this); }
? new ClientAggregatePlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, groupBy, having, plan) : new ClientScanPlan(context, planSelect, tableRef, projector, limit, offset, where, orderBy, plan);