@Override
  public ParseContext transform(ParseContext pctx) throws SemanticException {
    // 1. Trigger transformation
    Map<SemanticRule, SemanticNodeProcessor> opRules = new LinkedHashMap<SemanticRule, SemanticNodeProcessor>();
    opRules.put(new RuleRegExp("R1", FilterOperator.getOperatorName() + "%"), new StructInTransformer());

    SemanticDispatcher disp = new DefaultRuleDispatcher(null, opRules, null);
    SemanticGraphWalker ogw = new ForwardWalker(disp);

    List<Node> topNodes = new ArrayList<Node>();
    topNodes.addAll(pctx.getTopOps().values());
    ogw.startWalking(topNodes, null);
    return pctx;
  }
This optimization will take a Filter expression, and if its predicate contains
an IN operator whose children are constant structs or structs containing constant fields,
it will try to generate predicate with IN clauses containing only partition columns.
This predicate is in turn used by the partition pruner to prune the columns that are not
part of the original IN(STRUCT(..)..) predicate.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/PartitionColumnsSeparator.java