@Override public List<Double> averageColumnSizes(SemiJoin rel, RelMetadataQuery mq) { final RelNode left = rel.getLeft(); final List<Double> lefts = mq.getAverageColumnSizes(left); if (lefts == null) { return null; } final int fieldCount = rel.getRowType().getFieldCount(); Double[] sizes = new Double[fieldCount]; if (lefts != null) { lefts.toArray(sizes); } return ImmutableNullableList.copyOf(sizes); }
/** * Computes the selectivity of a semijoin filter if it is applied on a fact * table. The computation is based on the selectivity of the dimension * table/columns and the number of distinct values in the fact table * columns. * * @param rel semijoin rel * @return calculated selectivity */ public static double computeSemiJoinSelectivity(RelMetadataQuery mq, SemiJoin rel) { return computeSemiJoinSelectivity(mq, rel.getLeft(), rel.getRight(), rel.getLeftKeys(), rel.getRightKeys()); }
@Override public List<Double> averageColumnSizes(SemiJoin rel, RelMetadataQuery mq) { final RelNode left = rel.getLeft(); final List<Double> lefts = mq.getAverageColumnSizes(left); if (lefts == null) { return null; } final int fieldCount = rel.getRowType().getFieldCount(); Double[] sizes = new Double[fieldCount]; if (lefts != null) { lefts.toArray(sizes); } return ImmutableNullableList.copyOf(sizes); }
/** * Computes the selectivity of a semijoin filter if it is applied on a fact * table. The computation is based on the selectivity of the dimension * table/columns and the number of distinct values in the fact table * columns. * * @param rel semijoin rel * @return calculated selectivity */ public static double computeSemiJoinSelectivity(RelMetadataQuery mq, SemiJoin rel) { return computeSemiJoinSelectivity(mq, rel.getLeft(), rel.getRight(), rel.getLeftKeys(), rel.getRightKeys()); }
public Set<ImmutableBitSet> getUniqueKeys(SemiJoin rel, RelMetadataQuery mq, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.getUniqueKeys(rel.getLeft(), ignoreNulls); }
public Boolean areColumnsUnique(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet columns, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.areColumnsUnique(rel.getLeft(), columns, ignoreNulls); }
public Boolean areColumnsUnique(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet columns, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.areColumnsUnique(rel.getLeft(), columns, ignoreNulls); }
public Double getPopulationSize(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet groupKey) { return mq.getPopulationSize(rel.getLeft(), groupKey); }
public Set<ImmutableBitSet> getUniqueKeys(SemiJoin rel, RelMetadataQuery mq, boolean ignoreNulls) { // only return the unique keys from the LHS since a semijoin only // returns the LHS return mq.getUniqueKeys(rel.getLeft(), ignoreNulls); }
public Double getPopulationSize(SemiJoin rel, RelMetadataQuery mq, ImmutableBitSet groupKey) { return mq.getPopulationSize(rel.getLeft(), groupKey); }
public Double getRowCount(SemiJoin rel, RelMetadataQuery mq) { // create a RexNode representing the selectivity of the // semijoin filter and pass it to getSelectivity RexNode semiJoinSelectivity = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); return NumberUtil.multiply( mq.getSelectivity(rel.getLeft(), semiJoinSelectivity), mq.getRowCount(rel.getLeft())); }
public Double getRowCount(SemiJoin rel, RelMetadataQuery mq) { // create a RexNode representing the selectivity of the // semijoin filter and pass it to getSelectivity RexNode semiJoinSelectivity = RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel); return NumberUtil.multiply( mq.getSelectivity(rel.getLeft(), semiJoinSelectivity), mq.getRowCount(rel.getLeft())); }
/** * 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); }
private Pair<ImmutableBitSet, ImmutableBitSet> getSemiJoinConditionInputRefs(SemiJoin semiJoin) { final int leftInputFieldCount = semiJoin.getLeft().getRowType().getFieldCount(); final ImmutableBitSet.Builder leftInputBitSet = ImmutableBitSet.builder(); final ImmutableBitSet.Builder rightInputBitSet = ImmutableBitSet.builder(); semiJoin.getCondition().accept(new RexVisitorImpl<Void>(true) { public Void visitInputRef(RexInputRef inputRef) { int index = inputRef.getIndex(); if (index < leftInputFieldCount) { leftInputBitSet.set(index); } else { rightInputBitSet.set(index); } return null; } }); return new Pair<>(leftInputBitSet.build(), rightInputBitSet.build()); } }
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; }