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