private RelNode genJoinLogicalPlan()

in flink-connector-hive/src/main/java/org/apache/flink/table/planner/delegation/hive/HiveParserCalcitePlanner.java [693:785]


    private RelNode genJoinLogicalPlan(
            HiveParserASTNode joinParseTree, Map<String, RelNode> aliasToRel)
            throws SemanticException {
        RelNode leftRel = null;
        RelNode rightRel = null;
        JoinType hiveJoinType;

        if (joinParseTree.getToken().getType() == HiveASTParser.TOK_UNIQUEJOIN) {
            String msg =
                    "UNIQUE JOIN is currently not supported in CBO, turn off cbo to use UNIQUE JOIN.";
            throw new SemanticException(msg);
        }

        // 1. Determine Join Type
        switch (joinParseTree.getToken().getType()) {
            case HiveASTParser.TOK_LEFTOUTERJOIN:
                hiveJoinType = JoinType.LEFTOUTER;
                break;
            case HiveASTParser.TOK_RIGHTOUTERJOIN:
                hiveJoinType = JoinType.RIGHTOUTER;
                break;
            case HiveASTParser.TOK_FULLOUTERJOIN:
                hiveJoinType = JoinType.FULLOUTER;
                break;
            case HiveASTParser.TOK_LEFTSEMIJOIN:
                hiveJoinType = JoinType.LEFTSEMI;
                break;
            default:
                hiveJoinType = JoinType.INNER;
                break;
        }

        // 2. Get Left Table Alias
        HiveParserASTNode left = (HiveParserASTNode) joinParseTree.getChild(0);
        String leftTableAlias = null;
        if (left.getToken().getType() == HiveASTParser.TOK_TABREF
                || (left.getToken().getType() == HiveASTParser.TOK_SUBQUERY)
                || (left.getToken().getType() == HiveASTParser.TOK_PTBLFUNCTION)) {
            String tableName =
                    HiveParserBaseSemanticAnalyzer.getUnescapedUnqualifiedTableName(
                                    (HiveParserASTNode) left.getChild(0))
                            .toLowerCase();
            leftTableAlias =
                    left.getChildCount() == 1
                            ? tableName
                            : unescapeIdentifier(
                                    left.getChild(left.getChildCount() - 1)
                                            .getText()
                                            .toLowerCase());
            leftTableAlias =
                    left.getToken().getType() == HiveASTParser.TOK_PTBLFUNCTION
                            ? unescapeIdentifier(left.getChild(1).getText().toLowerCase())
                            : leftTableAlias;
            leftRel = aliasToRel.get(leftTableAlias);
        } else if (HiveParserUtils.isJoinToken(left)) {
            leftRel = genJoinLogicalPlan(left, aliasToRel);
        } else {
            assert (false);
        }

        // 3. Get Right Table Alias
        HiveParserASTNode right = (HiveParserASTNode) joinParseTree.getChild(1);
        String rightTableAlias = null;
        if (right.getToken().getType() == HiveASTParser.TOK_TABREF
                || right.getToken().getType() == HiveASTParser.TOK_SUBQUERY
                || right.getToken().getType() == HiveASTParser.TOK_PTBLFUNCTION) {
            String tableName =
                    HiveParserBaseSemanticAnalyzer.getUnescapedUnqualifiedTableName(
                                    (HiveParserASTNode) right.getChild(0))
                            .toLowerCase();
            rightTableAlias =
                    right.getChildCount() == 1
                            ? tableName
                            : unescapeIdentifier(
                                    right.getChild(right.getChildCount() - 1)
                                            .getText()
                                            .toLowerCase());
            rightTableAlias =
                    right.getToken().getType() == HiveASTParser.TOK_PTBLFUNCTION
                            ? unescapeIdentifier(right.getChild(1).getText().toLowerCase())
                            : rightTableAlias;
            rightRel = aliasToRel.get(rightTableAlias);
        } else {
            assert (false);
        }

        // 4. Get Join Condn
        HiveParserASTNode joinCond = (HiveParserASTNode) joinParseTree.getChild(2);

        // 5. Create Join rel
        return genJoinRelNode(
                leftRel, leftTableAlias, rightRel, rightTableAlias, hiveJoinType, joinCond);
    }