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);
}