mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-06-26 06:39:20 +08:00
Compare commits
11 Commits
20cd98332c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de60be3908 | ||
|
|
0868850edd | ||
|
|
6d41ce4c5b | ||
|
|
ef2f07a59e | ||
|
|
c3cf8b1889 | ||
|
|
c0af25fe2e | ||
|
|
d2ae1509cb | ||
|
|
5b77b39c60 | ||
|
|
9f2262c97b | ||
|
|
6f11cdc12c | ||
|
|
3752543921 |
@@ -26,11 +26,9 @@ public class SqlDialectFactory {
|
||||
.withLiteralQuoteString("'").withIdentifierQuoteString("\"")
|
||||
.withLiteralEscapedQuoteString("''").withUnquotedCasing(Casing.UNCHANGED)
|
||||
.withQuotedCasing(Casing.UNCHANGED).withCaseSensitive(true);
|
||||
public static final Context PRESTO_CONTEXT =
|
||||
SqlDialect.EMPTY_CONTEXT.withDatabaseProduct(DatabaseProduct.PRESTO)
|
||||
.withLiteralQuoteString("'")
|
||||
.withLiteralEscapedQuoteString("''")
|
||||
.withUnquotedCasing(Casing.UNCHANGED)
|
||||
public static final Context PRESTO_CONTEXT = SqlDialect.EMPTY_CONTEXT
|
||||
.withDatabaseProduct(DatabaseProduct.PRESTO).withLiteralQuoteString("'")
|
||||
.withLiteralEscapedQuoteString("''").withUnquotedCasing(Casing.UNCHANGED)
|
||||
.withQuotedCasing(Casing.UNCHANGED).withCaseSensitive(true);
|
||||
public static final Context KYUUBI_CONTEXT =
|
||||
SqlDialect.EMPTY_CONTEXT.withDatabaseProduct(DatabaseProduct.BIG_QUERY)
|
||||
|
||||
@@ -11,6 +11,8 @@ public enum DataTypeEnums {
|
||||
|
||||
DATE("DATE"),
|
||||
|
||||
TIMESTAMP("TIMESTAMP"),
|
||||
|
||||
BIGINT("BIGINT"),
|
||||
|
||||
INT("INT"),
|
||||
@@ -39,6 +41,9 @@ public enum DataTypeEnums {
|
||||
return typeEnum;
|
||||
}
|
||||
}
|
||||
if (type != null && type.toUpperCase().contains("INT")) {
|
||||
return DataTypeEnums.INT;
|
||||
}
|
||||
return DataTypeEnums.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ public enum EngineType {
|
||||
KYUUBI(11, "KYUUBI"),
|
||||
PRESTO(12, "PRESTO"),
|
||||
TRINO(13, "TRINO"),
|
||||
ORACLE(14, "ORACLE");
|
||||
ORACLE(14, "ORACLE"),
|
||||
HIVE(15, "HIVE");
|
||||
|
||||
private Integer code;
|
||||
|
||||
|
||||
@@ -181,6 +181,11 @@ public class DateUtils {
|
||||
LocalDate startDate = parseDate(startDateStr);
|
||||
LocalDate endDate = parseDate(endDateStr);
|
||||
List<String> datesInRange = new ArrayList<>();
|
||||
|
||||
if (startDate == null || endDate == null) {
|
||||
return datesInRange;
|
||||
}
|
||||
|
||||
LocalDate currentDate = startDate;
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
|
||||
while (!currentDate.isAfter(endDate)) {
|
||||
|
||||
@@ -21,6 +21,8 @@ public class Dimension {
|
||||
|
||||
private String dateFormat = Constants.DAY_FORMAT;
|
||||
|
||||
private String dataType;
|
||||
|
||||
private DimensionTimeTypeParams typeParams;
|
||||
|
||||
private Integer isCreateDimension = 0;
|
||||
@@ -37,13 +39,14 @@ public class Dimension {
|
||||
this.expr = bizName;
|
||||
}
|
||||
|
||||
public Dimension(String name, String bizName, String expr, DimensionType type,
|
||||
public Dimension(String name, String bizName, String expr, DimensionType type, String dataType,
|
||||
Integer isCreateDimension) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.isCreateDimension = isCreateDimension;
|
||||
this.bizName = bizName;
|
||||
this.expr = expr;
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
public Dimension(String name, String bizName, DimensionType type, Integer isCreateDimension,
|
||||
|
||||
@@ -57,7 +57,7 @@ public class ChatQueryContext implements Serializable {
|
||||
.sorted(Comparator.comparing(
|
||||
semanticQuery -> semanticQuery.getParseInfo().getScore(),
|
||||
Comparator.reverseOrder()))
|
||||
.limit(1).collect(Collectors.toList());
|
||||
.collect(Collectors.toList());
|
||||
return candidateQueries;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@@ -50,8 +51,12 @@ public class HanlpDictMatchStrategy extends SingleMatchStrategy<HanlpMapResult>
|
||||
return new ArrayList<>();
|
||||
}
|
||||
// step3. merge pre/suffix result
|
||||
// sort by similarity (desc) first, then name length (desc), so that
|
||||
// higher-similarity records are inserted first and survive LinkedHashSet dedup
|
||||
hanlpMapResults = hanlpMapResults.stream()
|
||||
.sorted((a, b) -> -(b.getName().length() - a.getName().length()))
|
||||
.sorted(Comparator.comparingDouble(HanlpMapResult::getSimilarity).reversed()
|
||||
.thenComparing((a, b) -> Integer.compare(b.getName().length(),
|
||||
a.getName().length())))
|
||||
.collect(Collectors.toCollection(LinkedHashSet::new));
|
||||
|
||||
// step4. filter by similarity
|
||||
|
||||
@@ -123,15 +123,9 @@ public class MapFilter {
|
||||
.filter(SchemaElementMatch::isFullMatched).collect(Collectors.toList());
|
||||
|
||||
if (!fullMatches.isEmpty()) {
|
||||
// If there are objects with similarity=1.0, choose the one with the longest
|
||||
// detectWord and smallest offset
|
||||
SchemaElementMatch bestMatch = fullMatches.stream()
|
||||
.max(Comparator.comparing(
|
||||
(SchemaElementMatch match) -> match.getDetectWord().length()))
|
||||
.orElse(null);
|
||||
if (bestMatch != null) {
|
||||
result.add(bestMatch);
|
||||
}
|
||||
// Keep all records with similarity=1.0, as they may correspond to different
|
||||
// elementIds with the same detectWord
|
||||
result.addAll(fullMatches);
|
||||
} else {
|
||||
// If there are no objects with similarity=1.0, keep all objects with similarity<1.0
|
||||
result.addAll(group);
|
||||
|
||||
@@ -24,6 +24,7 @@ public class DbAdaptorFactory {
|
||||
dbAdaptorMap.put(EngineType.TRINO.getName(), new TrinoAdaptor());
|
||||
dbAdaptorMap.put(EngineType.ORACLE.getName(), new OracleAdaptor());
|
||||
dbAdaptorMap.put(EngineType.TDW.getName(), new DefaultDbAdaptor());
|
||||
dbAdaptorMap.put(EngineType.HIVE.getName(), new DefaultDbAdaptor());
|
||||
}
|
||||
|
||||
public static DbAdaptor getEngineAdaptor(String engineType) {
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.tencent.supersonic.common.pojo.enums.TypeEnums;
|
||||
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
|
||||
import com.tencent.supersonic.common.util.BeanMapper;
|
||||
import com.tencent.supersonic.headless.api.pojo.DataSetDetail;
|
||||
import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig;
|
||||
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
|
||||
import com.tencent.supersonic.headless.api.pojo.QueryConfig;
|
||||
import com.tencent.supersonic.headless.api.pojo.request.*;
|
||||
@@ -77,7 +78,13 @@ public class DataSetServiceImpl extends ServiceImpl<DataSetDOMapper, DataSetDO>
|
||||
@Override
|
||||
public DataSetResp getDataSet(Long id) {
|
||||
DataSetDO dataSetDO = getById(id);
|
||||
return convert(dataSetDO);
|
||||
DataSetResp dataSetResp = convert(dataSetDO);
|
||||
|
||||
if (dataSetResp.getDataSetDetail() != null) {
|
||||
expandIncludesAllModels(dataSetResp);
|
||||
}
|
||||
|
||||
return dataSetResp;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -273,6 +280,55 @@ public class DataSetServiceImpl extends ServiceImpl<DataSetDOMapper, DataSetDO>
|
||||
.map(Object::toString).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private void expandIncludesAllModels(DataSetResp dataSetResp) {
|
||||
List<DataSetModelConfig> configs = dataSetResp.getDataSetDetail().getDataSetModelConfigs();
|
||||
if (CollectionUtils.isEmpty(configs)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Set<Long> includeAllModelIds = configs.stream().filter(DataSetModelConfig::getIncludesAll)
|
||||
.map(DataSetModelConfig::getId).collect(Collectors.toSet());
|
||||
|
||||
if (CollectionUtils.isEmpty(includeAllModelIds)) {
|
||||
return;
|
||||
}
|
||||
|
||||
MetaFilter metaFilter = new MetaFilter();
|
||||
metaFilter.setModelIds(new ArrayList<>(includeAllModelIds));
|
||||
metaFilter.setStatus(StatusEnum.ONLINE.getCode());
|
||||
|
||||
List<DimensionResp> allDimensions = dimensionService.getDimensions(metaFilter);
|
||||
List<MetricResp> allMetrics = metricService.getMetrics(metaFilter);
|
||||
|
||||
Map<Long, List<Long>> modelDimensionMap =
|
||||
allDimensions.stream().collect(Collectors.groupingBy(DimensionResp::getModelId,
|
||||
Collectors.mapping(DimensionResp::getId, Collectors.toList())));
|
||||
|
||||
Map<Long, List<Long>> modelMetricMap =
|
||||
allMetrics.stream().collect(Collectors.groupingBy(MetricResp::getModelId,
|
||||
Collectors.mapping(MetricResp::getId, Collectors.toList())));
|
||||
|
||||
for (DataSetModelConfig config : configs) {
|
||||
if (Boolean.TRUE.equals(config.getIncludesAll())) {
|
||||
Long modelId = config.getId();
|
||||
|
||||
List<Long> modelDimensions =
|
||||
modelDimensionMap.getOrDefault(modelId, Lists.newArrayList());
|
||||
Set<Long> existingDimensions = new HashSet<>(config.getDimensions());
|
||||
existingDimensions.addAll(modelDimensions);
|
||||
config.setDimensions(new ArrayList<>(existingDimensions));
|
||||
|
||||
List<Long> modelMetrics =
|
||||
modelMetricMap.getOrDefault(modelId, Lists.newArrayList());
|
||||
Set<Long> existingMetrics = new HashSet<>(config.getMetrics());
|
||||
existingMetrics.addAll(modelMetrics);
|
||||
config.setMetrics(new ArrayList<>(existingMetrics));
|
||||
|
||||
config.setIncludesAll(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Long getDataSetIdFromSql(String sql, User user) {
|
||||
List<DataSetResp> dataSets = null;
|
||||
try {
|
||||
|
||||
@@ -123,9 +123,11 @@ public class DataSetSchemaBuilder {
|
||||
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE,
|
||||
dim.getDataType());
|
||||
} else {
|
||||
if (dataTypeMap.containsKey(dim.getModelId())) {
|
||||
dimToAdd.getExtInfo().put(DimensionConstants.DIMENSION_DATA_TYPE,
|
||||
dataTypeMap.get(dim.getModelId()).get(dim.getBizName()));
|
||||
}
|
||||
}
|
||||
if (dim.isTimeDimension()) {
|
||||
String timeFormat =
|
||||
String.valueOf(dim.getExt().get(DimensionConstants.DIMENSION_TIME_FORMAT));
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.tencent.supersonic.common.pojo.DimensionConstants;
|
||||
import com.tencent.supersonic.common.pojo.User;
|
||||
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
|
||||
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
|
||||
import com.tencent.supersonic.common.util.BeanMapper;
|
||||
import com.tencent.supersonic.common.util.JsonUtil;
|
||||
@@ -109,6 +110,7 @@ public class ModelConverter {
|
||||
dimensionReq.setModelId(modelDO.getId());
|
||||
dimensionReq.setExpr(dim.getExpr());
|
||||
dimensionReq.setType(dim.getType().name());
|
||||
dimensionReq.setDataType(DataTypeEnums.of(dim.getDataType()));
|
||||
dimensionReq
|
||||
.setDescription(Objects.isNull(dim.getDescription()) ? dimensionReq.getDescription()
|
||||
: dim.getDescription());
|
||||
@@ -193,7 +195,8 @@ public class ModelConverter {
|
||||
if (optional.isEmpty()) {
|
||||
Dimension dim = new Dimension(semanticColumn.getName(),
|
||||
semanticColumn.getColumnName(), semanticColumn.getExpr(),
|
||||
DimensionType.valueOf(semanticColumn.getFiledType().name()), 1);
|
||||
DimensionType.valueOf(semanticColumn.getFiledType().name()),
|
||||
semanticColumn.getDataType(), 1);
|
||||
modelDetail.getDimensions().add(dim);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<result column="status" jdbcType="INTEGER" property="status"/>
|
||||
<result column="sensitive_level" jdbcType="INTEGER" property="sensitiveLevel"/>
|
||||
<result column="type" jdbcType="VARCHAR" property="type"/>
|
||||
<result column="data_type" jdbcType="VARCHAR" property="dataType"/>
|
||||
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt"/>
|
||||
<result column="created_by" jdbcType="VARCHAR" property="createdBy"/>
|
||||
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt"/>
|
||||
@@ -67,14 +68,16 @@
|
||||
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
|
||||
insert into s2_dimension (name, biz_name,
|
||||
description, status, model_id,
|
||||
type, type_params, expr,created_at, created_by,
|
||||
type, data_type, type_params, expr,created_at, created_by,
|
||||
updated_by, updated_at, semantic_type,sensitive_level, is_tag, ext)
|
||||
values
|
||||
<foreach collection="list" item="dimension" separator=",">
|
||||
(#{dimension.name,jdbcType=VARCHAR}, #{dimension.bizName,jdbcType=VARCHAR},
|
||||
#{dimension.description,jdbcType=VARCHAR}, #{dimension.status,jdbcType=INTEGER},
|
||||
#{dimension.modelId,jdbcType=BIGINT},
|
||||
#{dimension.type,jdbcType=VARCHAR}, #{dimension.typeParams,jdbcType=VARCHAR},
|
||||
#{dimension.type,jdbcType=VARCHAR},
|
||||
#{dimension.dataType,jdbcType=VARCHAR},
|
||||
#{dimension.typeParams,jdbcType=VARCHAR},
|
||||
#{dimension.expr,jdbcType=VARCHAR}, #{dimension.createdAt,jdbcType=TIMESTAMP},
|
||||
#{dimension.createdBy,jdbcType=VARCHAR},
|
||||
#{dimension.updatedBy,jdbcType=VARCHAR}, #{dimension.updatedAt,jdbcType=TIMESTAMP},
|
||||
@@ -98,6 +101,9 @@
|
||||
<if test="dimension.status != null">status = #{dimension.status,jdbcType=INTEGER},</if>
|
||||
<if test="dimension.modelId != null">model_id = #{dimension.modelId,jdbcType=BIGINT},</if>
|
||||
<if test="dimension.type != null and dimension.type !=''">type = #{dimension.type,jdbcType=VARCHAR},</if>
|
||||
<if test="dimension.dataType != null and dimension.dataType !=''">data_type =
|
||||
#{dimension.dataType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="dimension.typeParams != null and dimension.typeParams !=''">type_params =
|
||||
#{dimension.typeParams,jdbcType=VARCHAR},
|
||||
</if>
|
||||
|
||||
@@ -105,7 +105,7 @@ const ModelFieldForm: React.FC<Props> = ({
|
||||
let defaultParams:any = {};
|
||||
if (value === EnumDataSourceType.MEASURES) {
|
||||
defaultParams = {
|
||||
agg: AGG_OPTIONS[0].value,
|
||||
agg: AGG_OPTIONS[AGG_OPTIONS.length - 1].value,
|
||||
classType: EnumDataSourceType.MEASURES,
|
||||
type: EnumDataSourceType.MEASURES,
|
||||
};
|
||||
@@ -217,7 +217,7 @@ const ModelFieldForm: React.FC<Props> = ({
|
||||
handleFieldChange(record, 'agg', value);
|
||||
}}
|
||||
allowClear
|
||||
defaultValue={AGG_OPTIONS[0].value}
|
||||
defaultValue={AGG_OPTIONS[AGG_OPTIONS.length - 1].value}
|
||||
style={{ width: '100%' }}
|
||||
>
|
||||
{AGG_OPTIONS.map((item) => (
|
||||
|
||||
Reference in New Issue
Block a user