/** * {@inheritDoc} * * <p>In the case of semi-join, the row type consists of columns from left * input only. */ @Override public RelDataType deriveRowType() { return SqlValidatorUtil.deriveJoinRowType( left.getRowType(), null, JoinRelType.INNER, getCluster().getTypeFactory(), null, ImmutableList.of()); } }
/** * {@inheritDoc} * * <p>In the case of semi-join, the row type consists of columns from left * input only. */ @Override public RelDataType deriveRowType() { return SqlValidatorUtil.deriveJoinRowType( left.getRowType(), null, JoinRelType.INNER, getCluster().getTypeFactory(), null, ImmutableList.of()); } }
@Override public SemiJoin copy(RelTraitSet traitSet, RexNode condition, RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { assert joinType == JoinRelType.INNER; final JoinInfo joinInfo = JoinInfo.of(left, right, condition); assert joinInfo.isEqui(); return new SemiJoin(getCluster(), traitSet, left, right, condition, joinInfo.leftKeys, joinInfo.rightKeys); }
@Override public SemiJoin copy(RelTraitSet traitSet, RexNode condition, RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { assert joinType == JoinRelType.INNER; final JoinInfo joinInfo = JoinInfo.of(left, right, condition); assert joinInfo.isEqui(); return new SemiJoin(getCluster(), traitSet, left, right, condition, joinInfo.leftKeys, joinInfo.rightKeys); }
/** * Creates a RexNode that stores a selectivity value corresponding to the * selectivity of a semijoin. This can be added to a filter to simulate the * effect of the semijoin during costing, but should never appear in a real * plan since it has no physical implementation. * * @param rel the semijoin of interest * @return constructed rexnode */ public static RexNode makeSemiJoinSelectivityRexNode(RelMetadataQuery mq, SemiJoin rel) { RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); double selectivity = computeSemiJoinSelectivity(mq, rel.getLeft(), rel.getRight(), rel); return rexBuilder.makeCall(ARTIFICIAL_SELECTIVITY_FUNC, rexBuilder.makeApproxLiteral(new BigDecimal(selectivity))); }
/** * Creates a RexNode that stores a selectivity value corresponding to the * selectivity of a semijoin. This can be added to a filter to simulate the * effect of the semijoin during costing, but should never appear in a real * plan since it has no physical implementation. * * @param rel the semijoin of interest * @return constructed rexnode */ public static RexNode makeSemiJoinSelectivityRexNode(RelMetadataQuery mq, SemiJoin rel) { RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); double selectivity = computeSemiJoinSelectivity(mq, rel.getLeft(), rel.getRight(), rel); return rexBuilder.makeCall(ARTIFICIAL_SELECTIVITY_FUNC, rexBuilder.makeApproxLiteral(new BigDecimal(selectivity))); }
public Double getSelectivity(SemiJoin rel, RelMetadataQuery mq, RexNode predicate) { // create a RexNode representing the selectivity of the // semijoin filter and pass it to getSelectivity RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); RexNode newPred = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); if (predicate != null) { newPred = rexBuilder.makeCall( SqlStdOperatorTable.AND, newPred, predicate); } return mq.getSelectivity(rel.getLeft(), newPred); }
public Double getSelectivity(SemiJoin rel, RelMetadataQuery mq, RexNode predicate) { // create a RexNode representing the selectivity of the // semijoin filter and pass it to getSelectivity RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); RexNode newPred = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); if (predicate != null) { newPred = rexBuilder.makeCall( SqlStdOperatorTable.AND, newPred, predicate); } return mq.getSelectivity(rel.getLeft(), newPred); }
public Double getDistinctRowCount(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { if (predicate == null || predicate.isAlwaysTrue()) { if (groupKey.isEmpty()) { return 1D; } } // create a RexNode representing the selectivity of the // semijoin filter and pass it to getDistinctRowCount RexNode newPred = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); if (predicate != null) { RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); newPred = rexBuilder.makeCall( SqlStdOperatorTable.AND, newPred, predicate); } return mq.getDistinctRowCount(rel.getLeft(), groupKey, newPred); }
public Double getDistinctRowCount(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { if (predicate == null || predicate.isAlwaysTrue()) { if (groupKey.isEmpty()) { return 1D; } } // create a RexNode representing the selectivity of the // semijoin filter and pass it to getDistinctRowCount RexNode newPred = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); if (predicate != null) { RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); newPred = rexBuilder.makeCall( SqlStdOperatorTable.AND, newPred, predicate); } return mq.getDistinctRowCount(rel.getLeft(), groupKey, newPred); }
OpAttr dispatch(RelNode rn) throws SemanticException { if (rn instanceof HiveTableScan) { return visit((HiveTableScan) rn); } else if (rn instanceof HiveProject) { return visit((HiveProject) rn); } else if (rn instanceof MultiJoin) { return visit((MultiJoin) rn); } else if (rn instanceof HiveJoin) { return visit((HiveJoin) rn); } else if (rn instanceof SemiJoin) { SemiJoin sj = (SemiJoin) rn; HiveJoin hj = HiveJoin.getJoin(sj.getCluster(), sj.getLeft(), sj.getRight(), sj.getCondition(), sj.getJoinType(), true); return visit(hj); } else if (rn instanceof HiveFilter) { return visit((HiveFilter) rn); } else if (rn instanceof HiveSort) { return visit((HiveSort) rn); } else if (rn instanceof HiveUnion) { return visit((HiveUnion) rn); } else if (rn instanceof HiveSortExchange) { return visit((HiveSortExchange) rn); } else if (rn instanceof HiveAggregate) { return visit((HiveAggregate) rn); } LOG.error(rn.getClass().getCanonicalName() + "operator translation not supported" + " yet in return path."); return null; }
semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments)); semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments));
semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments)); semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments));
semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments)); semiJoin.getCondition().accept( new RelOptUtil.RexInputConverter( semiJoin.getCluster().getRexBuilder(), fields, adjustments));