/** * Returns whether a list of expressions contains a multiset. */ public static boolean containsMultiset(List<RexNode> nodes, boolean deep) { for (RexNode node : nodes) { if (containsMultiset(node, deep)) { return true; } } return false; }
/** * Returns whether a program contains a multiset. */ public static boolean containsMultiset(RexProgram program) { return containsMultiset(program.getExprList(), true); }
/** * Returns whether a program contains a multiset. */ public static boolean containsMultiset(RexProgram program) { final boolean deep = true; for (RexNode expr : program.getExprList()) { if (containsMultiset(expr, deep)) { return true; } } return false; }
@Override public RelNode convert( RelNode rel ) { // stolen from JavaRules.EnumerableAggregateRule final CalcRel calc = (CalcRel) rel; final RelNode convertedChild = convert( calc.getChild(), calc.getTraitSet().replace( Cascading.CONVENTION ) ); if( convertedChild == null ) return null; // We can't convert the child, so we can't convert rel. // If there's a multiset, let FarragoMultisetSplitter work on it // first. if( RexMultisetUtil.containsMultiset( calc.getProgram() ) ) return null; return new CascadingCalcRel( rel.getCluster(), rel.getTraitSet(), convertedChild, rel.getRowType(), calc.getProgram(), Collections.<RelCollation>emptyList() ); } }
public RelNode convert(RelNode rel) { final CalcRel calc = (CalcRel) rel; // If there's a multiset, let FarragoMultisetSplitter work on it // first. if (RexMultisetUtil.containsMultiset(calc.getProgram())) { return null; } return new JdbcCalcRel(rel.getCluster(), rel.getTraitSet().replace(out), convert(calc.getChild(), calc.getTraitSet().replace(out)), calc.getProgram(), ProjectRelBase.Flags.BOXED); } }
public RelNode convert(RelNode rel) { final CalcRel calc = (CalcRel) rel; // If there's a multiset, let FarragoMultisetSplitter work on it // first. if (RexMultisetUtil.containsMultiset(calc.getProgram())) { return null; } return new JdbcCalcRel(rel.getCluster(), rel.getTraitSet().replace(out), convert(calc.getChild(), calc.getTraitSet().replace(out)), calc.getProgram(), ProjectRelBase.Flags.Boxed); } }
public RelNode convert(RelNode rel) { final CalcRel calc = (CalcRel) rel; // If there's a multiset, let FarragoMultisetSplitter work on it // first. final RexProgram program = calc.getProgram(); if (RexMultisetUtil.containsMultiset(program) || program.containsAggs()) { return null; } return new EnumerableCalcRel( rel.getCluster(), rel.getTraitSet().replace(EnumerableConvention.INSTANCE), convert( calc.getChild(), calc.getChild().getTraitSet() .replace(EnumerableConvention.INSTANCE)), program, ProjectRelBase.Flags.Boxed); } }