private double estimateCpuCost(RelMetadataQuery mq) { RelNode child = this.getInput(); double compNum = mq.getRowCount(child); for (int i = 0; i< numConjuncts; i++) { RexNode conjFilter = RexUtil.composeConjunction(this.getCluster().getRexBuilder(), conjunctions.subList(0, i + 1), false); compNum += RelMdUtil.estimateFilteredRows(child, conjFilter, mq); } return compNum * DrillCostBase.COMPARE_CPU_COST; }
protected LogicalExpression getFilterExpression(DrillParseContext context){ return DrillOptiq.toDrill(context, getInput(), getCondition()); }
@Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { if(PrelUtil.getSettings(getCluster()).useDefaultCosting()) { return super.computeSelfCost(planner, mq).multiplyBy(.1); } RelNode child = this.getInput(); double inputRows = mq.getRowCount(child); double cpuCost = estimateCpuCost(mq); DrillCostFactory costFactory = (DrillCostFactory)planner.getCostFactory(); return costFactory.makeCost(inputRows, cpuCost, 0, 0); }
@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()); } }
protected DrillFilterRelBase(Convention convention, RelOptCluster cluster, RelTraitSet traits, RelNode child, RexNode condition) { super(cluster, traits, child, condition); assert getConvention() == convention; // save the number of conjuncts that make up the filter condition such // that repeated calls to the costing function can use the saved copy conjunctions = RelOptUtil.conjunctions(condition); numConjuncts = conjunctions.size(); // assert numConjuncts >= 1; filterMinSelectivityEstimateFactor = PrelUtil. getPlannerSettings(cluster.getPlanner()).getFilterMinSelectivityEstimateFactor(); filterMaxSelectivityEstimateFactor = PrelUtil. getPlannerSettings(cluster.getPlanner()).getFilterMaxSelectivityEstimateFactor(); }