in src/modeling-service/src/main/java/org/apache/kylin/rest/service/ModelSemanticHelper.java [371:447]
private List<NDataModel.NamedColumn> convertNamedColumns(String project, NDataModel dataModel,
ModelRequest modelRequest) {
NTableMetadataManager tableManager = NTableMetadataManager.getInstance(KylinConfig.getInstanceFromEnv(),
project);
List<JoinTableDesc> allTables = Lists.newArrayList();
val rootFactTable = new JoinTableDesc();
rootFactTable.setTable(dataModel.getRootFactTableName());
rootFactTable.setAlias(dataModel.getRootFactTableAlias());
rootFactTable.setKind(NDataModel.TableKind.FACT);
allTables.add(rootFactTable);
allTables.addAll(dataModel.getJoinTables());
List<NDataModel.NamedColumn> simplifiedColumns = modelRequest.getSimplifiedDimensions();
Map<String, NDataModel.NamedColumn> dimensionNameMap = Maps.newHashMap();
for (NDataModel.NamedColumn namedColumn : simplifiedColumns) {
dimensionNameMap.put(namedColumn.getAliasDotColumn(), namedColumn);
}
Map<String, NDataModel.NamedColumn> otherColumnNameMap = Maps.newHashMap();
for (NDataModel.NamedColumn namedColumn : modelRequest.getOtherColumns()) {
otherColumnNameMap.put(namedColumn.getAliasDotColumn(), namedColumn);
}
int id = 0;
List<NDataModel.NamedColumn> columns = Lists.newArrayList();
for (JoinTableDesc joinTable : allTables) {
val tableDesc = tableManager.getTableDesc(joinTable.getTable());
boolean isFact = joinTable.getKind() == NDataModel.TableKind.FACT;
val alias = StringUtils.isEmpty(joinTable.getAlias()) ? tableDesc.getName() : joinTable.getAlias();
for (ColumnDesc column : modelRequest.getColumnsFetcher().apply(tableDesc, !isFact)) {
val namedColumn = new NDataModel.NamedColumn();
namedColumn.setId(id++);
namedColumn.setName(column.getName());
namedColumn.setAliasDotColumn(alias + "." + column.getName());
namedColumn.setStatus(NDataModel.ColumnStatus.EXIST);
val dimension = dimensionNameMap.get(namedColumn.getAliasDotColumn());
if (dimension != null) {
namedColumn.setStatus(NDataModel.ColumnStatus.DIMENSION);
namedColumn.setName(dimension.getName());
}
if (otherColumnNameMap.get(namedColumn.getAliasDotColumn()) != null) {
namedColumn.setName(otherColumnNameMap.get(namedColumn.getAliasDotColumn()).getName());
}
columns.add(namedColumn);
}
}
Map<String, ComputedColumnDesc> ccMap = dataModel.getComputedColumnDescs().stream()
.collect(Collectors.toMap(ComputedColumnDesc::getFullName, Function.identity()));
List<ComputedColumnDesc> orderedCCList = Lists.newArrayList();
NDataModel originModel = getManager(NDataModelManager.class, project).getDataModelDesc(dataModel.getUuid());
if (originModel != null && !originModel.isBroken()) {
originModel.getAllNamedColumns().stream().filter(NamedColumn::isExist)
.filter(column -> ccMap.containsKey(column.getAliasDotColumn())) //
.forEach(column -> {
ComputedColumnDesc cc = ccMap.get(column.getAliasDotColumn());
orderedCCList.add(cc);
ccMap.remove(column.getAliasDotColumn());
});
orderedCCList.addAll(ccMap.values());
} else {
orderedCCList.addAll(dataModel.getComputedColumnDescs());
}
for (ComputedColumnDesc computedColumnDesc : orderedCCList) {
NDataModel.NamedColumn namedColumn = new NDataModel.NamedColumn();
namedColumn.setId(id++);
namedColumn.setName(computedColumnDesc.getColumnName());
namedColumn.setAliasDotColumn(computedColumnDesc.getFullName());
namedColumn.setStatus(NDataModel.ColumnStatus.EXIST);
val dimension = dimensionNameMap.get(namedColumn.getAliasDotColumn());
if (dimension != null) {
namedColumn.setStatus(NDataModel.ColumnStatus.DIMENSION);
namedColumn.setName(dimension.getName());
}
columns.add(namedColumn);
}
return columns;
}