mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:51:00 +00:00
[improvement](materialization) materializationZipperUtils support array type (#289)
This commit is contained in:
@@ -30,10 +30,10 @@ import com.tencent.supersonic.semantic.materialization.domain.pojo.Materializati
|
|||||||
import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationElementRepository;
|
import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationElementRepository;
|
||||||
import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRepository;
|
import com.tencent.supersonic.semantic.materialization.domain.repository.MaterializationRepository;
|
||||||
import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationConverter;
|
import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationConverter;
|
||||||
import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationUtils;
|
|
||||||
import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationZipperUtils;
|
import com.tencent.supersonic.semantic.materialization.domain.utils.MaterializationZipperUtils;
|
||||||
import com.tencent.supersonic.semantic.model.domain.DatasourceService;
|
import com.tencent.supersonic.semantic.model.domain.DatasourceService;
|
||||||
import com.tencent.supersonic.semantic.model.domain.ModelService;
|
import com.tencent.supersonic.semantic.model.domain.ModelService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -44,6 +44,7 @@ import java.util.Objects;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -58,16 +59,18 @@ public class MaterializationConfServiceImpl implements MaterializationConfServic
|
|||||||
private final MaterializationElementRepository materializationElementRepository;
|
private final MaterializationElementRepository materializationElementRepository;
|
||||||
private final ModelService modelService;
|
private final ModelService modelService;
|
||||||
private final DatasourceService datasourceService;
|
private final DatasourceService datasourceService;
|
||||||
|
private final MaterializationZipperUtils materializationZipperUtils;
|
||||||
private String typeAndIdSplit = "_";
|
private String typeAndIdSplit = "_";
|
||||||
|
|
||||||
public MaterializationConfServiceImpl(MaterializationRepository materializationRepository,
|
public MaterializationConfServiceImpl(MaterializationRepository materializationRepository,
|
||||||
MaterializationElementRepository materializationElementRepository,
|
MaterializationElementRepository materializationElementRepository,
|
||||||
ModelService modelService, DatasourceService datasourceService) {
|
ModelService modelService, DatasourceService datasourceService,
|
||||||
|
MaterializationZipperUtils materializationZipperUtils) {
|
||||||
this.materializationRepository = materializationRepository;
|
this.materializationRepository = materializationRepository;
|
||||||
this.materializationElementRepository = materializationElementRepository;
|
this.materializationElementRepository = materializationElementRepository;
|
||||||
|
|
||||||
this.modelService = modelService;
|
this.modelService = modelService;
|
||||||
this.datasourceService = datasourceService;
|
this.datasourceService = datasourceService;
|
||||||
|
this.materializationZipperUtils = materializationZipperUtils;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -145,7 +148,7 @@ public class MaterializationConfServiceImpl implements MaterializationConfServic
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void fillElementInfo(List<MaterializationElementResp> materializationElementRespList,
|
private void fillElementInfo(List<MaterializationElementResp> materializationElementRespList,
|
||||||
Map<String, SchemaItem> keyAndSchemaItemPair) {
|
Map<String, SchemaItem> keyAndSchemaItemPair) {
|
||||||
if (CollectionUtils.isEmpty(materializationElementRespList) || Objects.isNull(keyAndSchemaItemPair)) {
|
if (CollectionUtils.isEmpty(materializationElementRespList) || Objects.isNull(keyAndSchemaItemPair)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -243,8 +246,7 @@ public class MaterializationConfServiceImpl implements MaterializationConfServic
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String generateCreateSql(MaterializationResp materializationResp) {
|
private String generateCreateSql(MaterializationResp materializationResp) {
|
||||||
MaterializationUtils materializationUtils = new MaterializationZipperUtils();
|
return materializationZipperUtils.generateCreateSql(materializationResp);
|
||||||
return materializationUtils.generateCreateSql(materializationResp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -260,7 +262,7 @@ public class MaterializationConfServiceImpl implements MaterializationConfServic
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void doDimensionMaterializationLogic(List<DimSchemaResp> dimensions,
|
private void doDimensionMaterializationLogic(List<DimSchemaResp> dimensions,
|
||||||
MaterializationResp materializationResp, User user) {
|
MaterializationResp materializationResp, User user) {
|
||||||
if (CollectionUtils.isEmpty(dimensions)) {
|
if (CollectionUtils.isEmpty(dimensions)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,37 @@
|
|||||||
package com.tencent.supersonic.semantic.materialization.domain.utils;
|
package com.tencent.supersonic.semantic.materialization.domain.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
|
||||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||||
import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum;
|
import com.tencent.supersonic.semantic.api.materialization.enums.ElementFrequencyEnum;
|
||||||
import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum;
|
import com.tencent.supersonic.semantic.api.materialization.enums.ElementTypeEnum;
|
||||||
import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp;
|
import com.tencent.supersonic.semantic.api.materialization.response.MaterializationElementResp;
|
||||||
import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp;
|
import com.tencent.supersonic.semantic.api.materialization.response.MaterializationResp;
|
||||||
|
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
|
||||||
|
import com.tencent.supersonic.semantic.model.domain.DimensionService;
|
||||||
import org.apache.logging.log4j.util.Strings;
|
import org.apache.logging.log4j.util.Strings;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class MaterializationZipperUtils implements MaterializationUtils {
|
public class MaterializationZipperUtils implements MaterializationUtils {
|
||||||
|
|
||||||
private String split = "_";
|
private String split = "_";
|
||||||
private String createPatter = "CREATE TABLE IF NOT EXISTS `#{tableName}` (\n"
|
private String createPatter = "CREATE TABLE IF NOT EXISTS `#{tableName}` (\n"
|
||||||
+ " `end_date` date NOT NULL COMMENT '日期',\n"
|
+ " `end_sys_imp_date` date NOT NULL COMMENT '日期',\n"
|
||||||
+ " `id` int(11) NOT NULL COMMENT 'id',\n"
|
+ " `id` int(11) NOT NULL COMMENT 'id',\n"
|
||||||
+ " `start_date` date NULL,\n"
|
+ " `start_sys_imp_date` date NULL,\n"
|
||||||
+ " #{columnInfo}\n"
|
+ " #{columnInfo}\n"
|
||||||
+ " ) ENGINE=OLAP\n"
|
+ " ) ENGINE=OLAP\n"
|
||||||
+ "UNIQUE KEY(`end_date`, `id`)\n"
|
+ "UNIQUE KEY(`end_sys_imp_date`, `id`)\n"
|
||||||
+ "COMMENT 'OLAP'\n"
|
+ "COMMENT 'OLAP'\n"
|
||||||
+ "PARTITION BY RANGE(`end_date`)\n"
|
+ "PARTITION BY RANGE(`end_sys_imp_date`)\n"
|
||||||
+ "(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))\n"
|
+ "(PARTITION p99991230 VALUES [('9999-12-30'), ('9999-12-31')))\n"
|
||||||
+ "DISTRIBUTED BY HASH(`id`) BUCKETS 9\n"
|
+ "DISTRIBUTED BY HASH(`id`) BUCKETS 9\n"
|
||||||
+ "PROPERTIES (\n"
|
+ "PROPERTIES (\n"
|
||||||
@@ -40,6 +45,13 @@ public class MaterializationZipperUtils implements MaterializationUtils {
|
|||||||
+ "\"enable_single_replica_compaction\" = \"false\"\n"
|
+ "\"enable_single_replica_compaction\" = \"false\"\n"
|
||||||
+ ");";
|
+ ");";
|
||||||
|
|
||||||
|
|
||||||
|
private final DimensionService dimensionService;
|
||||||
|
|
||||||
|
public MaterializationZipperUtils(DimensionService dimensionService) {
|
||||||
|
this.dimensionService = dimensionService;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String generateCreateSql(MaterializationResp materializationResp) {
|
public String generateCreateSql(MaterializationResp materializationResp) {
|
||||||
List<MaterializationElementResp> materializationElementRespList = materializationResp
|
List<MaterializationElementResp> materializationElementRespList = materializationResp
|
||||||
@@ -48,6 +60,8 @@ public class MaterializationZipperUtils implements MaterializationUtils {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
StringJoiner joiner = new StringJoiner(",");
|
StringJoiner joiner = new StringJoiner(",");
|
||||||
|
Map<Long, DimensionResp> dimIdAndDim = dimensionService.getDimensions(materializationResp.getModelId())
|
||||||
|
.stream().collect(Collectors.toMap(DimensionResp::getId, value -> value, (v1, v2) -> v2));
|
||||||
materializationElementRespList.stream()
|
materializationElementRespList.stream()
|
||||||
.filter(element -> TypeEnums.DIMENSION.equals(element.getType()) && ElementFrequencyEnum.LOW.equals(
|
.filter(element -> TypeEnums.DIMENSION.equals(element.getType()) && ElementFrequencyEnum.LOW.equals(
|
||||||
element.getFrequency()))
|
element.getFrequency()))
|
||||||
@@ -57,11 +71,18 @@ public class MaterializationZipperUtils implements MaterializationUtils {
|
|||||||
element.getElementType())) {
|
element.getElementType())) {
|
||||||
type = "date";
|
type = "date";
|
||||||
}
|
}
|
||||||
String description = element.getDescription().replace("'", "").replace("\"", "");
|
if (dimIdAndDim.containsKey(element.getId())) {
|
||||||
joiner.add(
|
if (DataTypeEnums.ARRAY.equals(dimIdAndDim.get(element.getId()).getDataType())) {
|
||||||
String.format(" %s %s COMMENT '%s'",
|
type = "array<varchar(10000)>";
|
||||||
element.getBizName(), type, description));
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
String description = element.getDescription().replace("'", "")
|
||||||
|
.replace("\"", "");
|
||||||
|
joiner.add(
|
||||||
|
String.format(" `%s` %s COMMENT '%s'",
|
||||||
|
element.getBizName(), type, description));
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Strings.isEmpty(joiner.toString())) {
|
if (Strings.isEmpty(joiner.toString())) {
|
||||||
|
|||||||
Reference in New Issue
Block a user