private boolean isOuterJoinUnmatchedRow(int tag, List<Object> value) {
    if (!shortcutUnmatchedRows || condn.length != 1) {
      return false;
    }
    switch (condn[0].getType()) {
    case JoinDesc.INNER_JOIN:
    case JoinDesc.LEFT_OUTER_JOIN:
    case JoinDesc.RIGHT_OUTER_JOIN:
    case JoinDesc.FULL_OUTER_JOIN:
      break;
    default:
      return false;
    }
    if (hasFilter(tag)) {
      short filterTag = getFilterTag(value);
      if (JoinUtil.isFiltered(filterTag, 1 - tag)) {
        return true;
      }
    }
    return false;
  }
Decides if the actual row must be an unmatched row.

Unmatched rows are those which are not part of the inner-join.
The current implementation has issues processing filtered rows in FOJ conditions.
Putting them in a separate group also reduces processing done for them.
ql/src/java/org/apache/hadoop/hive/ql/exec/CommonMergeJoinOperator.java