This is an automated email from the ASF dual-hosted git repository. cambyzju pushed a commit to branch struct-type in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/struct-type by this push: new a6c471bcdb [feature](struct-type) add children column when create table (#15089) a6c471bcdb is described below commit a6c471bcdb1a88a32ab49fc58d83b1143b20b543 Author: carlvinhust2012 <huchengha...@126.com> AuthorDate: Wed Dec 21 14:25:52 2022 +0800 [feature](struct-type) add children column when create table (#15089) --- .../main/java/org/apache/doris/catalog/Column.java | 63 +++++++++++++--------- .../java/org/apache/doris/catalog/StructType.java | 5 ++ .../main/java/org/apache/doris/catalog/Type.java | 4 +- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java index 532a49b0eb..4b00ca9458 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java @@ -57,6 +57,7 @@ public class Column implements Writable { public static final String DELETE_SIGN = "__DORIS_DELETE_SIGN__"; public static final String SEQUENCE_COL = "__DORIS_SEQUENCE_COL__"; private static final String COLUMN_ARRAY_CHILDREN = "item"; + private static final String COLUMN_STRUCT_CHILDREN = "field"; public static final int COLUMN_UNIQUE_ID_INIT_VALUE = -1; @SerializedName(value = "name") @@ -185,6 +186,13 @@ public class Column implements Writable { Column c = new Column(COLUMN_ARRAY_CHILDREN, ((ArrayType) type).getItemType()); c.setIsAllowNull(((ArrayType) type).getContainsNull()); column.addChildrenColumn(c); + } else if (type.isStructType()) { + ArrayList<StructField> fileds = ((StructType) type).getFields(); + for (StructField field : fileds) { + Column c = new Column(COLUMN_STRUCT_CHILDREN, field.getType()); + // c.setIsAllowNull(field.getContainsNull()); + column.addChildrenColumn(c); + } } } @@ -395,34 +403,41 @@ public class Column implements Writable { return tColumn; } + private void setChildrenTColumn(Column children, TColumn tColumn) { + TColumn childrenTColumn = new TColumn(); + childrenTColumn.setColumnName(children.name); + + TColumnType childrenTColumnType = new TColumnType(); + childrenTColumnType.setType(children.getDataType().toThrift()); + childrenTColumnType.setLen(children.getStrLen()); + childrenTColumnType.setPrecision(children.getPrecision()); + childrenTColumnType.setScale(children.getScale()); + childrenTColumnType.setIndexLen(children.getOlapColumnIndexSize()); + + childrenTColumn.setColumnType(childrenTColumnType); + childrenTColumn.setIsAllowNull(children.isAllowNull()); + // TODO: If we don't set the aggregate type for children, the type will be + // considered as TAggregationType::SUM after deserializing in BE. + // For now, we make children inherit the aggregate type from their parent. + if (tColumn.getAggregationType() != null) { + childrenTColumn.setAggregationType(tColumn.getAggregationType()); + } + + tColumn.children_column.add(childrenTColumn); + toChildrenThrift(children, childrenTColumn); + } + private void toChildrenThrift(Column column, TColumn tColumn) { if (column.type.isArrayType()) { Column children = column.getChildren().get(0); - - TColumn childrenTColumn = new TColumn(); - childrenTColumn.setColumnName(children.name); - - TColumnType childrenTColumnType = new TColumnType(); - childrenTColumnType.setType(children.getDataType().toThrift()); - childrenTColumnType.setType(children.getDataType().toThrift()); - childrenTColumnType.setLen(children.getStrLen()); - childrenTColumnType.setPrecision(children.getPrecision()); - childrenTColumnType.setScale(children.getScale()); - - childrenTColumnType.setIndexLen(children.getOlapColumnIndexSize()); - childrenTColumn.setColumnType(childrenTColumnType); - childrenTColumn.setIsAllowNull(children.isAllowNull()); - // TODO: If we don't set the aggregate type for children, the type will be - // considered as TAggregationType::SUM after deserializing in BE. - // For now, we make children inherit the aggregate type from their parent. - if (tColumn.getAggregationType() != null) { - childrenTColumn.setAggregationType(tColumn.getAggregationType()); - } - tColumn.setChildrenColumn(new ArrayList<>()); - tColumn.children_column.add(childrenTColumn); - - toChildrenThrift(children, childrenTColumn); + setChildrenTColumn(children, tColumn); + } else if (column.type.isStructType()) { + List<Column> childrenColumns = column.getChildren(); + tColumn.setChildrenColumn(new ArrayList<>()); + for (Column children : childrenColumns) { + setChildrenTColumn(children, tColumn); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/StructType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/StructType.java index e3ffa3a521..d5c74b9958 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/StructType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/StructType.java @@ -93,6 +93,11 @@ public class StructType extends Type { fieldMap.clear(); } + @Override + public PrimitiveType getPrimitiveType() { + return PrimitiveType.STRUCT; + } + @Override public boolean equals(Object other) { if (!(other instanceof StructType)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java index 74cab46808..1aa81c7f22 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java @@ -367,7 +367,7 @@ public abstract class Type { } public boolean isCollectionType() { - return isMapType() || isArrayType() || isMultiRowType(); + return isMapType() || isArrayType() || isMultiRowType() || isStructType(); } public boolean isMapType() { @@ -492,6 +492,8 @@ public abstract class Type { && !sourceType.isNull()) { // TODO: current not support cast any non-array type(except for null) to nested array type. return false; + } else if (targetType.isStructType() && sourceType.isStringType()) { + return true; } return sourceType.isNull() || sourceType.getPrimitiveType().isCharFamily(); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org