private void addPkFkInfo(QBJoinTree joinTree, ASTNode hints) {
    if (hints.getToken().getType() == HintParser.TOK_HINTLIST) {
      Tree hint = hints.getChild(0);
      if (hint.getType() == HintParser.TOK_HINT && hint.getChild(0).getType() == HintParser.TOK_PKFK_JOIN) {
        Tree args = hint.getChild(1);
        joinTree.setFkJoinTableIndex(Integer.parseInt(args.getChild(0).getText()));
        joinTree.setNonFkSideIsFiltered(NON_FK_FILTERED.equals(args.getChild(1).getText()));
      }
    }
  }
Extract the filters from the join condition and push them on top of the
source operators. This procedure traverses the query tree recursively,
ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java