@Override public Double visit(HashJoinPlan plan) { Double lhsWidth = plan.getDelegate().accept(this); if (lhsWidth == null) { return null; } JoinTableNode.JoinType[] joinTypes = plan.getJoinInfo().getJoinTypes(); HashJoinPlan.SubPlan[] subPlans = plan.getSubPlans(); Double width = lhsWidth; for (int i = 0; i < joinTypes.length; i++) { Double rhsWidth = subPlans[i].getInnerPlan().accept(this); if (rhsWidth == null) { return null; } width = join(width, rhsWidth, joinTypes[i]); } return width; }
public static HashJoinPlan create(SelectStatement statement, QueryPlan plan, HashJoinInfo joinInfo, SubPlan[] subPlans) throws SQLException { if (!(plan instanceof HashJoinPlan)) return new HashJoinPlan(statement, plan, joinInfo, subPlans, joinInfo == null, Collections.<ImmutableBytesPtr,ServerCache>emptyMap()); HashJoinPlan hashJoinPlan = (HashJoinPlan) plan; assert (hashJoinPlan.joinInfo == null && hashJoinPlan.delegate instanceof BaseQueryPlan); SubPlan[] mergedSubPlans = new SubPlan[hashJoinPlan.subPlans.length + subPlans.length]; int i = 0; for (SubPlan subPlan : hashJoinPlan.subPlans) { mergedSubPlans[i++] = subPlan; } for (SubPlan subPlan : subPlans) { mergedSubPlans[i++] = subPlan; } return new HashJoinPlan(statement, hashJoinPlan.delegate, joinInfo, mergedSubPlans, true, hashJoinPlan.dependencies); }
@Override public Long getEstimatedRowsToScan() throws SQLException { if (!getEstimatesCalled) { getEstimates(); } return estimatedRows; }
@Override public List<QueryPlan> visit(HashJoinPlan plan) { List<QueryPlan> children = new ArrayList<QueryPlan>(plan.getSubPlans().length + 1); children.add(plan.getDelegate()); for (HashJoinPlan.SubPlan subPlan : plan.getSubPlans()) { children.add(subPlan.getInnerPlan()); } return children; }
parent.getContext().setSubqueryResult(select, result); return null; } finally {
PhoenixConnection connection = getContext().getConnection(); ConnectionQueryServices services = connection.getQueryServices(); ExecutorService executor = services.getExecutor(); return peekForPersistentCache(iterator, scanGrouper, scan); } else { return iterator;
subPlans[i++] = new WhereClauseSubPlan(compileSubquery(stmt, false), stmt, subqueryNode.expectSingleRow()); plan = HashJoinPlan.create(planSelect, plan, null, subPlans);
assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); innerScanPlan=(ScanPlan)((HashJoinPlan)((TupleProjectionPlan)lhsOuterPlan.getDelegate()).getDelegate()).getDelegate(); orderBy=innerScanPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); innerScanPlan=(ScanPlan)((HashJoinPlan)((TupleProjectionPlan)rhsOuterPlan.getDelegate()).getDelegate()).getDelegate(); orderBy=innerScanPlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); innerAggregatePlan=(AggregatePlan)((HashJoinPlan)((TupleProjectionPlan)lhsOuterPlan.getDelegate()).getDelegate()).getDelegate(); orderBy=innerAggregatePlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().size() == 1); assertTrue(orderBy.getOrderByExpressions().get(0).toString().equals("AID")); innerAggregatePlan=(AggregatePlan)((HashJoinPlan)((TupleProjectionPlan)rhsOuterPlan.getDelegate()).getDelegate()).getDelegate(); orderBy=innerAggregatePlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 1); innerAggregatePlan=(AggregatePlan)((HashJoinPlan)(((TupleProjectionPlan)sortMergeJoinPlan.getLhsPlan()).getDelegate())).getDelegate(); orderBy=innerAggregatePlan.getOrderBy(); assertTrue(orderBy.getOrderByExpressions().size() == 2); assertTrue(orderBy.getOrderByExpressions().size() == 1);
private ResultIterator peekForPersistentCache(ResultIterator iterator, ParallelScanGrouper scanGrouper, Scan scan) throws SQLException { // The persistent subquery is optimistic and assumes caches are present on region // servers. We verify that this is the case by peeking at one result. If there is // a cache missing exception, we retry the query with the persistent cache disabled // for that specific cache ID. PeekingResultIterator peeking = LookAheadResultIterator.wrap(iterator); try { peeking.peek(); } catch (Exception e) { try { throw ServerUtil.parseServerException(e); } catch (HashJoinCacheNotFoundException e2) { Long cacheId = e2.getCacheId(); if (delegate.getContext().getRetryingPersistentCache(cacheId)) { throw e2; } delegate.getContext().setRetryingPersistentCache(cacheId); return iterator(scanGrouper, scan); } } return peeking; }
ScanRanges ranges=plan.getContext().getScanRanges();
PhoenixConnection connection = getContext().getConnection(); ConnectionQueryServices services = connection.getQueryServices(); ExecutorService executor = services.getExecutor(); return peekForPersistentCache(iterator, scanGrouper, scan); } else { return iterator;
return HashJoinPlan.create(joinTable.getStatement(), plan, joinInfo, hashPlans); Pair<Expression, Expression> keyRangeExpressions = new Pair<Expression, Expression>(null, null); getKeyExpressionCombinations(keyRangeExpressions, context, joinTable.getStatement(), rhsTableRef, type, joinExpressions, hashExpressions); return HashJoinPlan.create(joinTable.getStatement(), rhsPlan, joinInfo, new HashSubPlan[]{new HashSubPlan(0, lhsPlan, hashExpressions, false, usePersistentCache, keyRangeExpressions.getFirst(), keyRangeExpressions.getSecond())});
private ResultIterator peekForPersistentCache(ResultIterator iterator, ParallelScanGrouper scanGrouper, Scan scan) throws SQLException { // The persistent subquery is optimistic and assumes caches are present on region // servers. We verify that this is the case by peeking at one result. If there is // a cache missing exception, we retry the query with the persistent cache disabled // for that specific cache ID. PeekingResultIterator peeking = LookAheadResultIterator.wrap(iterator); try { peeking.peek(); } catch (Exception e) { try { throw ServerUtil.parseServerException(e); } catch (HashJoinCacheNotFoundException e2) { Long cacheId = e2.getCacheId(); if (delegate.getContext().getRetryingPersistentCache(cacheId)) { throw e2; } delegate.getContext().setRetryingPersistentCache(cacheId); return iterator(scanGrouper, scan); } } return peeking; }
@Override public Double visit(HashJoinPlan plan) { try { QueryPlan lhsPlan = plan.getDelegate(); Long b = lhsPlan.getEstimatedRowsToScan(); if (b == null) { return null; } Double rows = filter(b.doubleValue(), stripSkipScanFilter(lhsPlan.getContext().getScan().getFilter())); JoinTableNode.JoinType[] joinTypes = plan.getJoinInfo().getJoinTypes(); HashJoinPlan.SubPlan[] subPlans = plan.getSubPlans(); for (int i = 0; i < joinTypes.length; i++) { Double rhsRows = subPlans[i].getInnerPlan().accept(this); if (rhsRows == null) { return null; } rows = join(rows, rhsRows.doubleValue(), joinTypes[i]); } if (lhsPlan instanceof AggregatePlan) { AggregatePlan aggPlan = (AggregatePlan) lhsPlan; rows = filter(aggregate(rows, aggPlan.getGroupBy()), aggPlan.getHaving()); } return limit(rows, lhsPlan.getLimit()); } catch (SQLException e) { } return null; }
true, getContext().getConnection().getQueryServices()); if (!delegate.getOrderBy().getOrderByExpressions().isEmpty()) { int parallelLevel2 = CostUtil.estimateParallelLevel( delegate instanceof ScanPlan, getContext().getConnection().getQueryServices()); Cost orderByCost = CostUtil.estimateOrderByCost( bytes, outputBytes, parallelLevel);
@Override public Long getEstimateInfoTimestamp() throws SQLException { if (!getEstimatesCalled) { getEstimates(); } return estimateInfoTs; }
subPlans[i++] = new WhereClauseSubPlan(compileSubquery(stmt, false), stmt, subqueryNode.expectSingleRow()); plan = HashJoinPlan.create(planSelect, plan, null, subPlans);
public static HashJoinPlan create(SelectStatement statement, QueryPlan plan, HashJoinInfo joinInfo, SubPlan[] subPlans) throws SQLException { if (!(plan instanceof HashJoinPlan)) return new HashJoinPlan(statement, plan, joinInfo, subPlans, joinInfo == null, Collections.<ImmutableBytesPtr,ServerCache>emptyMap()); HashJoinPlan hashJoinPlan = (HashJoinPlan) plan; assert (hashJoinPlan.joinInfo == null && hashJoinPlan.delegate instanceof BaseQueryPlan); SubPlan[] mergedSubPlans = new SubPlan[hashJoinPlan.subPlans.length + subPlans.length]; int i = 0; for (SubPlan subPlan : hashJoinPlan.subPlans) { mergedSubPlans[i++] = subPlan; } for (SubPlan subPlan : subPlans) { mergedSubPlans[i++] = subPlan; } return new HashJoinPlan(statement, hashJoinPlan.delegate, joinInfo, mergedSubPlans, true, hashJoinPlan.dependencies); }
@Override public Double visit(HashJoinPlan plan) { Double lhsWidth = plan.getDelegate().accept(this); if (lhsWidth == null) { return null; } JoinTableNode.JoinType[] joinTypes = plan.getJoinInfo().getJoinTypes(); HashJoinPlan.SubPlan[] subPlans = plan.getSubPlans(); Double width = lhsWidth; for (int i = 0; i < joinTypes.length; i++) { Double rhsWidth = subPlans[i].getInnerPlan().accept(this); if (rhsWidth == null) { return null; } width = join(width, rhsWidth, joinTypes[i]); } return width; }
parent.getContext().setSubqueryResult(select, result); return null; } finally {