public void onMatch(RelOptRuleCall call, SqlDialect dialect) {
    LOGGER.debug("MySplitFilter.onMatch has been called");

    final HiveFilter        filter = call.rel(0);

    RexCall callExpression = (RexCall) filter.getCondition();

    FilterSupportedFunctionsVisitor visitor = new FilterSupportedFunctionsVisitor(dialect);
    callExpression.accept(visitor);

    ArrayList<RexCall> validJdbcNode = visitor.getValidJdbcNode();
    ArrayList<RexCall> invalidJdbcNode = visitor.getInvalidJdbcNode();

    assert validJdbcNode.size() != 0 && invalidJdbcNode.size() != 0;

    final RexBuilder rexBuilder = filter.getCluster().getRexBuilder();

    RexNode validCondition;
    if (validJdbcNode.size() == 1) {
      validCondition = validJdbcNode.get(0);
    } else {
      validCondition = rexBuilder.makeCall(SqlStdOperatorTable.AND, validJdbcNode);
    }

    HiveFilter newJdbcValidFilter = new HiveFilter(filter.getCluster(), filter.getTraitSet(), filter.getInput(),
            validCondition);

    RexNode invalidCondition;
    if (invalidJdbcNode.size() == 1) {
      invalidCondition = invalidJdbcNode.get(0);
    } else {
      invalidCondition = rexBuilder.makeCall(SqlStdOperatorTable.AND, invalidJdbcNode);
    }

    HiveFilter newJdbcInvalidFilter = new HiveFilter(filter.getCluster(), filter.getTraitSet(),
                                                     newJdbcValidFilter, invalidCondition);

    call.transformTo(newJdbcInvalidFilter);
  }
FilterSupportedFunctionsVisitor traverse all of the Rex call and splits them into
two lists, one with supported jdbc calls, and one with not supported jdbc calls.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/jdbc/JDBCAbstractSplitFilterRule.java