public Node visitJoinRelation()

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