in core/src/main/java/org/apache/carbondata/core/metadata/schema/table/TableSchemaBuilder.java [163:259]
private ColumnSchema addColumn(StructField field, String parentName, AtomicInteger valIndex,
boolean isSortColumn, boolean isComplexChild, boolean isInvertedIdxColumn) {
Objects.requireNonNull(field);
if (isComplexChild) {
// if field is complex then append parent name to the child field to check
// if any other field with same name exists
checkRepeatColumnName(field, parentName);
} else {
checkRepeatColumnName(field);
}
ColumnSchema newColumn = new ColumnSchema();
if (parentName != null) {
newColumn.setColumnName(parentName + "." + field.getFieldName());
} else {
newColumn.setColumnName(field.getFieldName());
}
newColumn.setDataType(field.getDataType());
newColumn.setDimensionColumn(isSortColumn || field.getDataType() == DataTypes.STRING
|| field.getDataType() == DataTypes.VARCHAR || field.getDataType() == DataTypes.DATE
|| field.getDataType() == DataTypes.TIMESTAMP || field.getDataType() == DataTypes.BINARY
|| field.getDataType().isComplexType() || (isComplexChild));
if (!isComplexChild) {
newColumn.setSchemaOrdinal(ordinal++);
} else {
// child column should not be counted for schema ordinal
newColumn.setSchemaOrdinal(-1);
}
// For NonTransactionalTable, multiple sdk writer output with same column name can be placed in
// single folder for query.
// That time many places in code, columnId check will fail. To avoid that
// keep column ID as same as column name.
// Anyhow Alter table is not supported for NonTransactionalTable.
// SO, this will not have any impact.
newColumn.setColumnUniqueId(field.getFieldName());
newColumn.setColumnReferenceId(newColumn.getColumnUniqueId());
newColumn
.setEncodingList(createEncoding(field.getDataType(), isInvertedIdxColumn, isComplexChild));
if (field.getDataType().isComplexType()) {
if (DataTypes.isArrayType(field.getDataType()) || DataTypes.isMapType(field.getDataType())) {
newColumn.setNumberOfChild(1);
} else {
newColumn.setNumberOfChild(((StructType) field.getDataType()).getFields().size());
}
}
if (DataTypes.isDecimal(field.getDataType())) {
DecimalType decimalType = (DecimalType) field.getDataType();
newColumn.setPrecision(decimalType.getPrecision());
newColumn.setScale(decimalType.getScale());
}
if (!isSortColumn) {
if (!newColumn.isDimensionColumn()) {
measures.add(newColumn);
} else if (DataTypes.isStructType(field.getDataType()) || DataTypes
.isArrayType(field.getDataType()) || DataTypes.isMapType(field.getDataType())
|| isComplexChild) {
complex.add(newColumn);
} else {
if (field.getDataType() == DataTypes.VARCHAR) {
varCharColumns.add(newColumn);
} else {
dimension.add(newColumn);
}
}
} else {
newColumn.setSortColumn(true);
sortColumns.add(newColumn);
}
if (field.getDataType().isComplexType()) {
String parentFieldName = newColumn.getColumnName();
if (DataTypes.isArrayType(field.getDataType())) {
for (StructField structField : field.getChildren()) {
String colName = getColNameForArray(valIndex);
if (null != ((ArrayType) field.getDataType()).getElementName()) {
colName = ((ArrayType) field.getDataType()).getElementName();
}
structField.setFieldName(colName);
addColumn(structField, parentFieldName, valIndex, false, true, isInvertedIdxColumn);
}
} else if (DataTypes.isStructType(field.getDataType())
&& ((StructType) field.getDataType()).getFields().size() > 0) {
// This field has children.
if (field.getChildren() != null) {
for (StructField structField : field.getChildren()) {
addColumn(structField, parentFieldName, valIndex, false, true, isInvertedIdxColumn);
}
}
} else if (DataTypes.isMapType(field.getDataType())) {
for (StructField structField : field.getChildren()) {
structField.setFieldName(getColNameForArray(valIndex));
addColumn(structField, parentFieldName, valIndex, false, true, isInvertedIdxColumn);
}
}
}
// todo: need more information such as long_string_columns
return newColumn;
}