mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-15 06:27:21 +00:00
[improvement][chat&headless]Remove deprecated system time fields.
This commit is contained in:
@@ -4,26 +4,12 @@ import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.QueryType;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaElement;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaElementMatch;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaMapInfo;
|
||||
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
|
||||
import com.tencent.supersonic.headless.api.pojo.SemanticSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.SqlEvaluation;
|
||||
import com.tencent.supersonic.headless.api.pojo.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.ChatWorkflowState;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DataSetMapInfo;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MapInfoResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MapResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SearchResult;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.*;
|
||||
import com.tencent.supersonic.headless.chat.ChatQueryContext;
|
||||
import com.tencent.supersonic.headless.chat.corrector.GrammarCorrector;
|
||||
import com.tencent.supersonic.headless.chat.corrector.SchemaCorrector;
|
||||
@@ -40,13 +26,7 @@ import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -223,9 +203,6 @@ public class S2ChatLayerService implements ChatLayerService {
|
||||
.sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed())
|
||||
.limit(topN - 1).map(mergeFunction()).collect(Collectors.toSet());
|
||||
|
||||
SchemaElementMatch timeDimensionMatch = getTimeDimension(dataSetId, dataSetName);
|
||||
dimensions.add(timeDimensionMatch);
|
||||
|
||||
// topN metrics
|
||||
Set<SchemaElementMatch> metrics = semanticSchema.getMetrics(dataSetId).stream()
|
||||
.sorted(Comparator.comparing(SchemaElement::getUseCnt).reversed()).limit(topN)
|
||||
@@ -256,20 +233,6 @@ public class S2ChatLayerService implements ChatLayerService {
|
||||
return termMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* * get time dimension SchemaElementMatch
|
||||
*/
|
||||
private SchemaElementMatch getTimeDimension(Long dataSetId, String dataSetName) {
|
||||
SchemaElement element = SchemaElement.builder().dataSetId(dataSetId)
|
||||
.dataSetName(dataSetName).type(SchemaElementType.DIMENSION)
|
||||
.bizName(TimeDimensionEnum.DAY.getName()).build();
|
||||
|
||||
return SchemaElementMatch.builder().element(element)
|
||||
.detectWord(TimeDimensionEnum.DAY.getChName())
|
||||
.word(TimeDimensionEnum.DAY.getChName()).similarity(1L)
|
||||
.frequency(BaseWordBuilder.DEFAULT_FREQUENCY).build();
|
||||
}
|
||||
|
||||
private Function<SchemaElement, SchemaElementMatch> mergeFunction() {
|
||||
return schemaElement -> SchemaElementMatch.builder().element(schemaElement)
|
||||
.frequency(BaseWordBuilder.DEFAULT_FREQUENCY).word(schemaElement.getName())
|
||||
|
||||
@@ -5,8 +5,8 @@ import com.google.common.collect.Sets;
|
||||
import com.tencent.supersonic.common.pojo.QueryColumn;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.headless.api.pojo.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.SemanticType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.*;
|
||||
@@ -206,12 +206,6 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
ModelResp modelResp = modelResps.get(0);
|
||||
String sql = String.format("select distinct %s from %s where 1=1", dimensionResp.getName(),
|
||||
modelResp.getName());
|
||||
List<Dimension> timeDims = modelResp.getTimeDimension();
|
||||
if (CollectionUtils.isNotEmpty(timeDims)) {
|
||||
sql = String.format("%s and %s >= '%s' and %s <= '%s'", sql,
|
||||
TimeDimensionEnum.DAY.getName(), queryDimValueReq.getDateInfo().getStartDate(),
|
||||
TimeDimensionEnum.DAY.getName(), queryDimValueReq.getDateInfo().getEndDate());
|
||||
}
|
||||
if (StringUtils.isNotBlank(queryDimValueReq.getValue())) {
|
||||
sql += " AND " + queryDimValueReq.getBizName() + " LIKE '%"
|
||||
+ queryDimValueReq.getValue() + "%'";
|
||||
@@ -284,6 +278,7 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
&& StringUtils.isNotBlank(semanticQueryReq.getSqlInfo().getQuerySQL())) {
|
||||
queryStatement.setSql(semanticQueryReq.getSqlInfo().getQuerySQL());
|
||||
queryStatement.setDataSetId(semanticQueryReq.getDataSetId());
|
||||
queryStatement.setDataSetName(semanticQueryReq.getDataSetName());
|
||||
queryStatement.setIsTranslated(true);
|
||||
}
|
||||
return queryStatement;
|
||||
@@ -298,6 +293,7 @@ public class S2SemanticLayerService implements SemanticLayerService {
|
||||
QueryStatement queryStatement = new QueryStatement();
|
||||
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
|
||||
queryStatement.setDataSetId(queryReq.getDataSetId());
|
||||
queryStatement.setDataSetName(queryReq.getDataSetName());
|
||||
queryStatement.setSemanticSchema(semanticSchemaResp);
|
||||
queryStatement.setOntology(semanticSchemaManager.buildOntology(semanticSchemaResp));
|
||||
return queryStatement;
|
||||
|
||||
@@ -1,19 +1,10 @@
|
||||
package com.tencent.supersonic.headless.server.manager;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.headless.api.pojo.FieldParam;
|
||||
import com.tencent.supersonic.headless.api.pojo.MeasureParam;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricDefineByFieldParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricDefineByMetricParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricParam;
|
||||
import com.tencent.supersonic.headless.api.pojo.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.FieldParamYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.MeasureYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.MetricParamYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.MetricTypeParamsYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -47,7 +38,7 @@ public class MetricYamlManager {
|
||||
MetricDefineByMeasureParams metricDefineParams =
|
||||
metric.getMetricDefineByMeasureParams();
|
||||
metricTypeParamsYamlTpl.setExpr(metricDefineParams.getExpr());
|
||||
List<MeasureParam> measures = metricDefineParams.getMeasures();
|
||||
List<Measure> measures = metricDefineParams.getMeasures();
|
||||
metricTypeParamsYamlTpl.setMeasures(
|
||||
measures.stream().map(MetricYamlManager::convert).collect(Collectors.toList()));
|
||||
} else if (MetricDefineType.FIELD.equals(metric.getMetricDefineType())) {
|
||||
@@ -68,7 +59,7 @@ public class MetricYamlManager {
|
||||
return metricYamlTpl;
|
||||
}
|
||||
|
||||
public static MeasureYamlTpl convert(MeasureParam measure) {
|
||||
public static MeasureYamlTpl convert(Measure measure) {
|
||||
MeasureYamlTpl measureYamlTpl = new MeasureYamlTpl();
|
||||
measureYamlTpl.setName(measure.getBizName());
|
||||
measureYamlTpl.setConstraint(measure.getConstraint());
|
||||
|
||||
@@ -1,17 +1,10 @@
|
||||
package com.tencent.supersonic.headless.server.manager;
|
||||
|
||||
import com.tencent.supersonic.headless.api.pojo.Dimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.Identify;
|
||||
import com.tencent.supersonic.headless.api.pojo.Measure;
|
||||
import com.tencent.supersonic.headless.api.pojo.ModelDetail;
|
||||
import com.tencent.supersonic.headless.api.pojo.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
|
||||
import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptor;
|
||||
import com.tencent.supersonic.headless.core.adaptor.db.DbAdaptorFactory;
|
||||
import com.tencent.supersonic.headless.core.utils.SysTimeDimensionBuilder;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.DataModelYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionTimeTypeParamsTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.DimensionYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.IdentifyYamlTpl;
|
||||
import com.tencent.supersonic.headless.server.pojo.yaml.MeasureYamlTpl;
|
||||
@@ -30,8 +23,6 @@ public class ModelYamlManager {
|
||||
public static synchronized DataModelYamlTpl convert2YamlObj(ModelResp modelResp,
|
||||
DatabaseResp databaseResp) {
|
||||
ModelDetail modelDetail = modelResp.getModelDetail();
|
||||
DbAdaptor engineAdaptor = DbAdaptorFactory.getEngineAdaptor(databaseResp.getType());
|
||||
SysTimeDimensionBuilder.addSysTimeDimension(modelDetail.getDimensions(), engineAdaptor);
|
||||
DataModelYamlTpl dataModelYamlTpl = new DataModelYamlTpl();
|
||||
dataModelYamlTpl.setType(databaseResp.getType());
|
||||
BeanUtils.copyProperties(modelDetail, dataModelYamlTpl);
|
||||
@@ -61,8 +52,7 @@ public class ModelYamlManager {
|
||||
dimensionYamlTpl.setExpr(dim.getBizName());
|
||||
}
|
||||
if (dim.getTypeParams() != null) {
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParamsTpl =
|
||||
new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParamsTpl = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParamsTpl.setIsPrimary(dim.getTypeParams().getIsPrimary());
|
||||
dimensionTimeTypeParamsTpl.setTimeGranularity(dim.getTypeParams().getTimeGranularity());
|
||||
dimensionYamlTpl.setTypeParams(dimensionTimeTypeParamsTpl);
|
||||
|
||||
@@ -187,24 +187,12 @@ public class SemanticSchemaManager {
|
||||
if (Objects.nonNull(dimensionYamlTpl.getExt())) {
|
||||
dimension.setExt(dimensionYamlTpl.getExt());
|
||||
}
|
||||
dimension.setDimensionTimeTypeParams(
|
||||
getDimensionTimeTypeParams(dimensionYamlTpl.getTypeParams()));
|
||||
dimension.setDimensionTimeTypeParams(dimensionYamlTpl.getTypeParams());
|
||||
dimensions.add(dimension);
|
||||
}
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
private static DimensionTimeTypeParams getDimensionTimeTypeParams(
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParamsTpl) {
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams = new DimensionTimeTypeParams();
|
||||
if (dimensionTimeTypeParamsTpl != null) {
|
||||
dimensionTimeTypeParams
|
||||
.setTimeGranularity(dimensionTimeTypeParamsTpl.getTimeGranularity());
|
||||
dimensionTimeTypeParams.setIsPrimary(dimensionTimeTypeParamsTpl.getIsPrimary());
|
||||
}
|
||||
return dimensionTimeTypeParams;
|
||||
}
|
||||
|
||||
private static List<Identify> getIdentify(List<IdentifyYamlTpl> identifyYamlTpls) {
|
||||
List<Identify> identifies = new ArrayList<>();
|
||||
for (IdentifyYamlTpl identifyYamlTpl : identifyYamlTpls) {
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.tencent.supersonic.headless.server.pojo.yaml;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class DimensionTimeTypeParamsTpl {
|
||||
|
||||
private String isPrimary;
|
||||
|
||||
private String timeGranularity;
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.tencent.supersonic.headless.server.pojo.yaml;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
|
||||
import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
@@ -19,7 +20,7 @@ public class DimensionYamlTpl {
|
||||
|
||||
private String expr;
|
||||
|
||||
private DimensionTimeTypeParamsTpl typeParams;
|
||||
private DimensionTimeTypeParams typeParams;
|
||||
|
||||
private DataTypeEnums dataType;
|
||||
|
||||
|
||||
@@ -5,13 +5,7 @@ import com.alibaba.excel.ExcelWriter;
|
||||
import com.alibaba.excel.util.FileUtils;
|
||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||
import com.tencent.supersonic.common.pojo.Constants;
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.QueryColumn;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.common.pojo.*;
|
||||
import com.tencent.supersonic.common.util.DateUtils;
|
||||
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
@@ -35,21 +29,10 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.*;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@@ -268,13 +251,7 @@ public class DownloadServiceImpl implements DownloadService {
|
||||
}
|
||||
|
||||
private String getTimeDimension(DateConf dateConf) {
|
||||
if (DatePeriodEnum.MONTH.equals(dateConf.getPeriod())) {
|
||||
return TimeDimensionEnum.MONTH.getName();
|
||||
} else if (DatePeriodEnum.WEEK.equals(dateConf.getPeriod())) {
|
||||
return TimeDimensionEnum.WEEK.getName();
|
||||
} else {
|
||||
return TimeDimensionEnum.DAY.getName();
|
||||
}
|
||||
return dateConf.getDateField();
|
||||
}
|
||||
|
||||
private Map<String, List<MetricResp>> getMetricMap(List<MetricResp> metricResps) {
|
||||
|
||||
@@ -385,8 +385,8 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
return true;
|
||||
}
|
||||
} else if (MetricDefineType.MEASURE.equals(metricResp.getMetricDefineType())) {
|
||||
List<MeasureParam> measures = metricResp.getMetricDefineByMeasureParams().getMeasures();
|
||||
List<String> fieldNameDepended = measures.stream().map(MeasureParam::getBizName)
|
||||
List<Measure> measures = metricResp.getMetricDefineByMeasureParams().getMeasures();
|
||||
List<String> fieldNameDepended = measures.stream().map(Measure::getBizName)
|
||||
// measure bizName = model bizName_fieldName
|
||||
.map(name -> name.replaceFirst(metricResp.getModelBizName() + "_", ""))
|
||||
.collect(Collectors.toList());
|
||||
@@ -679,12 +679,11 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
}
|
||||
// Measure define will get from first measure
|
||||
List<Measure> measures = modelResp.getModelDetail().getMeasures();
|
||||
List<MeasureParam> measureParams =
|
||||
metricResp.getMetricDefineByMeasureParams().getMeasures();
|
||||
List<Measure> measureParams = metricResp.getMetricDefineByMeasureParams().getMeasures();
|
||||
if (CollectionUtils.isEmpty(measureParams)) {
|
||||
return "";
|
||||
}
|
||||
MeasureParam firstMeasure = measureParams.get(0);
|
||||
Measure firstMeasure = measureParams.get(0);
|
||||
|
||||
for (Measure measure : measures) {
|
||||
if (measure.getBizName().equalsIgnoreCase(firstMeasure.getBizName())) {
|
||||
@@ -727,7 +726,7 @@ public class MetricServiceImpl extends ServiceImpl<MetricDOMapper, MetricDO>
|
||||
QueryStructReq queryStructReq = new QueryStructReq();
|
||||
DateConf dateInfo = queryMetricReq.getDateInfo();
|
||||
if (Objects.nonNull(dateInfo) && dateInfo.isGroupByDate()) {
|
||||
queryStructReq.getGroups().add(dateInfo.getGroupByTimeDimension());
|
||||
queryStructReq.getGroups().add(dateInfo.getDateField());
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(dimensionBizNames)) {
|
||||
queryStructReq.getGroups().addAll(dimensionBizNames);
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.tencent.supersonic.headless.server.service.impl;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.headless.api.pojo.Dimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
|
||||
import com.tencent.supersonic.headless.api.pojo.ValueDistribution;
|
||||
@@ -26,12 +25,7 @@ import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@@ -121,8 +115,8 @@ public class TagQueryServiceImpl implements TagQueryService {
|
||||
User user) {
|
||||
|
||||
String sqlPattern = "select max(%s) as %s from tbl where %s is not null";
|
||||
String sql = String.format(sqlPattern, TimeDimensionEnum.DAY.getName(), maxDateAlias,
|
||||
tag.getBizName());
|
||||
String sql = String.format(sqlPattern, itemValueReq.getDateConf().getDateField(),
|
||||
maxDateAlias, tag.getBizName());
|
||||
|
||||
// 添加时间过滤信息
|
||||
log.info("[queryTagDateFromDbBySql] calculate the maximum time start");
|
||||
@@ -140,8 +134,8 @@ public class TagQueryServiceImpl implements TagQueryService {
|
||||
String end = LocalDate.now().minusDays(0)
|
||||
.format(DateTimeFormatter.ofPattern(dateFormat));
|
||||
sql = sql + String.format(" and ( %s > '%s' and %s <= '%s' )",
|
||||
TimeDimensionEnum.DAY.getName(), start, TimeDimensionEnum.DAY.getName(),
|
||||
end);
|
||||
itemValueReq.getDateConf().getDateField(), start,
|
||||
itemValueReq.getDateConf().getDateField(), end);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,12 +206,6 @@ public class DataSetSchemaBuilder {
|
||||
|
||||
private static void setDefaultTimeFormat(SchemaElement dimToAdd,
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams, String timeFormat) {
|
||||
if (null != dimensionTimeTypeParams && TimeDimensionEnum.DAY.name()
|
||||
.equalsIgnoreCase(dimensionTimeTypeParams.getTimeGranularity())) {
|
||||
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TIME_FORMAT,
|
||||
DateUtils.DEFAULT_DATE_FORMAT);
|
||||
} else {
|
||||
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TIME_FORMAT, timeFormat);
|
||||
}
|
||||
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_TIME_FORMAT, timeFormat);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,7 @@
|
||||
package com.tencent.supersonic.headless.server.utils;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||
import com.tencent.supersonic.common.pojo.Constants;
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.Filter;
|
||||
import com.tencent.supersonic.common.pojo.Order;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||
import com.tencent.supersonic.common.pojo.*;
|
||||
import com.tencent.supersonic.common.pojo.enums.*;
|
||||
import com.tencent.supersonic.common.util.BeanMapper;
|
||||
import com.tencent.supersonic.common.util.JsonUtil;
|
||||
import com.tencent.supersonic.headless.api.pojo.Dimension;
|
||||
@@ -20,13 +10,7 @@ import com.tencent.supersonic.headless.api.pojo.request.DictItemReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DictItemResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DictTaskResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.TagResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.*;
|
||||
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.DictConfDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.DictTaskDO;
|
||||
@@ -45,22 +29,9 @@ import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.*;
|
||||
|
||||
import static com.tencent.supersonic.common.pojo.Constants.AND_UPPER;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.APOSTROPHE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.COMMA;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.POUND;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.SPACE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.*;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@@ -456,14 +427,14 @@ public class DictUtils {
|
||||
return joiner.toString();
|
||||
}
|
||||
|
||||
public String defaultDateFilter() {
|
||||
public String defaultDateFilter(DateConf dateConf) {
|
||||
String format = itemValueDateFormat;
|
||||
String start = LocalDate.now().minusDays(itemValueDateStart)
|
||||
.format(DateTimeFormatter.ofPattern(format));
|
||||
String end = LocalDate.now().minusDays(itemValueDateEnd)
|
||||
.format(DateTimeFormatter.ofPattern(format));
|
||||
return String.format("( %s >= '%s' and %s <= '%s' )", TimeDimensionEnum.DAY.getName(),
|
||||
start, TimeDimensionEnum.DAY.getName(), end);
|
||||
return String.format("( %s >= '%s' and %s <= '%s' )", dateConf.getDateField(), start,
|
||||
dateConf.getDateField(), end);
|
||||
}
|
||||
|
||||
private String generateDictDateFilter(DictItemResp dictItemResp) {
|
||||
@@ -473,7 +444,7 @@ public class DictUtils {
|
||||
}
|
||||
// 未进行设置
|
||||
if (Objects.isNull(config) || Objects.isNull(config.getDateConf())) {
|
||||
return defaultDateFilter();
|
||||
return defaultDateFilter(config.getDateConf());
|
||||
}
|
||||
// 全表扫描
|
||||
if (DateConf.DateMode.ALL.equals(config.getDateConf().getDateMode())) {
|
||||
@@ -481,9 +452,9 @@ public class DictUtils {
|
||||
}
|
||||
// 静态日期
|
||||
if (DateConf.DateMode.BETWEEN.equals(config.getDateConf().getDateMode())) {
|
||||
return String.format("( %s >= '%s' and %s <= '%s' )", TimeDimensionEnum.DAY.getName(),
|
||||
config.getDateConf().getStartDate(), TimeDimensionEnum.DAY.getName(),
|
||||
config.getDateConf().getEndDate());
|
||||
return String.format("( %s >= '%s' and %s <= '%s' )",
|
||||
config.getDateConf().getDateField(), config.getDateConf().getStartDate(),
|
||||
config.getDateConf().getDateField(), config.getDateConf().getEndDate());
|
||||
}
|
||||
// 动态日期
|
||||
if (DateConf.DateMode.RECENT.equals(config.getDateConf().getDateMode())) {
|
||||
@@ -519,8 +490,8 @@ public class DictUtils {
|
||||
String end = LocalDate.now().minusDays(0)
|
||||
.format(DateTimeFormatter.ofPattern(dateFormat));
|
||||
return String.format("( %s > '%s' and %s <= '%s' )",
|
||||
TimeDimensionEnum.DAY.getName(), start, TimeDimensionEnum.DAY.getName(),
|
||||
end);
|
||||
dictItemResp.getConfig().getDateConf().getDateField(), start,
|
||||
dictItemResp.getConfig().getDateConf().getDateField(), end);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
|
||||
@@ -46,9 +46,9 @@ public class MetricCheckUtils {
|
||||
throw new InvalidArgumentException("指标定义参数不可为空");
|
||||
}
|
||||
expr = typeParams.getExpr();
|
||||
if (CollectionUtils.isEmpty(typeParams.getFields())) {
|
||||
throw new InvalidArgumentException("定义指标的字段列表参数不可为空");
|
||||
}
|
||||
// if (CollectionUtils.isEmpty(typeParams.getFields())) {
|
||||
// throw new InvalidArgumentException("定义指标的字段列表参数不可为空");
|
||||
// }
|
||||
if (!hasAggregateFunction(expr)) {
|
||||
throw new InvalidArgumentException("基于字段来创建指标,表达式中必须包含聚合函数");
|
||||
}
|
||||
|
||||
@@ -2,14 +2,9 @@ package com.tencent.supersonic.headless.server.utils;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
||||
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DimSchemaResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
|
||||
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.SemanticSchemaResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.*;
|
||||
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
||||
import com.tencent.supersonic.headless.server.service.MetricService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -61,9 +56,6 @@ public class MetricDrillDownChecker {
|
||||
}
|
||||
}
|
||||
for (String dimensionBizName : groupByFields) {
|
||||
if (TimeDimensionEnum.containsTimeDimension(dimensionBizName)) {
|
||||
continue;
|
||||
}
|
||||
List<MetricResp> metricResps = getMetrics(metricFields, semanticSchemaResp);
|
||||
if (!checkDrillDownDimension(dimensionBizName, metricResps, semanticSchemaResp)) {
|
||||
DimSchemaResp dimSchemaResp = semanticSchemaResp.getDimension(dimensionBizName);
|
||||
|
||||
@@ -7,21 +7,8 @@ import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
|
||||
import com.tencent.supersonic.common.util.BeanMapper;
|
||||
import com.tencent.supersonic.common.util.JsonUtil;
|
||||
import com.tencent.supersonic.headless.api.pojo.ColumnSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.Dimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.Identify;
|
||||
import com.tencent.supersonic.headless.api.pojo.Measure;
|
||||
import com.tencent.supersonic.headless.api.pojo.MeasureParam;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.ModelDetail;
|
||||
import com.tencent.supersonic.headless.api.pojo.ModelSchema;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.DimensionType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.FieldType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.IdentifyType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.ModelDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.SemanticType;
|
||||
import com.tencent.supersonic.headless.api.pojo.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.*;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.DimensionReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetricReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
|
||||
@@ -34,12 +21,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ModelConverter {
|
||||
@@ -141,7 +123,7 @@ public class ModelConverter {
|
||||
metricReq.setModelId(modelDO.getId());
|
||||
MetricDefineByMeasureParams exprTypeParams = new MetricDefineByMeasureParams();
|
||||
exprTypeParams.setExpr(measure.getBizName());
|
||||
MeasureParam measureParam = new MeasureParam();
|
||||
Measure measureParam = new Measure();
|
||||
BeanMapper.mapper(measure, measureParam);
|
||||
exprTypeParams.setMeasures(Lists.newArrayList(measureParam));
|
||||
metricReq.setMetricDefineByMeasureParams(exprTypeParams);
|
||||
|
||||
@@ -2,13 +2,10 @@ package com.tencent.supersonic.headless.server.utils;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.tencent.supersonic.common.jsqlparser.FieldExpression;
|
||||
import com.tencent.supersonic.common.jsqlparser.SqlSelectHelper;
|
||||
import com.tencent.supersonic.common.pojo.Aggregator;
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.DateConf.DateMode;
|
||||
import com.tencent.supersonic.common.pojo.ItemDateResp;
|
||||
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||
import com.tencent.supersonic.common.util.DateModeUtils;
|
||||
import com.tencent.supersonic.common.util.SqlFilterUtils;
|
||||
@@ -31,16 +28,7 @@ import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT;
|
||||
@@ -274,55 +262,4 @@ public class QueryStructUtils {
|
||||
return Triple.of("", "", "");
|
||||
}
|
||||
|
||||
public DateConf getDateConfBySql(String sql) {
|
||||
List<FieldExpression> fieldExpressions = SqlSelectHelper.getFilterExpression(sql);
|
||||
if (!CollectionUtils.isEmpty(fieldExpressions)) {
|
||||
Set<String> dateList = new HashSet<>();
|
||||
String startDate = "";
|
||||
String endDate = "";
|
||||
DatePeriodEnum period = null;
|
||||
for (FieldExpression f : fieldExpressions) {
|
||||
if (Objects.isNull(f.getFieldName())
|
||||
|| !internalCols.contains(f.getFieldName().toLowerCase())) {
|
||||
continue;
|
||||
}
|
||||
if (Objects.isNull(f.getFieldValue())
|
||||
|| !dateModeUtils.isDateStr(f.getFieldValue().toString())) {
|
||||
continue;
|
||||
}
|
||||
period = dateModeUtils.getPeriodByCol(f.getFieldName().toLowerCase());
|
||||
if (period == null) {
|
||||
continue;
|
||||
}
|
||||
if ("=".equals(f.getOperator())) {
|
||||
dateList.add(f.getFieldValue().toString());
|
||||
} else if ("<".equals(f.getOperator()) || "<=".equals(f.getOperator())) {
|
||||
if (startDate.isEmpty()
|
||||
|| startDate.compareTo(f.getFieldValue().toString()) > 0) {
|
||||
startDate = f.getFieldValue().toString();
|
||||
}
|
||||
} else if (">".equals(f.getOperator()) || ">=".equals(f.getOperator())) {
|
||||
if (endDate.isEmpty() || endDate.compareTo(f.getFieldValue().toString()) < 0) {
|
||||
endDate = f.getFieldValue().toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (period != null) {
|
||||
DateConf dateConf = new DateConf();
|
||||
dateConf.setPeriod(period);
|
||||
if (!CollectionUtils.isEmpty(dateList)) {
|
||||
dateConf.setDateList(new ArrayList<>(dateList));
|
||||
dateConf.setDateMode(DateMode.LIST);
|
||||
return dateConf;
|
||||
}
|
||||
if (!"".equals(startDate) && !"".equals(endDate)) {
|
||||
dateConf.setStartDate(startDate);
|
||||
dateConf.setEndDate(endDate);
|
||||
dateConf.setDateMode(DateMode.BETWEEN);
|
||||
return dateConf;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.tencent.supersonic.headless.server.utils;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.Constants;
|
||||
import com.tencent.supersonic.common.pojo.QueryColumn;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
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;
|
||||
@@ -55,10 +54,6 @@ public class QueryUtils {
|
||||
|
||||
private void populateNamePairs(SemanticSchemaResp semanticSchemaResp,
|
||||
Map<String, String> namePair, Map<String, String> nameTypePair) {
|
||||
for (TimeDimensionEnum timeDimensionEnum : TimeDimensionEnum.values()) {
|
||||
namePair.put(timeDimensionEnum.getName(), "date");
|
||||
nameTypePair.put(timeDimensionEnum.getName(), "DATE");
|
||||
}
|
||||
semanticSchemaResp.getMetrics().forEach(metricDesc -> {
|
||||
namePair.put(metricDesc.getBizName(), metricDesc.getName());
|
||||
nameTypePair.put(metricDesc.getBizName(), SemanticType.NUMBER.name());
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.tencent.supersonic.headless.server.calcite;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.ColumnOrder;
|
||||
import com.tencent.supersonic.common.pojo.enums.EngineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.SqlParserResp;
|
||||
import com.tencent.supersonic.headless.core.pojo.OntologyQuery;
|
||||
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
|
||||
@@ -76,7 +77,7 @@ class HeadlessParserServiceTest {
|
||||
dimension.setName("imp_date");
|
||||
dimension.setExpr("imp_date");
|
||||
dimension.setType("time");
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParams = new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParams.setIsPrimary("true");
|
||||
dimensionTimeTypeParams.setTimeGranularity("day");
|
||||
dimension.setTypeParams(dimensionTimeTypeParams);
|
||||
@@ -87,7 +88,7 @@ class HeadlessParserServiceTest {
|
||||
dimension2.setName("sys_imp_date");
|
||||
dimension2.setExpr("imp_date");
|
||||
dimension2.setType("time");
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParams2 = new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams2 = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParams2.setIsPrimary("true");
|
||||
dimensionTimeTypeParams2.setTimeGranularity("day");
|
||||
dimension2.setTypeParams(dimensionTimeTypeParams2);
|
||||
@@ -97,7 +98,7 @@ class HeadlessParserServiceTest {
|
||||
dimension3.setName("sys_imp_week");
|
||||
dimension3.setExpr("to_monday(from_unixtime(unix_timestamp(imp_date), 'yyyy-MM-dd'))");
|
||||
dimension3.setType("time");
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParams3 = new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams3 = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParams3.setIsPrimary("true");
|
||||
dimensionTimeTypeParams3.setTimeGranularity("day");
|
||||
dimension3.setTypeParams(dimensionTimeTypeParams3);
|
||||
@@ -201,7 +202,7 @@ class HeadlessParserServiceTest {
|
||||
dimension.setName("sys_imp_date");
|
||||
dimension.setExpr("imp_date");
|
||||
dimension.setType("time");
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParams = new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParams.setIsPrimary("true");
|
||||
dimensionTimeTypeParams.setTimeGranularity("day");
|
||||
dimension.setTypeParams(dimensionTimeTypeParams);
|
||||
@@ -212,7 +213,7 @@ class HeadlessParserServiceTest {
|
||||
dimension3.setName("sys_imp_week");
|
||||
dimension3.setExpr("to_monday(from_unixtime(unix_timestamp(imp_date), 'yyyy-MM-dd'))");
|
||||
dimension3.setType("time");
|
||||
DimensionTimeTypeParamsTpl dimensionTimeTypeParams3 = new DimensionTimeTypeParamsTpl();
|
||||
DimensionTimeTypeParams dimensionTimeTypeParams3 = new DimensionTimeTypeParams();
|
||||
dimensionTimeTypeParams3.setIsPrimary("true");
|
||||
dimensionTimeTypeParams3.setTimeGranularity("week");
|
||||
dimension3.setTypeParams(dimensionTimeTypeParams3);
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
package com.tencent.supersonic.headless.server.service;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.common.pojo.DataFormat;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.DataFormatTypeEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||
import com.tencent.supersonic.headless.api.pojo.DrillDownDimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.MeasureParam;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetricDefineByMeasureParams;
|
||||
import com.tencent.supersonic.headless.api.pojo.RelateDimension;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType;
|
||||
import com.tencent.supersonic.headless.api.pojo.enums.MetricType;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.MetricReq;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
|
||||
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
|
||||
import com.tencent.supersonic.headless.server.facade.service.ChatLayerService;
|
||||
import com.tencent.supersonic.headless.server.persistence.dataobject.MetricDO;
|
||||
import com.tencent.supersonic.headless.server.persistence.repository.MetricRepository;
|
||||
import com.tencent.supersonic.headless.server.service.impl.DataSetServiceImpl;
|
||||
import com.tencent.supersonic.headless.server.service.impl.MetricServiceImpl;
|
||||
import com.tencent.supersonic.headless.server.utils.AliasGenerateHelper;
|
||||
import com.tencent.supersonic.headless.server.utils.MetricConverter;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class MetricServiceImplTest {
|
||||
|
||||
@Test
|
||||
void createMetric() throws Exception {
|
||||
MetricRepository metricRepository = Mockito.mock(MetricRepository.class);
|
||||
ModelService modelService = Mockito.mock(ModelService.class);
|
||||
MetricService metricService = mockMetricService(metricRepository, modelService);
|
||||
MetricReq metricReq = buildMetricReq();
|
||||
when(modelService.getModel(metricReq.getModelId())).thenReturn(mockModelResp());
|
||||
when(modelService.getModelByDomainIds(any())).thenReturn(Lists.newArrayList());
|
||||
MetricResp actualMetricResp = metricService.createMetric(metricReq, User.getDefaultUser());
|
||||
MetricResp expectedMetricResp = buildExpectedMetricResp();
|
||||
Assertions.assertEquals(expectedMetricResp, actualMetricResp);
|
||||
}
|
||||
|
||||
@Test
|
||||
void updateMetric() throws Exception {
|
||||
MetricRepository metricRepository = Mockito.mock(MetricRepository.class);
|
||||
ModelService modelService = Mockito.mock(ModelService.class);
|
||||
MetricService metricService = mockMetricService(metricRepository, modelService);
|
||||
MetricReq metricReq = buildMetricUpdateReq();
|
||||
when(modelService.getModel(metricReq.getModelId())).thenReturn(mockModelResp());
|
||||
when(modelService.getModelByDomainIds(any())).thenReturn(Lists.newArrayList());
|
||||
MetricDO metricDO = MetricConverter.convert2MetricDO(buildMetricReq());
|
||||
when(metricRepository.getMetricById(metricDO.getId())).thenReturn(metricDO);
|
||||
MetricResp actualMetricResp = metricService.updateMetric(metricReq, User.getDefaultUser());
|
||||
MetricResp expectedMetricResp = buildExpectedMetricResp();
|
||||
Assertions.assertEquals(expectedMetricResp, actualMetricResp);
|
||||
}
|
||||
|
||||
private MetricService mockMetricService(MetricRepository metricRepository,
|
||||
ModelService modelService) {
|
||||
AliasGenerateHelper aliasGenerateHelper = Mockito.mock(AliasGenerateHelper.class);
|
||||
CollectService collectService = Mockito.mock(CollectService.class);
|
||||
ApplicationEventPublisher eventPublisher = Mockito.mock(ApplicationEventPublisher.class);
|
||||
DataSetService dataSetService = Mockito.mock(DataSetServiceImpl.class);
|
||||
DimensionService dimensionService = Mockito.mock(DimensionService.class);
|
||||
TagMetaService tagMetaService = Mockito.mock(TagMetaService.class);
|
||||
ChatLayerService chatLayerService = Mockito.mock(ChatLayerService.class);
|
||||
return new MetricServiceImpl(metricRepository, modelService, aliasGenerateHelper,
|
||||
collectService, dataSetService, eventPublisher, dimensionService, tagMetaService,
|
||||
chatLayerService);
|
||||
}
|
||||
|
||||
private MetricReq buildMetricReq() {
|
||||
MetricReq metricReq = new MetricReq();
|
||||
metricReq.setId(1L);
|
||||
metricReq.setName("hr部门的访问次数");
|
||||
metricReq.setBizName("pv");
|
||||
metricReq.setDescription("SuperSonic的访问情况");
|
||||
metricReq.setAlias("pv");
|
||||
metricReq.setMetricDefineType(MetricDefineType.MEASURE);
|
||||
metricReq.setModelId(2L);
|
||||
metricReq.setDataFormatType(DataFormatTypeEnum.PERCENT.getName());
|
||||
DataFormat dataFormat = new DataFormat();
|
||||
dataFormat.setDecimalPlaces(3);
|
||||
dataFormat.setNeedMultiply100(false);
|
||||
metricReq.setDataFormat(dataFormat);
|
||||
MetricDefineByMeasureParams typeParams = new MetricDefineByMeasureParams();
|
||||
typeParams.setMeasures(Lists.newArrayList(new MeasureParam("s2_pv", "department='hr'"),
|
||||
new MeasureParam("s2_uv", "department='hr'")));
|
||||
typeParams.setExpr("s2_pv/s2_uv");
|
||||
metricReq.setMetricDefineByMeasureParams(typeParams);
|
||||
metricReq.setClassifications(Lists.newArrayList("核心指标"));
|
||||
metricReq.setRelateDimension(RelateDimension.builder().drillDownDimensions(
|
||||
Lists.newArrayList(new DrillDownDimension(1L), new DrillDownDimension(1L, false)))
|
||||
.build());
|
||||
metricReq.setSensitiveLevel(SensitiveLevelEnum.LOW.getCode());
|
||||
metricReq.setExt(new HashMap<>());
|
||||
return metricReq;
|
||||
}
|
||||
|
||||
private MetricResp buildExpectedMetricResp() {
|
||||
MetricResp metricResp = new MetricResp();
|
||||
metricResp.setId(1L);
|
||||
metricResp.setName("hr部门的访问次数");
|
||||
metricResp.setBizName("pv");
|
||||
metricResp.setDescription("SuperSonic的访问情况");
|
||||
metricResp.setAlias("pv");
|
||||
metricResp.setMetricDefineType(MetricDefineType.MEASURE);
|
||||
metricResp.setModelId(2L);
|
||||
metricResp.setDataFormatType(DataFormatTypeEnum.PERCENT.getName());
|
||||
DataFormat dataFormat = new DataFormat();
|
||||
dataFormat.setDecimalPlaces(3);
|
||||
dataFormat.setNeedMultiply100(false);
|
||||
metricResp.setDataFormat(dataFormat);
|
||||
MetricDefineByMeasureParams typeParams = new MetricDefineByMeasureParams();
|
||||
typeParams.setMeasures(Lists.newArrayList(new MeasureParam("s2_pv", "department='hr'"),
|
||||
new MeasureParam("s2_uv", "department='hr'")));
|
||||
typeParams.setExpr("s2_pv/s2_uv");
|
||||
metricResp.setMetricDefineByMeasureParams(typeParams);
|
||||
metricResp.setClassifications("核心指标");
|
||||
metricResp.setRelateDimension(RelateDimension.builder().drillDownDimensions(
|
||||
Lists.newArrayList(new DrillDownDimension(1L), new DrillDownDimension(1L, false)))
|
||||
.build());
|
||||
metricResp.setSensitiveLevel(SensitiveLevelEnum.LOW.getCode());
|
||||
metricResp.setExt(new HashMap<>());
|
||||
metricResp.setTypeEnum(TypeEnums.METRIC);
|
||||
metricResp.setIsCollect(false);
|
||||
metricResp.setType(MetricType.DERIVED.name());
|
||||
metricResp.setStatus(StatusEnum.ONLINE.getCode());
|
||||
return metricResp;
|
||||
}
|
||||
|
||||
private MetricReq buildMetricUpdateReq() {
|
||||
MetricReq metricReq = new MetricReq();
|
||||
metricReq.setId(1L);
|
||||
metricReq.setName("hr部门的访问次数");
|
||||
metricReq.setBizName("pv");
|
||||
metricReq.setMetricDefineType(MetricDefineType.MEASURE);
|
||||
MetricDefineByMeasureParams typeParams = new MetricDefineByMeasureParams();
|
||||
typeParams.setMeasures(Lists.newArrayList(new MeasureParam("s2_pv", "department='hr'"),
|
||||
new MeasureParam("s2_uv", "department='hr'")));
|
||||
typeParams.setExpr("s2_pv/s2_uv");
|
||||
metricReq.setMetricDefineByMeasureParams(typeParams);
|
||||
return metricReq;
|
||||
}
|
||||
|
||||
private ModelResp mockModelResp() {
|
||||
ModelResp modelResp = new ModelResp();
|
||||
modelResp.setId(2L);
|
||||
modelResp.setDomainId(1L);
|
||||
return modelResp;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user