in fastmodel-parser/src/main/java/com/aliyun/fastmodel/parser/visitor/QueryVisitor.java [469:519]
public Node visitJoinRelation(JoinRelationContext ctx) {
BaseRelation left = (BaseRelation)visit(ctx.left);
BaseRelation right;
if (ctx.KW_CROSS() != null) {
right = (BaseRelation)visit(ctx.right);
return new Join(JoinToken.CROSS, left, right, null);
}
JoinCriteria criteria;
if (ctx.KW_NATURAL() != null) {
right = (BaseRelation)visit(ctx.right);
criteria = new NaturalJoin();
} else {
right = (BaseRelation)visit(ctx.rightRelation);
if (ctx.joinCriteria().KW_ON() != null) {
criteria = new JoinOn((BaseExpression)visit(ctx.joinCriteria().expression()));
} else if (ctx.joinCriteria().KW_USING() != null) {
criteria = new JoinUsing(visit(ctx.joinCriteria().identifier(), Identifier.class));
} else {
throw new IllegalArgumentException("Unsupported join criteria");
}
}
JoinToken joinToken = null;
boolean isOuter = ctx.joinType().KW_OUTER() != null;
if (ctx.joinType().KW_LEFT() != null) {
if (isOuter) {
joinToken = JoinToken.LEFT_OUTER;
} else {
joinToken = JoinToken.LEFT;
}
} else if (ctx.joinType().KW_RIGHT() != null) {
if (isOuter) {
joinToken = JoinToken.RIGHT_OUTER;
} else {
joinToken = JoinToken.RIGHT;
}
} else if (ctx.joinType().KW_FULL() != null) {
if (isOuter) {
joinToken = JoinToken.FULL_OUTER;
} else {
joinToken = JoinToken.FULL;
}
} else if (ctx.joinType().KW_INNER() != null) {
joinToken = JoinToken.INNER;
} else {
joinToken = JoinToken.NULL;
}
return new Join(joinToken, left, right, criteria);
}