private Map<Byte, ExprNodeDesc> getFilterExprMap(int[] filterInfo, List<ExprNodeDesc> filterExprs) {
    Map<Byte, ExprNodeDesc> filterExprMap = new HashMap<>();

    int exprListOffset = 0;
    for (int idx = 0; idx < filterInfo.length; idx = idx + 2) {
      byte tag = (byte) filterInfo[idx];
      int length = filterInfo[idx + 1];

      int nextExprOffset = exprListOffset + length;
      List<ExprNodeDesc> andArgs = filterExprs.subList(exprListOffset, nextExprOffset);
      exprListOffset = nextExprOffset;

      if (andArgs.size() == 1) {
        filterExprMap.put(tag, andArgs.get(0));
      } else if (andArgs.size() > 1) {
        filterExprMap.put(tag, ExprNodeDescUtils.and(andArgs));
      }
    }

    return filterExprMap;
  }
Group filterExprs by tag and merge each of them into a single boolean ExprNodeDesc using AND operator.
filterInfo is repetition of tag and the length of corresponding filter expressions.
For example, filterInfo = {0, 2, 1, 3} means that the first 2 elements in filterExprs belong to tag 0,
and the remaining 3 elements belong to tag 1.
ql/src/java/org/apache/hadoop/hive/ql/optimizer/FiltertagAppenderProc.java