/** Returns a list of (expression, name) pairs. Convenient for various * transformations. */ public final List<Pair<RexNode, String>> getNamedProjects() { return Pair.zip(getProjects(), getRowType().getFieldNames()); }
/** * Returns a list of (expression, name) pairs. Convenient for various * transformations. */ public final List<Pair<RexNode, String>> getNamedProjects() { return Pair.zip(getProjects(), getRowType().getFieldNames()); }
bottomProject.getProjects(), null, bottomProject.getRowType(), rexBuilder); RexProgram topProgram = RexProgram.create( bottomProject.getRowType(), projExprs, null, topProject.getRowType(), rexBuilder); topProject.getRowType().getFieldNames());
return false; List<RelDataTypeField> projFields = project.getRowType().getFieldList(); List<RelDataTypeField> inputFields = inputType.getFieldList(); boolean namesDifferent = false;
public static boolean isTrivial(ProjectRelBase project) { RelNode child = project.getChild(); final RelDataType childRowType = child.getRowType(); if (!childRowType.isStruct()) { return false; } if (!project.isBoxed()) { return false; } if (!isIdentity( project.getProjects(), project.getRowType(), childRowType)) { return false; } return true; }
public Double getSelectivity(ProjectRelBase rel, RexNode predicate) { List<RexNode> notPushable = new ArrayList<RexNode>(); List<RexNode> pushable = new ArrayList<RexNode>(); RelOptUtil.splitFilters( rel.getRowType().getFieldCount(), predicate, pushable, notPushable); RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); RexNode childPred = RexUtil.andRexNodeList(rexBuilder, pushable); RexNode modifiedPred; if (childPred == null) { modifiedPred = null; } else { modifiedPred = RelOptUtil.pushFilterPastProject(childPred, rel); } Double selectivity = RelMetadataQuery.getSelectivity( rel.getChild(), modifiedPred); if (selectivity == null) { return null; } else { RexNode pred = RexUtil.andRexNodeList(rexBuilder, notPushable); return selectivity * RelMdUtil.guessSelectivity(pred); } }
List<RexNode> pushable = new ArrayList<RexNode>(); RelOptUtil.splitFilters( BitSets.range(rel.getRowType().getFieldCount()), predicate, pushable,
public Double getSelectivity(ProjectRelBase rel, RexNode predicate) { List<RexNode> notPushable = new ArrayList<RexNode>(); List<RexNode> pushable = new ArrayList<RexNode>(); RelOptUtil.splitFilters( BitSets.range(rel.getRowType().getFieldCount()), predicate, pushable, notPushable); final RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); RexNode childPred = RexUtil.composeConjunction(rexBuilder, pushable, true); RexNode modifiedPred; if (childPred == null) { modifiedPred = null; } else { modifiedPred = RelOptUtil.pushFilterPastProject(childPred, rel); } Double selectivity = RelMetadataQuery.getSelectivity( rel.getChild(), modifiedPred); if (selectivity == null) { return null; } else { RexNode pred = RexUtil.composeConjunction(rexBuilder, notPushable, true); return selectivity * RelMdUtil.guessSelectivity(pred); } }
List<RexNode> pushable = new ArrayList<RexNode>(); RelOptUtil.splitFilters( rel.getRowType().getFieldCount(), predicate, pushable,
getRowType(), true))
public void onMatch(RelOptRuleCall call) { final FilterRelBase filterRel = call.rel(0); final ProjectRelBase projRel = call.rel(1); // convert the filter to one that references the child of the project RexNode newCondition = RelOptUtil.pushFilterPastProject(filterRel.getCondition(), projRel); RelNode newFilterRel = filterFactory == null ? filterRel.copy(filterRel.getTraitSet(), projRel.getChild(), newCondition) : filterFactory.createFilter(projRel.getChild(), newCondition); RelNode newProjRel = projectFactory == null ? projRel.copy(projRel.getTraitSet(), newFilterRel, projRel.getProjects(), projRel.getRowType()) : projectFactory.createProject(newFilterRel, projRel.getProjects(), projRel.getRowType().getFieldNames()); call.transformTo(newProjRel); } }
getRowType(), true)) { assert !fail;
projRel.getProjects(), null, projRel.getRowType(), rexBuilder); projRel.getRowType(), rexBuilder); topProgramBuilder.addIdentity();
assert RexOver.containsOver(project.getProjects(), null); final RelNode child = project.getChild(); final RelDataType rowType = project.getRowType(); final RexProgram program = RexProgram.create( project.getProjects(), null, project.getRowType(), project.getCluster().getRexBuilder());
projRel.getProjects(), null, projRel.getRowType(), rexBuilder); projRel.getRowType(), rexBuilder); topProgramBuilder.addIdentity();
Mapping m = Mappings.create(MappingType.PARTIAL_FUNCTION, child.getRowType().getFieldCount(), project.getRowType().getFieldCount());
private static MutableRel toMutable(RelNode rel) { if (rel instanceof TableAccessRelBase) { return MutableScan.of((TableAccessRelBase) rel); } if (rel instanceof ValuesRelBase) { return MutableValues.of((ValuesRelBase) rel); } if (rel instanceof ProjectRelBase) { final ProjectRelBase project = (ProjectRelBase) rel; final MutableRel input = toMutable(project.getChild()); return MutableProject.of(input, project.getProjects(), project.getRowType().getFieldNames()); } if (rel instanceof FilterRelBase) { final FilterRelBase filter = (FilterRelBase) rel; final MutableRel input = toMutable(filter.getChild()); return MutableFilter.of(input, filter.getCondition()); } if (rel instanceof AggregateRelBase) { final AggregateRelBase aggregate = (AggregateRelBase) rel; final MutableRel input = toMutable(aggregate.getChild()); return MutableAggregate.of(input, aggregate.getGroupSet(), aggregate.getAggCallList()); } throw new RuntimeException("cannot translate " + rel + " to MutableRel"); }
final ProjectRelBase newProject = project.copy(project.getTraitSet(), semiJoin, project.getProjects(), project.getRowType()); call.transformTo(RemoveTrivialProjectRule.strip(newProject));