private static double pkSelectivity(Join joinRel, RelMetadataQuery mq, boolean leftChild, RelNode child, double childRowCount) { if ((leftChild && joinRel.getJoinType().generatesNullsOnRight()) || (!leftChild && joinRel.getJoinType().generatesNullsOnLeft())) { return 1.0; } else { HiveTableScan tScan = EstimateUniqueKeys.getTableScan(child, true); if (tScan != null) { double tRowCount = mq.getRowCount(tScan); return childRowCount / tRowCount; } else { return 1.0; } } }
public String getType() { return type.name(); }
public Double getSelectivity(Join j, RelMetadataQuery mq, RexNode predicate) { if (j.getJoinType().equals(JoinRelType.INNER)) { return computeInnerJoinSelectivity(j, mq, predicate); } else if (j.getJoinType().equals(JoinRelType.LEFT) || j.getJoinType().equals(JoinRelType.RIGHT)) { double left = mq.getRowCount(j.getLeft()); double right = mq.getRowCount(j.getRight()); double product = left * right; double innerJoinSelectivity = computeInnerJoinSelectivity(j, mq, predicate); if (j.getJoinType().equals(JoinRelType.LEFT)) { return Math.max(innerJoinSelectivity, left/product); } return Math.max(innerJoinSelectivity, right/product); } return 1.0; }
joinType.generatesNullsOnRight();
if (joinType.generatesNullsOnLeft() && Strong.isNotTrue(filter, leftBitmap)) { joinType = joinType.cancelNullsOnLeft(); if (joinType.generatesNullsOnRight() && Strong.isNotTrue(filter, rightBitmap)) { joinType = joinType.cancelNullsOnRight();
@Override public void onMatch(RelOptRuleCall call) { Join join = call.rel(0); if (join.getJoinType().generatesNullsOnLeft()) { // "select * from emp right join dept" is not necessarily empty if // emp is empty return; } call.transformTo(call.builder().push(join).empty().build()); } };
SamzaSqlRelMessageJoinFunction(JoinRelType joinRelType, boolean isTablePosOnRight, List<Integer> streamFieldIds, List<String> streamFieldNames, List<String> tableFieldNames) { this.joinRelType = joinRelType; this.isTablePosOnRight = isTablePosOnRight; Validate.isTrue((joinRelType.compareTo(JoinRelType.LEFT) == 0 && isTablePosOnRight) || (joinRelType.compareTo(JoinRelType.RIGHT) == 0 && !isTablePosOnRight) || joinRelType.compareTo(JoinRelType.INNER) == 0); this.streamFieldIds = new ArrayList<>(streamFieldIds); this.tableFieldNames = new ArrayList<>(tableFieldNames); this.outFieldNames = new ArrayList<>(); if (isTablePosOnRight) { outFieldNames.addAll(streamFieldNames); } outFieldNames.addAll(tableFieldNames); if (!isTablePosOnRight) { outFieldNames.addAll(streamFieldNames); } }
joinType.generatesNullsOnRight();
if (joinType.generatesNullsOnLeft() && Strong.isNotTrue(filter, leftBitmap)) { joinType = joinType.cancelNullsOnLeft(); if (joinType.generatesNullsOnRight() && Strong.isNotTrue(filter, rightBitmap)) { joinType = joinType.cancelNullsOnRight();
@Override public void onMatch(RelOptRuleCall call) { Join join = call.rel(0); if (join.getJoinType().generatesNullsOnLeft()) { // "select * from emp right join dept" is not necessarily empty if // emp is empty return; } call.transformTo(call.builder().push(join).empty().build()); } };
SamzaSqlTableJoinFunction(JoinInputNode streamNode, JoinInputNode tableNode, JoinRelType joinRelType) { this.joinRelType = joinRelType; this.isTablePosOnRight = tableNode.isPosOnRight(); Validate.isTrue((joinRelType.compareTo(JoinRelType.LEFT) == 0 && isTablePosOnRight) || (joinRelType.compareTo(JoinRelType.RIGHT) == 0 && !isTablePosOnRight) || joinRelType.compareTo(JoinRelType.INNER) == 0); this.streamFieldIds = new ArrayList<>(streamNode.getKeyIds()); this.tableKeyIds = new ArrayList<>(tableNode.getKeyIds()); this.tableFieldNames = new ArrayList<>(tableNode.getFieldNames()); this.outFieldNames = new ArrayList<>(); if (isTablePosOnRight) { outFieldNames.addAll(streamNode.getFieldNames()); outFieldNames.addAll(tableFieldNames); } else { outFieldNames.addAll(tableFieldNames); outFieldNames.addAll(streamNode.getFieldNames()); } }
private static double pkSelectivity(Join joinRel, RelMetadataQuery mq, boolean leftChild, RelNode child, double childRowCount) { if ((leftChild && joinRel.getJoinType().generatesNullsOnRight()) || (!leftChild && joinRel.getJoinType().generatesNullsOnLeft())) { return 1.0; } else { HiveTableScan tScan = HiveRelMdUniqueKeys.getTableScan(child, true); if (tScan != null) { double tRowCount = mq.getRowCount(tScan); return childRowCount / tRowCount; } else { return 1.0; } } }
joinType.generatesNullsOnRight();
@Override public RelWriter explainTerms(RelWriter pw) { List<String> joinsString = new ArrayList<String>(); for (int i = 0; i < joinInputs.size(); i++) { final StringBuilder sb = new StringBuilder(); sb.append(joinInputs.get(i).left).append(" - ").append(joinInputs.get(i).right) .append(" : ").append(joinTypes.get(i).name()); joinsString.add(sb.toString()); } super.explainTerms(pw); for (Ord<RelNode> ord : Ord.zip(inputs)) { pw.input("input#" + ord.i, ord.e); } return pw.item("condition", condition) .item("joinsDescription", joinsString); }
public Double getSelectivity(Join j, RelMetadataQuery mq, RexNode predicate) { if (j.getJoinType().equals(JoinRelType.INNER)) { return computeInnerJoinSelectivity(j, mq, predicate); } else if (j.getJoinType().equals(JoinRelType.LEFT) || j.getJoinType().equals(JoinRelType.RIGHT)) { double left = mq.getRowCount(j.getLeft()); double right = mq.getRowCount(j.getRight()); double product = left * right; double innerJoinSelectivity = computeInnerJoinSelectivity(j, mq, predicate); if (j.getJoinType().equals(JoinRelType.LEFT)) { return Math.max(innerJoinSelectivity, left/product); } return Math.max(innerJoinSelectivity, right/product); } return 1.0; }
private void validateJoinQuery(LogicalJoin join, JoinInputNode.InputType inputTypeOnLeft, JoinInputNode.InputType inputTypeOnRight) { JoinRelType joinRelType = join.getJoinType(); if (joinRelType.compareTo(JoinRelType.INNER) != 0 && joinRelType.compareTo(JoinRelType.LEFT) != 0 && joinRelType.compareTo(JoinRelType.RIGHT) != 0) { throw new SamzaException("Query with only INNER and LEFT/RIGHT OUTER join are supported."); } boolean isTablePosOnLeft = (inputTypeOnLeft != JoinInputNode.InputType.STREAM); boolean isTablePosOnRight = (inputTypeOnRight != JoinInputNode.InputType.STREAM); if (!isTablePosOnLeft && !isTablePosOnRight) { throw new SamzaException("Invalid query with both sides of join being denoted as 'stream'. " + "Stream-stream join is not yet supported. " + dumpRelPlanForNode(join)); } if (isTablePosOnLeft && isTablePosOnRight) { throw new SamzaException("Invalid query with both sides of join being denoted as 'table'. " + dumpRelPlanForNode(join)); } if (joinRelType.compareTo(JoinRelType.LEFT) == 0 && isTablePosOnLeft && !isTablePosOnRight) { throw new SamzaException("Invalid query for outer left join. Left side of the join should be a 'stream' and " + "right side of join should be a 'table'. " + dumpRelPlanForNode(join)); } if (joinRelType.compareTo(JoinRelType.RIGHT) == 0 && isTablePosOnRight && !isTablePosOnLeft) { throw new SamzaException("Invalid query for outer right join. Left side of the join should be a 'table' and " + "right side of join should be a 'stream'. " + dumpRelPlanForNode(join)); } validateJoinCondition(join.getCondition()); }
&& rightUnique && (leftSet != null) && !(rel.getJoinType().generatesNullsOnLeft())) { retSet.addAll(leftSet); && leftUnique && (rightSet != null) && !(rel.getJoinType().generatesNullsOnRight())) { retSet.addAll(rightSet);