/** * 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 true if node contains a multiset operator, otherwise false. Use * it with deep=false when checking if a RexCall is a multiset call. * * @param node Expression * @param deep If true, returns whether expression contains a multiset. If * false, returns whether expression <em>is</em> a multiset. */ public static boolean containsMultiset(final RexNode node, boolean deep) { return null != findFirstMultiset(node, deep); }
return findFirstMultiset( ((RexFieldAccess) node).getReferenceExpr(), deep); if (firstOne.getOperator().equals( SqlStdOperatorTable.castFunc) && !isMultisetCast(firstOne))
public Void visitCall(RexCall call) { ++totalCount; if (MULTISET_OPERATORS.contains(call.getOperator())) { if (!call.getOperator().equals(SqlStdOperatorTable.CAST) || isMultisetCast(call)) { ++multisetCount; } } return super.visitCall(call); } }
return findFirstMultiset( ((RexFieldAccess) node).getReferenceExpr(), deep); if (null != firstOne) { if (firstOne.getOperator().equals(SqlStdOperatorTable.CAST) && !isMultisetCast(firstOne)) { firstOne = null; continue;
public Void visitCall(RexCall call) { ++totalCount; if (multisetOperators.contains(call.getOperator())) { if (!call.getOperator().equals(SqlStdOperatorTable.castFunc) || isMultisetCast(call)) { ++multisetCount; } } return super.visitCall(call); } }
/** * Returns whether a program contains a multiset. */ public static boolean containsMultiset(RexProgram program) { return containsMultiset(program.getExprList(), true); }
/** * Returns true if node contains a multiset operator, otherwise false. Use * it with deep=false when checking if a RexCall is a multiset call. * * @param node Expression * @param deep If true, returns whether expression contains a multiset. If * false, returns whether expression <em>is</em> a multiset. */ public static boolean containsMultiset(final RexNode node, boolean deep) { return null != findFirstMultiset(node, deep); }
/** * 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); } }