@Override
    public Object process(Node nd, Stack<Node> stack, NodeProcessorCtx procCtx,
        Object... nodeOutputs) throws SemanticException {
      FilterOperator filterOp = (FilterOperator) nd;
      ExprNodeDesc predicate = filterOp.getConf().getPredicate();

      // Generate the list bucketing pruning predicate
      ExprNodeDesc newPredicate = generateInClause(predicate);
      if (newPredicate != null) {
        // Replace filter in current FIL with new FIL
        LOG.debug("Generated new predicate with IN clause: {}", newPredicate);
        filterOp.getConf().setPredicate(newPredicate);
      }

      return null;
    }
This optimization will take a Filter expression, and if its predicate contains
an OR operator whose children are constant equality expressions, it will try
to generate an IN clause (which is more efficient). If the OR operator contains
AND operator children, the optimization might generate an IN clause that uses
structs.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/PointLookupOptimizer.java