private PlanNode getSyntacticOrderJoin(JoinNode joinNode, Context context, JoinDistributionType joinDistributionType) { if (mustPartition(joinNode)) { return joinNode.withDistributionType(PARTITIONED); } if (mustReplicate(joinNode, context)) { return joinNode.withDistributionType(REPLICATED); } if (joinDistributionType.canPartition()) { return joinNode.withDistributionType(PARTITIONED); } return joinNode.withDistributionType(REPLICATED); }
private List<JoinEnumerationResult> getPossibleJoinNodes(JoinNode joinNode, DistributionType distributionType) { return ImmutableList.of( createJoinEnumerationResult(joinNode.withDistributionType(distributionType)), createJoinEnumerationResult(joinNode.flipChildren().withDistributionType(distributionType))); }
private void addJoinsWithDifferentDistributions(JoinNode joinNode, List<PlanNodeWithCost> possibleJoinNodes, Context context) { if (!mustPartition(joinNode) && canReplicate(joinNode, context)) { possibleJoinNodes.add(getJoinNodeWithCost(context, joinNode.withDistributionType(REPLICATED))); } if (!mustReplicate(joinNode, context)) { possibleJoinNodes.add(getJoinNodeWithCost(context, joinNode.withDistributionType(PARTITIONED))); } }
private JoinEnumerationResult setJoinNodeProperties(JoinNode joinNode) { // TODO avoid stat (but not cost) recalculation for all considered (distribution,flip) pairs, since resulting relation is the same in all case if (isAtMostScalar(joinNode.getRight(), lookup)) { return createJoinEnumerationResult(joinNode.withDistributionType(REPLICATED)); } if (isAtMostScalar(joinNode.getLeft(), lookup)) { return createJoinEnumerationResult(joinNode.flipChildren().withDistributionType(REPLICATED)); } List<JoinEnumerationResult> possibleJoinNodes = getPossibleJoinNodes(joinNode, getJoinDistributionType(session)); verify(!possibleJoinNodes.isEmpty(), "possibleJoinNodes is empty"); if (possibleJoinNodes.stream().anyMatch(UNKNOWN_COST_RESULT::equals)) { return UNKNOWN_COST_RESULT; } return resultComparator.min(possibleJoinNodes); }