public Node visitCreateTableStatement()

in fastmodel-transform/fastmodel-transform-hive/src/main/java/com/aliyun/fastmodel/transform/hive/parser/HiveAstBuilder.java [105:185]


    public Node visitCreateTableStatement(CreateTableStatementContext ctx) {
        TerminalNode terminalNode = ctx.KW_LIKE();
        if (terminalNode != null) {
            QualifiedName visit = (QualifiedName)visit(ctx.tableName(0));
            TablePropertiesPrefixedContext tablePropertiesPrefixedContext = ctx.tablePropertiesPrefixed();
            List<Property> list = ImmutableList.of();
            if (tablePropertiesPrefixedContext != null) {
                list = ParserHelper.visit(this,
                    tablePropertiesPrefixedContext.tableProperties().tablePropertiesList().keyProperty(),
                    Property.class);
            }
            return new CloneTable(
                CreateElement.builder()
                    .qualifiedName(visit)
                    .properties(list)
                    .build(),
                reverseContext.getReverseTableType(),
                (QualifiedName)visit(ctx.tableName(1))
            );
        } else {
            // 表名
            QualifiedName tableName = (QualifiedName)visit(ctx.tableName(0));
            // 描述
            Comment comment = null;
            if (ctx.tableComment() != null) {
                comment = (Comment)visit(ctx.tableComment());
            }
            // properties
            List<Property> all = Lists.newArrayList(reverseContext.getProperties() == null ? Lists.newArrayList() : reverseContext.getProperties());
            List<Property> properties = ImmutableList.of();
            if (ctx.tablePropertiesPrefixed() != null) {
                properties = ParserHelper.visit(this,
                    ctx.tablePropertiesPrefixed().tableProperties().tablePropertiesList().keyValueProperty(),
                    Property.class);
                all.addAll(properties);
            }
            // 外表属性
            buildExternalProperties(ctx, all);
            // constraint
            ColumnNameTypeOrConstraintListContext columnNameTypeOrConstraintListContext
                = ctx.columnNameTypeOrConstraintList();
            List<Node> nodes = Lists.newArrayListWithCapacity(64);
            if (columnNameTypeOrConstraintListContext != null) {
                nodes = ParserHelper.visit(
                    this,
                    columnNameTypeOrConstraintListContext.columnNameTypeOrConstraint(),
                    Node.class
                );
            }
            //all columns
            List<ColumnDefinition> list = nodes.stream().filter(
                node -> {
                    return node instanceof ColumnDefinition;
                }
            ).map(x -> {
                return (ColumnDefinition)x;
            }).collect(Collectors.toList());

            List<BaseConstraint> constraints = nodes.stream().filter(
                node -> {
                    return node instanceof BaseConstraint;
                }
            ).map(x -> {
                return (BaseConstraint)x;
            }).collect(Collectors.toList());

            PartitionedBy partitionBy = ParserHelper.visitIfPresent(this, ctx.tablePartition(), PartitionedBy.class)
                .orElse(null);

            return CreateTable.builder()
                .tableName(tableName)
                .detailType(reverseContext.getReverseTableType())
                .ifNotExist(ctx.ifNotExists() != null)
                .columns(list)
                .constraints(constraints)
                .partition(partitionBy)
                .comment(comment)
                .properties(all)
                .build();
        }
    }