@Override public Double visit(SortMergeJoinPlan plan) { Double lhsWidth = plan.getLhsPlan().accept(this); Double rhsWidth = plan.getRhsPlan().accept(this); if (lhsWidth == null || rhsWidth == null) { return null; } return join(lhsWidth, rhsWidth, plan.getJoinType()); }
public SortMergeJoinPlan(StatementContext context, FilterableStatement statement, TableRef table, JoinType type, QueryPlan lhsPlan, QueryPlan rhsPlan, List<Expression> lhsKeyExpressions, List<Expression> rhsKeyExpressions, PTable joinedTable, PTable lhsTable, PTable rhsTable, int rhsFieldPosition, boolean isSingleValueOnly) { if (type == JoinType.Right) throw new IllegalArgumentException("JoinType should not be " + type); this.context = context; this.statement = statement; this.table = table; this.type = type; this.lhsPlan = lhsPlan; this.rhsPlan = rhsPlan; this.lhsKeyExpressions = lhsKeyExpressions; this.rhsKeyExpressions = rhsKeyExpressions; this.joinedSchema = buildSchema(joinedTable); this.lhsSchema = buildSchema(lhsTable); this.rhsSchema = buildSchema(rhsTable); this.rhsFieldPosition = rhsFieldPosition; this.isSingleValueOnly = isSingleValueOnly; this.tableRefs = Sets.newHashSetWithExpectedSize(lhsPlan.getSourceRefs().size() + rhsPlan.getSourceRefs().size()); this.tableRefs.addAll(lhsPlan.getSourceRefs()); this.tableRefs.addAll(rhsPlan.getSourceRefs()); this.thresholdBytes = context.getConnection().getQueryServices().getProps().getInt( QueryServices.SPOOL_THRESHOLD_BYTES_ATTRIB, QueryServicesOptions.DEFAULT_SPOOL_THRESHOLD_BYTES); }
@Override public Long getEstimatedRowsToScan() throws SQLException { if (!getEstimatesCalled) { getEstimates(); } return estimatedRows; }
@Override public List<QueryPlan> visit(SortMergeJoinPlan plan) { return Lists.newArrayList(plan.getLhsPlan(), plan.getRhsPlan()); }
@Override public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException { return iterator(scanGrouper, null); }
@Override public Cost getCost() { Double byteCount = this.accept(new ByteCountVisitor()); if (byteCount == null) { return Cost.UNKNOWN; } Cost cost = new Cost(0, 0, byteCount); return cost.plus(lhsPlan.getCost()).plus(rhsPlan.getCost()); }
StatementContext subCtx = new StatementContext(statement, resolver, ScanUtil.newScan(originalScan), new SequenceManager(statement)); subCtx.setCurrentTable(tableRef); QueryPlan innerPlan = new SortMergeJoinPlan(subCtx, joinTable.getStatement(), tableRef, type == JoinType.Right ? JoinType.Left : type, lhsPlan, rhsPlan, lhsKeyExpressions, rhsKeyExpressions, projectedTable, lhsProjTable, needsMerge ? rhsProjTable : null, fieldPosition, lastJoinSpec.isSingleValueOnly()); context.setCurrentTable(tableRef); context.setResolver(resolver);
ClientScanPlan lhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getLhsPlan())).getDelegate(); OrderBy orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); ClientScanPlan rhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getRhsPlan())).getDelegate(); orderBy=rhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); lhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getLhsPlan())).getDelegate(); orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); rhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getRhsPlan())).getDelegate(); orderBy=rhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); lhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getLhsPlan())).getDelegate(); orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); rhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getRhsPlan())).getDelegate(); orderBy=rhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); lhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getLhsPlan())).getDelegate(); orderBy=lhsOuterPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); rhsOuterPlan=(ClientScanPlan)((TupleProjectionPlan)(sortMergeJoinPlan.getRhsPlan())).getDelegate();
@Override public ResultIterator iterator() throws SQLException { return iterator(DefaultParallelScanGrouper.getInstance()); }
@Override public Cost getCost() { Double byteCount = this.accept(new ByteCountVisitor()); if (byteCount == null) { return Cost.UNKNOWN; } Cost cost = new Cost(0, 0, byteCount); return cost.plus(lhsPlan.getCost()).plus(rhsPlan.getCost()); }
StatementContext subCtx = new StatementContext(statement, resolver, ScanUtil.newScan(originalScan), new SequenceManager(statement)); subCtx.setCurrentTable(tableRef); QueryPlan innerPlan = new SortMergeJoinPlan(subCtx, joinTable.getStatement(), tableRef, type == JoinType.Right ? JoinType.Left : type, lhsPlan, rhsPlan, lhsKeyExpressions, rhsKeyExpressions, projectedTable, lhsProjTable, needsMerge ? rhsProjTable : null, fieldPosition, lastJoinSpec.isSingleValueOnly()); context.setCurrentTable(tableRef); context.setResolver(resolver);
@Override public Double visit(SortMergeJoinPlan plan) { Double lhsRows = plan.getLhsPlan().accept(this); Double rhsRows = plan.getRhsPlan().accept(this); if (lhsRows != null && rhsRows != null) { return join(lhsRows, rhsRows, plan.getJoinType()); } return null; }
@Override public Long getEstimatedBytesToScan() throws SQLException { if (!getEstimatesCalled) { getEstimates(); } return estimatedBytes; }
@Override public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException { return iterator(scanGrouper, null); }
@Override public Cost getCost() { Double byteCount = this.accept(new ByteCountVisitor()); if (byteCount == null) { return Cost.UNKNOWN; } Cost cost = new Cost(0, 0, byteCount); return cost.plus(lhsPlan.getCost()).plus(rhsPlan.getCost()); }
public SortMergeJoinPlan(StatementContext context, FilterableStatement statement, TableRef table, JoinType type, QueryPlan lhsPlan, QueryPlan rhsPlan, List<Expression> lhsKeyExpressions, List<Expression> rhsKeyExpressions, PTable joinedTable, PTable lhsTable, PTable rhsTable, int rhsFieldPosition, boolean isSingleValueOnly) { if (type == JoinType.Right) throw new IllegalArgumentException("JoinType should not be " + type); this.context = context; this.statement = statement; this.table = table; this.type = type; this.lhsPlan = lhsPlan; this.rhsPlan = rhsPlan; this.lhsKeyExpressions = lhsKeyExpressions; this.rhsKeyExpressions = rhsKeyExpressions; this.joinedSchema = buildSchema(joinedTable); this.lhsSchema = buildSchema(lhsTable); this.rhsSchema = buildSchema(rhsTable); this.rhsFieldPosition = rhsFieldPosition; this.isSingleValueOnly = isSingleValueOnly; this.tableRefs = Sets.newHashSetWithExpectedSize(lhsPlan.getSourceRefs().size() + rhsPlan.getSourceRefs().size()); this.tableRefs.addAll(lhsPlan.getSourceRefs()); this.tableRefs.addAll(rhsPlan.getSourceRefs()); this.thresholdBytes = context.getConnection().getQueryServices().getProps().getInt( QueryServices.SPOOL_THRESHOLD_BYTES_ATTRIB, QueryServicesOptions.DEFAULT_SPOOL_THRESHOLD_BYTES); }
StatementContext subCtx = new StatementContext(statement, resolver, ScanUtil.newScan(originalScan), new SequenceManager(statement)); subCtx.setCurrentTable(tableRef); QueryPlan innerPlan = new SortMergeJoinPlan(subCtx, joinTable.getStatement(), tableRef, type == JoinType.Right ? JoinType.Left : type, lhsPlan, rhsPlan, lhsKeyExpressions, rhsKeyExpressions, projectedTable, lhsProjTable, needsMerge ? rhsProjTable : null, fieldPosition, lastJoinSpec.isSingleValueOnly()); context.setCurrentTable(tableRef); context.setResolver(resolver);
@Override public Double visit(SortMergeJoinPlan plan) { Double lhsRows = plan.getLhsPlan().accept(this); Double rhsRows = plan.getRhsPlan().accept(this); if (lhsRows != null && rhsRows != null) { return join(lhsRows, rhsRows, plan.getJoinType()); } return null; }
@Override public Long getEstimateInfoTimestamp() throws SQLException { if (!getEstimatesCalled) { getEstimates(); } return estimateInfoTs; }
@Override public ResultIterator iterator(ParallelScanGrouper scanGrouper) throws SQLException { return iterator(scanGrouper, null); }