private Map<String, List<SemiJoinHint>> parseSemiJoinHint(List<ASTNode> hints) throws SemanticException {
    if (hints == null || hints.size() == 0) {
      return null;
    }
    Map<String, List<SemiJoinHint>> result = null;
    for (ASTNode hintNode : hints) {
      for (Node node : hintNode.getChildren()) {
        ASTNode hint = (ASTNode) node;
        if (hint.getChild(0).getType() != HintParser.TOK_LEFTSEMIJOIN &&
                hint.getChild(0).getType() != HintParser.TOK_LEFTANTISEMIJOIN) {
          continue;
        }
        if (result == null) {
          result = new HashMap<>();
        }
        Tree args = hint.getChild(1);
        if (args.getChildCount() == 1) {
          String text = args.getChild(0).getText();
          if (text.equalsIgnoreCase("None")) {
            // Hint to disable runtime filtering.
            return result;
          }
        }
        int curIdx = 0;
        while(curIdx < args.getChildCount()) {
          curIdx = parseSingleSemiJoinHint(args, curIdx, result);
        }
      }
    }
    if (LOG.isDebugEnabled()) {
      LOG.debug("Semijoin hint parsed: " + result);
    }
    return result;
  }
Parses semjoin hints in the query and returns the table names mapped to filter size, or -1 if not specified.
 Hints can be in 2 formats
 1. TableName, ColumnName, Target-TableName, bloom filter entries
 2. TableName, ColumnName, Target-TableName
ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java