public static double estimateFilteredRows(RelNode child, RexNode condition, RelMetadataQuery mq) { return mq.getRowCount(child) * mq.getSelectivity(child, condition); }
public static double estimateFilteredRows(RelNode child, RexNode condition, RelMetadataQuery mq) { return mq.getRowCount(child) * mq.getSelectivity(child, condition); }
public Double getSelectivity(Filter rel, RelMetadataQuery mq, RexNode predicate) { // Take the difference between the predicate passed in and the // predicate in the filter's condition, so we don't apply the // selectivity of the filter twice. If no predicate is passed in, // use the filter's condition. if (predicate != null) { return mq.getSelectivity(rel.getInput(), RelMdUtil.minusPreds( rel.getCluster().getRexBuilder(), predicate, rel.getCondition())); } else { return mq.getSelectivity(rel.getInput(), rel.getCondition()); } }
public Double getSelectivity(Filter rel, RelMetadataQuery mq, RexNode predicate) { // Take the difference between the predicate passed in and the // predicate in the filter's condition, so we don't apply the // selectivity of the filter twice. If no predicate is passed in, // use the filter's condition. if (predicate != null) { return mq.getSelectivity(rel.getInput(), RelMdUtil.minusPreds( rel.getCluster().getRexBuilder(), predicate, rel.getCondition())); } else { return mq.getSelectivity(rel.getInput(), rel.getCondition()); } }
/** Catch-all implementation for * {@link BuiltInMetadata.DistinctRowCount#getDistinctRowCount(ImmutableBitSet, RexNode)}, * invoked using reflection. * * @see org.apache.calcite.rel.metadata.RelMetadataQuery#getDistinctRowCount(RelNode, ImmutableBitSet, RexNode) */ public Double getDistinctRowCount(RelNode rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { // REVIEW zfong 4/19/06 - Broadbase code does not take into // consideration selectivity of predicates passed in. Also, they // assume the rows are unique even if the table is not boolean uniq = RelMdUtil.areColumnsDefinitelyUnique(mq, rel, groupKey); if (uniq) { return NumberUtil.multiply(mq.getRowCount(rel), mq.getSelectivity(rel, predicate)); } return null; }
/** Catch-all implementation for * {@link BuiltInMetadata.DistinctRowCount#getDistinctRowCount(ImmutableBitSet, RexNode)}, * invoked using reflection. * * @see org.apache.calcite.rel.metadata.RelMetadataQuery#getDistinctRowCount(RelNode, ImmutableBitSet, RexNode) */ public Double getDistinctRowCount(RelNode rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { // REVIEW zfong 4/19/06 - Broadbase code does not take into // consideration selectivity of predicates passed in. Also, they // assume the rows are unique even if the table is not boolean uniq = RelMdUtil.areColumnsDefinitelyUnique(mq, rel, groupKey); if (uniq) { return NumberUtil.multiply(mq.getRowCount(rel), mq.getSelectivity(rel, predicate)); } return null; }
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())); }
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); }
/** Returns an estimate of the number of rows returned by a {@link Join}. */ public static Double getJoinRowCount(RelMetadataQuery mq, Join join, RexNode condition) { // Row count estimates of 0 will be rounded up to 1. // So, use maxRowCount where the product is very small. final Double left = mq.getRowCount(join.getLeft()); final Double right = mq.getRowCount(join.getRight()); if (left == null || right == null) { return null; } if (left <= 1D || right <= 1D) { Double max = mq.getMaxRowCount(join); if (max != null && max <= 1D) { return max; } } double product = left * right; // TODO: correlation factor return product * mq.getSelectivity(join, condition); }
@Override public double estimateRowCount(RelMetadataQuery mq) { // override Calcite's default selectivity estimate - cap lower/upper bounds on the // selectivity estimate in order to get desired parallelism double selectivity = mq.getSelectivity(getInput(), condition); if (!condition.isAlwaysFalse()) { // Cap selectivity at filterMinSelectivityEstimateFactor unless it is always FALSE if (selectivity < filterMinSelectivityEstimateFactor) { selectivity = filterMinSelectivityEstimateFactor; } } if (!condition.isAlwaysTrue()) { // Cap selectivity at filterMaxSelectivityEstimateFactor unless it is always TRUE if (selectivity > filterMaxSelectivityEstimateFactor) { selectivity = filterMaxSelectivityEstimateFactor; } } return selectivity * mq.getRowCount(getInput()); } }
@Override public double estimateRowCount(RelMetadataQuery mq) { // override Calcite's default selectivity estimate - cap lower/upper bounds on the // selectivity estimate in order to get desired parallelism double selectivity = mq.getSelectivity(getInput(), condition); if (!condition.isAlwaysFalse()) { // Cap selectivity at filterMinSelectivityEstimateFactor unless it is always FALSE if (selectivity < filterMinSelectivityEstimateFactor) { selectivity = filterMinSelectivityEstimateFactor; } } if (!condition.isAlwaysTrue()) { // Cap selectivity at filterMaxSelectivityEstimateFactor unless it is always TRUE if (selectivity > filterMaxSelectivityEstimateFactor) { selectivity = filterMaxSelectivityEstimateFactor; } } return selectivity * mq.getRowCount(getInput()); } }
private void checkRelSelectivity( RelNode rel, double expected) { final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertTrue(result != null); assertEquals(expected, result, EPSILON); }
/** Returns an estimate of the number of rows returned by a {@link Join}. */ public static Double getJoinRowCount(RelMetadataQuery mq, Join join, RexNode condition) { // Row count estimates of 0 will be rounded up to 1. // So, use maxRowCount where the product is very small. final Double left = mq.getRowCount(join.getLeft()); final Double right = mq.getRowCount(join.getRight()); if (left == null || right == null) { return null; } if (left <= 1D || right <= 1D) { Double max = mq.getMaxRowCount(join); if (max != null && max <= 1D) { return max; } } double product = left * right; // TODO: correlation factor return product * mq.getSelectivity(join, condition); }
private void checkRelSelectivity( RelNode rel, double expected) { final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertTrue(result != null); assertEquals(expected, result, EPSILON); }
private void checkFilterSelectivity( String sql, double expected) { RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertTrue(result != null); assertEquals(expected, result, EPSILON); }
private void checkFilterSelectivity( String sql, double expected) { RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertTrue(result != null); assertEquals(expected, result, EPSILON); }
/** Checks that we can cache a metadata request that includes a null * argument. */ @Test public void testSelectivityAggCached() { RelNode rel = convertSql("select deptno, count(*) from emp where deptno > 10 " + "group by deptno having count(*) = 0"); rel.getCluster().setMetadataProvider( new CachingRelMetadataProvider( rel.getCluster().getMetadataProvider(), rel.getCluster().getPlanner())); final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertThat(result, within(DEFAULT_COMP_SELECTIVITY * DEFAULT_EQUAL_SELECTIVITY, EPSILON)); }
/** Checks that we can cache a metadata request that includes a null * argument. */ @Test public void testSelectivityAggCached() { RelNode rel = convertSql("select deptno, count(*) from emp where deptno > 10 " + "group by deptno having count(*) = 0"); rel.getCluster().setMetadataProvider( new CachingRelMetadataProvider( rel.getCluster().getMetadataProvider(), rel.getCluster().getPlanner())); final RelMetadataQuery mq = RelMetadataQuery.instance(); Double result = mq.getSelectivity(rel, null); assertThat(result, within(DEFAULT_COMP_SELECTIVITY * DEFAULT_EQUAL_SELECTIVITY, EPSILON)); }