@Override
    public RexNode visitCall(RexCall call) {
      if (!deep) {
        return null;
      }

      if (call.getOperator() != SqlStdOperatorTable.AND) {
        if (pruningPredicates.contains(call)) {
          return null;
        } else {
          return call;
        }
      }

      List<RexNode> args = new LinkedList<RexNode>();

      for (RexNode operand : call.operands) {
        RexNode n = operand.accept(this);
        if (n != null) {
          args.add(n);
        }
      }

      if (args.size() == 0) {
        return null;
      } else if (args.size() == 1) {
        return args.get(0);
      } else {
        return cluster.getRexBuilder().makeCall(call.getOperator(), args);
      }
    }
Breaks the predicate into 2 pieces. The first piece is the expressions that
only contain partition columns and can be used for Partition Pruning; the
second piece is the predicates that are left.

@param cluster
@param hiveTable
@param predicate
@return a Pair of expressions, each of which maybe null. The 1st predicate
        is expressions that only contain partition columns; the 2nd
        predicate contains the remaining predicates.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/PartitionPrune.java