final Union union = call.rel(0); final int count = union.getRowType().getFieldCount(); if (count == 1) { final RexBuilder rexBuilder = union.getCluster().getRexBuilder(); final RelMetadataQuery mq = call.getMetadataQuery(); final RelOptPredicateList predicates = mq.getPulledUpPredicates(union); List<RelDataTypeField> fields = union.getRowType().getFieldList(); List<RexNode> topChildExprs = new ArrayList<>(); List<String> topChildExprsFields = new ArrayList<>(); RelOptUtil.permutation(refs, union.getInput(0).getRowType()).inverse(); topChildExprs = ImmutableList.copyOf(RexUtil.apply(mapping, topChildExprs)); for (int i = 0; i < union.getInputs().size() ; i++) { RelNode input = union.getInput(i); List<Pair<RexNode, String>> newChildExprs = new ArrayList<>(); for (int j = 0; j < refsIndex.cardinality(); j++ ) { relBuilder.project(Pair.left(newChildExprs), Pair.right(newChildExprs)); relBuilder.union(union.all, union.getInputs().size()); relBuilder.convert(union.getRowType(), false);
@Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { return super.computeSelfCost(planner, mq).multiplyBy(.05); }
@Override public RelNode convert(RelNode rel) { final Union union = (Union) rel; final RelTraitSet traitSet = union.getTraitSet().replace(OLAPRel.CONVENTION); final List<RelNode> inputs = union.getInputs(); return new OLAPUnionRel(rel.getCluster(), traitSet, convertList(inputs, OLAPRel.CONVENTION), union.all); } }
@Override public void onMatch(final RelOptRuleCall call) { final Union unionRel = call.rel(0); final DruidRel someDruidRel = call.rel(1); final List<RelNode> inputs = unionRel.getInputs(); if (unionRel.all) { // Can only do UNION ALL. call.transformTo(DruidUnionRel.create( someDruidRel.getQueryMaker(), unionRel.getRowType(), inputs, -1 )); } } }
RexBuilder rB = union.getCluster().getRexBuilder(); for (int i = 0; i < union.getInputs().size(); i++) { RelNode input = union.getInputs().get(i); RelOptPredicateList info = mq.getPulledUpPredicates(input); if (info.pulledUpPredicates.isEmpty()) {
public Double getSelectivity(Union rel, RelMetadataQuery mq, RexNode predicate) { if ((rel.getInputs().size() == 0) || (predicate == null)) { return 1.0; int[] adjustments = new int[rel.getRowType().getFieldCount()]; RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); for (RelNode input : rel.getInputs()) { Double nRows = mq.getRowCount(input); if (nRows == null) {
/** Returns an estimate of the number of rows returned by a {@link Union} * (before duplicates are eliminated). */ public static double getUnionAllRowCount(RelMetadataQuery mq, Union rel) { double rowCount = 0; for (RelNode input : rel.getInputs()) { rowCount += mq.getRowCount(input); } return rowCount; }
for (RelNode input : union.getInputs()) { if (!RelMdUtil.checkInputForCollationAndLimit(mq, input, sort.getCollation(), sort.offset, sort.fetch)) { .copy(union.getTraitSet(), inputs, union.all); Sort result = sort.copy(sort.getTraitSet(), unionCopy, sort.getCollation(), sort.offset, sort.fetch);
final RexBuilder rexBuilder = union.getCluster().getRexBuilder(); for (int i = 0; i < union.getInputs().size(); i++) { final RelNode input = union.getInput(i); final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) {
@Override public void onMatch(RelOptRuleCall call) { final Union union = call.rel(0); // First branch is query, second branch is MV RelNode newNode = call.builder() .push(union.getInput(0)) .convert(union.getRowType(), false) .build(); call.transformTo(newNode); }
Schema(Union unionRel, String alias) { for (RelDataTypeField field : unionRel.getRowType().getFieldList()) { add(new ColumnInfo(alias, field.getName())); } }
agg.getCluster().getRexBuilder(); final RelNode joinLeftInput = union.getInput(1); final RelNode joinRightInput = union.getInput(0); .push(union.getInput(1)) .push(union.getInput(0)) .join(JoinRelType.RIGHT, joinCond) .filter(rexBuilder.makeCall(SqlStdOperatorTable.OR, ImmutableList.of(joinCond, filterCond)))
public Double getSelectivity(Union rel, RelMetadataQuery mq, RexNode predicate) { if ((rel.getInputs().size() == 0) || (predicate == null)) { return 1.0; int[] adjustments = new int[rel.getRowType().getFieldCount()]; RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); for (RelNode input : rel.getInputs()) { Double nRows = mq.getRowCount(input); if (nRows == null) {
public List<Double> averageColumnSizes(Union rel, RelMetadataQuery mq) { final int fieldCount = rel.getRowType().getFieldCount(); List<List<Double>> inputColumnSizeList = new ArrayList<>(); for (RelNode input : rel.getInputs()) { final List<Double> inputSizes = mq.getAverageColumnSizes(input); if (inputSizes != null) {
public Double getMinRowCount(Union rel, RelMetadataQuery mq) { double rowCount = 0.0; for (RelNode input : rel.getInputs()) { Double partialRowCount = mq.getMinRowCount(input); if (partialRowCount != null) { rowCount += partialRowCount; } } return rowCount; }
for (RelNode input : union.getInputs()) { if (!RelMdUtil.checkInputForCollationAndLimit(mq, input, sort.getCollation(), sort.offset, sort.fetch)) { .copy(union.getTraitSet(), inputs, union.all); Sort result = sort.copy(sort.getTraitSet(), unionCopy, sort.getCollation(), sort.offset, sort.fetch);
final RexBuilder rexBuilder = union.getCluster().getRexBuilder(); for (int i = 0; i < union.getInputs().size(); i++) { final RelNode input = union.getInput(i); final RelOptPredicateList inputPreds = mq.getAllPredicates(input); if (inputPreds == null) {
RexBuilder rB = union.getCluster().getRexBuilder(); for (int i = 0; i < union.getInputs().size(); i++) { RelNode input = union.getInputs().get(i); RelOptPredicateList info = mq.getPulledUpPredicates(input); if (info.pulledUpPredicates.isEmpty()) {