/** * Since the project under aggregate maybe reduce expressions by {@link org.apache.kylin.query.optrule.AggregateProjectReduceRule}, * consider the count of expressions into cost, the reduced project will be used. * * Made RexOver much more expensive so we can transform into {@link org.apache.kylin.query.relnode.OLAPWindowRel} * by rules in {@link org.apache.calcite.rel.rules.ProjectToWindowRule} */ @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { boolean hasRexOver = RexOver.containsOver(getProjects(), null); RelOptCost relOptCost = super.computeSelfCost(planner, mq).multiplyBy(.05) .multiplyBy(getProjects().size() * (hasRexOver ? 50 : 1)) .plus(planner.getCostFactory().makeCost(0.1 * caseCount, 0, 0)); return planner.getCostFactory().makeCost(relOptCost.getRows(), 0, 0); }
if (RexOver.containsOver(origproject.getProjects(), null)) { RexNode origFilterCond = filterCondToPushBelowProj; filterCondToPushBelowProj = null;
if (RexOver.containsOver(origproject.getProjects(), null)) { RexNode origFilterCond = filterCondToPushBelowProj; filterCondToPushBelowProj = null;
final Project project = call.rel(1); if (RexOver.containsOver(project.getProjects(), null)) {
final Project project = call.rel(1); if (RexOver.containsOver(project.getProjects(), null)) {
/** * Returns whether this program contains windowed aggregate functions * * @return whether this program contains windowed aggregate functions */ public boolean containsAggs() { return RexOver.containsOver(this); }
/** * Returns whether this program contains windowed aggregate functions * * @return whether this program contains windowed aggregate functions */ public boolean containsAggs() { return RexOver.containsOver(this); }
/** Predicate for whether a {@link Project} contains multisets or windowed * aggregates. */ public static boolean containsMultisetOrWindowedAgg(Project project) { return !(B && RexMultisetUtil.containsMultiset(project.getProjects(), true) || RexOver.containsOver(project.getProjects(), null)); }
/** Predicate for whether a {@link Filter} contains multisets or windowed * aggregates. */ public static boolean containsMultisetOrWindowedAgg(Filter filter) { return !(B && RexMultisetUtil.containsMultiset(filter.getCondition(), true) || RexOver.containsOver(filter.getCondition())); }
/** Predicate for whether a {@link Filter} contains multisets or windowed * aggregates. */ public static boolean containsMultisetOrWindowedAgg(Filter filter) { return !(B && RexMultisetUtil.containsMultiset(filter.getCondition(), true) || RexOver.containsOver(filter.getCondition())); }
/** Predicate for whether a {@link Project} contains multisets or windowed * aggregates. */ public static boolean containsMultisetOrWindowedAgg(Project project) { return !(B && RexMultisetUtil.containsMultiset(project.getProjects(), true) || RexOver.containsOver(project.getProjects(), null)); }
/** * Creates a CalcToWindowRule. * * @param relBuilderFactory Builder for relational expressions */ public CalcToWindowRule(RelBuilderFactory relBuilderFactory) { super( operandJ(Calc.class, null, calc -> RexOver.containsOver(calc.getProgram()), any()), relBuilderFactory, "ProjectToWindowRule"); }
/** * Creates a ProjectToWindowRule. * * @param relBuilderFactory Builder for relational expressions */ public ProjectToLogicalProjectAndWindowRule( RelBuilderFactory relBuilderFactory) { super( operandJ(Project.class, null, project -> RexOver.containsOver(project.getProjects(), null), any()), relBuilderFactory, "ProjectToWindowRule:project"); }
/** Creates a JdbcProjectRule. */ public JdbcProjectRule(final JdbcConvention out, RelBuilderFactory relBuilderFactory) { super(Project.class, (Predicate<Project>) project -> (out.dialect.supportsWindowFunctions() || !RexOver.containsOver(project.getProjects(), null)) && !userDefinedFunctionInProject(project), Convention.NONE, out, relBuilderFactory, "JdbcProjectRule"); }
/** * Creates a CalcToWindowRule. * * @param relBuilderFactory Builder for relational expressions */ public CalcToWindowRule(RelBuilderFactory relBuilderFactory) { super( operandJ(Calc.class, null, calc -> RexOver.containsOver(calc.getProgram()), any()), relBuilderFactory, "ProjectToWindowRule"); }
/** * Creates a ProjectToWindowRule. * * @param relBuilderFactory Builder for relational expressions */ public ProjectToLogicalProjectAndWindowRule( RelBuilderFactory relBuilderFactory) { super( operandJ(Project.class, null, project -> RexOver.containsOver(project.getProjects(), null), any()), relBuilderFactory, "ProjectToWindowRule:project"); }
/** Creates a JdbcProjectRule. */ public JdbcProjectRule(final JdbcConvention out, RelBuilderFactory relBuilderFactory) { super(Project.class, (Predicate<Project>) project -> (out.dialect.supportsWindowFunctions() || !RexOver.containsOver(project.getProjects(), null)) && !userDefinedFunctionInProject(project), Convention.NONE, out, relBuilderFactory, "JdbcProjectRule"); }
public void onMatch(RelOptRuleCall call) { Calc calc = call.rel(0); assert RexOver.containsOver(calc.getProgram()); final CalcRelSplitter transform = new WindowedAggRelSplitter(calc, call.builder()); RelNode newRel = transform.execute(); call.transformTo(newRel); } }
public void onMatch(RelOptRuleCall call) { Calc calc = call.rel(0); assert RexOver.containsOver(calc.getProgram()); final CalcRelSplitter transform = new WindowedAggRelSplitter(calc, call.builder()); RelNode newRel = transform.execute(); call.transformTo(newRel); } }
/** * Since the project under aggregate maybe reduce expressions by {@link org.apache.kylin.query.optrule.AggregateProjectReduceRule}, * consider the count of expressions into cost, the reduced project will be used. * * Made RexOver much more expensive so we can transform into {@link org.apache.kylin.query.relnode.OLAPWindowRel} * by rules in {@link org.apache.calcite.rel.rules.ProjectToWindowRule} */ @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { boolean hasRexOver = RexOver.containsOver(getProjects(), null); RelOptCost relOptCost = super.computeSelfCost(planner, mq).multiplyBy(.05) .multiplyBy(getProjects().size() * (hasRexOver ? 50 : 1)) .plus(planner.getCostFactory().makeCost(0.1 * caseCount, 0, 0)); return planner.getCostFactory().makeCost(relOptCost.getRows(), 0, 0); }