4 Commits

Author SHA1 Message Date
jerryjzhang
e0f7ec0f40 [improvement][headless]Add modelId to QueryColumn.
Some checks are pending
supersonic CentOS CI / build (21) (push) Waiting to run
supersonic mac CI / build (21) (push) Waiting to run
supersonic ubuntu CI / build (21) (push) Waiting to run
supersonic windows CI / build (21) (push) Waiting to run
2025-01-04 22:25:49 +08:00
jerryjzhang
7b46ef64fd [fix][headless]Fix getModelList filter issue. 2025-01-04 22:25:45 +08:00
lxwcodemonkey
6af345044a (fix)(headless) fix schemaItem useCnt always 0 2025-01-04 22:25:39 +08:00
lxwcodemonkey
4821f31e15 (improvement)(headless) Avoiding incorrect showType caused by converting header fields to lowercase 2025-01-04 22:25:32 +08:00
8 changed files with 64 additions and 33 deletions

View File

@@ -17,6 +17,7 @@ public class QueryColumn {
private String dataFormatType;
private DataFormat dataFormat;
private String comment;
private Long modelId;
public QueryColumn(String nameEn, String type) {
this.type = type;

View File

@@ -34,6 +34,8 @@ public class MetaFilter {
private List<String> names;
private List<String> bizNames;
private List<String> fieldsDepend;
private Integer isTag;

View File

@@ -13,6 +13,8 @@ public class ItemUseReq {
private String startTime;
private Long modelId;
private Long dataSetId;
private List<Long> dataSetIds;
private List<Long> modelIds;
private Boolean cacheEnable = true;
private String metric;

View File

@@ -54,6 +54,12 @@ public class ModelRepositoryImpl implements ModelRepository {
if (!CollectionUtils.isEmpty(modelFilter.getModelIds())) {
wrapper.lambda().in(ModelDO::getId, modelFilter.getModelIds());
}
if (!CollectionUtils.isEmpty(modelFilter.getNames())) {
wrapper.lambda().in(ModelDO::getName, modelFilter.getNames());
}
if (!CollectionUtils.isEmpty(modelFilter.getBizNames())) {
wrapper.lambda().in(ModelDO::getBizName, modelFilter.getBizNames());
}
if (modelFilter.getIncludesDetail() != null && !modelFilter.getIncludesDetail()) {
wrapper.select(ModelDO.class, modelDO -> !modelDO.getColumn().equals("model_detail"));
}

View File

@@ -12,6 +12,7 @@ import com.tencent.supersonic.headless.server.persistence.mapper.StatMapper;
import com.tencent.supersonic.headless.server.persistence.repository.StatRepository;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;
@@ -82,7 +83,12 @@ public class StatRepositoryImpl implements StatRepository {
if (Objects.nonNull(itemUseReq.getMetric())) {
queryWrapper.lambda().like(QueryStatDO::getMetrics, itemUseReq.getMetric());
}
if (Objects.nonNull(itemUseReq.getDataSetId())) {
queryWrapper.lambda().eq(QueryStatDO::getDataSetId, itemUseReq.getDataSetId());
}
if (CollectionUtils.isNotEmpty(itemUseReq.getDataSetIds())) {
queryWrapper.lambda().in(QueryStatDO::getDataSetId, itemUseReq.getDataSetIds());
}
return statMapper.selectList(queryWrapper);
}

View File

@@ -14,6 +14,7 @@ import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
import com.tencent.supersonic.headless.api.pojo.enums.SchemaType;
import com.tencent.supersonic.headless.api.pojo.request.DataSetFilterReq;
@@ -280,7 +281,9 @@ public class SchemaServiceImpl implements SchemaService {
}
private void fillCnt(List<DataSetSchemaResp> dataSetSchemaResps, List<ItemUseResp> statInfos) {
if (CollectionUtils.isEmpty(statInfos)) {
return;
}
Map<String, ItemUseResp> typeIdAndStatPair = statInfos.stream()
.collect(Collectors.toMap(
itemUseInfo -> itemUseInfo.getType() + AT_SYMBOL + AT_SYMBOL
@@ -296,40 +299,41 @@ public class SchemaServiceImpl implements SchemaService {
private void fillMetricCnt(DataSetSchemaResp dataSetSchemaResp,
Map<String, ItemUseResp> typeIdAndStatPair) {
List<MetricSchemaResp> metrics = dataSetSchemaResp.getMetrics();
if (CollectionUtils.isEmpty(dataSetSchemaResp.getMetrics())) {
if (CollectionUtils.isEmpty(metrics)) {
return;
}
if (!CollectionUtils.isEmpty(metrics)) {
metrics.stream().forEach(metric -> {
String key = TypeEnums.METRIC.name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
+ metric.getBizName();
if (typeIdAndStatPair.containsKey(key)) {
metric.setUseCnt(typeIdAndStatPair.get(key).getUseCnt());
}
});
}
metrics.forEach(metric -> {
metric.setUseCnt(getItemCnt(metric, typeIdAndStatPair));
});
dataSetSchemaResp.setMetrics(metrics);
}
private void fillDimCnt(DataSetSchemaResp dataSetSchemaResp,
Map<String, ItemUseResp> typeIdAndStatPair) {
List<DimSchemaResp> dimensions = dataSetSchemaResp.getDimensions();
if (CollectionUtils.isEmpty(dataSetSchemaResp.getDimensions())) {
if (CollectionUtils.isEmpty(dimensions)) {
return;
}
if (!CollectionUtils.isEmpty(dimensions)) {
dimensions.stream().forEach(dim -> {
String key = TypeEnums.DIMENSION.name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
+ dim.getBizName();
if (typeIdAndStatPair.containsKey(key)) {
dim.setUseCnt(typeIdAndStatPair.get(key).getUseCnt());
}
});
}
dimensions.forEach(dim -> {
dim.setUseCnt(getItemCnt(dim, typeIdAndStatPair));
});
dataSetSchemaResp.setDimensions(dimensions);
}
private Long getItemCnt(SchemaItem schemaItem, Map<String, ItemUseResp> typeIdAndStatPair) {
String bizNameKey = schemaItem.getTypeEnum().name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
+ schemaItem.getBizName();
String nameKey = schemaItem.getTypeEnum().name().toLowerCase() + AT_SYMBOL + AT_SYMBOL
+ schemaItem.getName();
if (typeIdAndStatPair.containsKey(bizNameKey)) {
return typeIdAndStatPair.get(bizNameKey).getUseCnt();
}
if (typeIdAndStatPair.containsKey(nameKey)) {
return typeIdAndStatPair.get(nameKey).getUseCnt();
}
return 0L;
}
@Override
public DimensionResp getDimension(String bizName, Long modelId) {
return dimensionService.getDimension(bizName, modelId);
@@ -469,7 +473,7 @@ public class SchemaServiceImpl implements SchemaService {
List<Long> dataSetIds = dataSetSchemaResps.stream().map(DataSetSchemaResp::getId)
.collect(Collectors.toList());
ItemUseReq itemUseReq = new ItemUseReq();
itemUseReq.setModelIds(dataSetIds);
itemUseReq.setDataSetIds(dataSetIds);
List<ItemUseResp> statInfos = getStatInfo(itemUseReq);
log.debug("statInfos:{}", statInfos);

View File

@@ -4,10 +4,7 @@ import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.headless.api.pojo.enums.SemanticType;
import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq;
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
import com.tencent.supersonic.headless.api.pojo.response.MetricSchemaResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.api.pojo.response.*;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
import lombok.extern.slf4j.Slf4j;
@@ -39,11 +36,13 @@ public class QueryUtils {
public void populateQueryColumns(SemanticQueryResp semanticQueryResp,
SemanticSchemaResp semanticSchemaResp) {
Map<String, MetricResp> metricRespMap = createMetricRespMap(semanticSchemaResp);
Map<String, DimensionResp> dimensionRespMap = createDimRespMap(semanticSchemaResp);
Map<String, String> namePair = new HashMap<>();
Map<String, String> nameTypePair = new HashMap<>();
populateNamePairs(semanticSchemaResp, namePair, nameTypePair);
List<QueryColumn> columns = semanticQueryResp.getColumns();
columns.forEach(column -> processColumn(column, namePair, nameTypePair, metricRespMap));
columns.forEach(column -> processColumn(column, namePair, nameTypePair, metricRespMap,
dimensionRespMap));
}
private Map<String, MetricResp> createMetricRespMap(SemanticSchemaResp semanticSchemaResp) {
@@ -52,6 +51,12 @@ public class QueryUtils {
.collect(Collectors.toMap(MetricResp::getBizName, a -> a, (k1, k2) -> k1));
}
private Map<String, DimensionResp> createDimRespMap(SemanticSchemaResp semanticSchemaResp) {
List<DimSchemaResp> dimensions = semanticSchemaResp.getDimensions();
return dimensions.stream()
.collect(Collectors.toMap(DimensionResp::getBizName, a -> a, (k1, k2) -> k1));
}
private void populateNamePairs(SemanticSchemaResp semanticSchemaResp,
Map<String, String> namePair, Map<String, String> nameTypePair) {
semanticSchemaResp.getMetrics().forEach(metricDesc -> {
@@ -65,8 +70,9 @@ public class QueryUtils {
}
private void processColumn(QueryColumn column, Map<String, String> namePair,
Map<String, String> nameTypePair, Map<String, MetricResp> metricRespMap) {
String nameEn = getName(column.getNameEn().toLowerCase());
Map<String, String> nameTypePair, Map<String, MetricResp> metricRespMap,
Map<String, DimensionResp> dimensionRespMap) {
String nameEn = getName(column.getNameEn());
if (nameEn.contains(JOIN_UNDERLINE)) {
nameEn = nameEn.split(JOIN_UNDERLINE)[1];
}
@@ -98,6 +104,10 @@ public class QueryUtils {
if (metricRespMap.containsKey(nameEn)) {
column.setDataFormatType(metricRespMap.get(nameEn).getDataFormatType());
column.setDataFormat(metricRespMap.get(nameEn).getDataFormat());
column.setModelId(metricRespMap.get(nameEn).getModelId());
}
if (dimensionRespMap.containsKey(nameEn)) {
column.setModelId(dimensionRespMap.get(nameEn).getModelId());
}
// set name by NameEn
if (StringUtils.isBlank(column.getName()) && StringUtils.isNotBlank(column.getNameEn())) {

View File

@@ -137,8 +137,8 @@ public class StatUtils {
QueryStat queryStatInfo = new QueryStat();
List<String> aggFields = SqlSelectHelper.getAggregateFields(querySqlReq.getSql());
List<String> allFields = SqlSelectHelper.getAllSelectFields(querySqlReq.getSql());
List<String> dimensions =
allFields.stream().filter(aggFields::contains).collect(Collectors.toList());
List<String> dimensions = allFields.stream().filter(field -> !aggFields.contains(field))
.collect(Collectors.toList());
String userName = getUserName(facadeUser);
try {