From f89be48e986a38e4164bf56254868bff411efbd6 Mon Sep 17 00:00:00 2001 From: LXW <1264174498@qq.com> Date: Wed, 13 Dec 2023 21:29:15 +0800 Subject: [PATCH] (improvement)(semantic) save metric default query config (#503) Co-authored-by: jolunoluo --- .../chat/mapper/ModelClusterMapper.java | 3 ++ .../chat/mapper/QueryFilterMapper.java | 11 +++-- .../chat/utils/QueryReqBuilder.java | 1 + .../supersonic/common/pojo/ModelCluster.java | 7 ++- .../supersonic/common/pojo/SysParameter.java | 2 +- .../src/main/resources/db/schema-h2.sql | 32 ++++++------ .../src/main/resources/db/schema-mysql.sql | 49 ++++++------------- .../src/main/resources/db/sql-update.sql | 26 +++++++++- .../model/pojo/MetricQueryDefaultConfig.java | 18 +++++++ .../api/model/request/MetricBaseReq.java | 7 ++- .../api/model/response/MetricResp.java | 4 ++ .../application/DimensionServiceImpl.java | 13 ++--- .../model/application/MetricServiceImpl.java | 26 ++++++++++ .../model/application/ModelServiceImpl.java | 4 +- .../model/domain/DimensionService.java | 2 - .../semantic/model/domain/MetricService.java | 5 ++ .../model/domain/dataobject/MetricDO.java | 2 + .../MetricQueryDefaultConfigDO.java | 33 +++++++++++++ .../domain/repository/MetricRepository.java | 7 +++ .../model/domain/utils/MetricConverter.java | 5 ++ .../MetricQueryDefaultConfigDOMapper.java | 13 +++++ .../repository/MetricRepositoryImpl.java | 28 ++++++++++- .../semantic/model/rest/MetricController.java | 39 +++++++++++---- .../query/service/QueryServiceImpl.java | 2 + 24 files changed, 255 insertions(+), 84 deletions(-) create mode 100644 semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricQueryDefaultConfig.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricQueryDefaultConfigDO.java create mode 100644 semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricQueryDefaultConfigDOMapper.java diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelClusterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelClusterMapper.java index f153d4ca3..596eb47ae 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelClusterMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelClusterMapper.java @@ -18,6 +18,9 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +/*** + * A mapper that forms a cluster from connectable models + */ public class ModelClusterMapper implements SchemaMapper { @Override diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java index a6adf47ae..114a23a72 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java @@ -11,6 +11,7 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import java.util.List; @@ -19,8 +20,6 @@ import java.util.stream.Collectors; @Slf4j public class QueryFilterMapper implements SchemaMapper { - - private Long frequency = 9999999L; private double similarity = 1.0; @Override @@ -37,7 +36,7 @@ public class QueryFilterMapper implements SchemaMapper { schemaElementMatches = Lists.newArrayList(); schemaMapInfo.setMatchedElements(modelId, schemaElementMatches); } - addValueSchemaElementMatch(schemaElementMatches, queryReq.getQueryFilters()); + addValueSchemaElementMatch(queryContext, schemaElementMatches, queryReq.getQueryFilters()); } private void clearOtherSchemaElementMatch(Long modelId, SchemaMapInfo schemaMapInfo) { @@ -48,7 +47,8 @@ public class QueryFilterMapper implements SchemaMapper { } } - private List addValueSchemaElementMatch(List candidateElementMatches, + private List addValueSchemaElementMatch(QueryContext queryContext, + List candidateElementMatches, QueryFilters queryFilter) { if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) { return candidateElementMatches; @@ -62,10 +62,11 @@ public class QueryFilterMapper implements SchemaMapper { .name(String.valueOf(filter.getValue())) .type(SchemaElementType.VALUE) .bizName(filter.getBizName()) + .model(queryContext.getRequest().getModelId()) .build(); SchemaElementMatch schemaElementMatch = SchemaElementMatch.builder() .element(element) - .frequency(frequency) + .frequency(BaseWordBuilder.DEFAULT_FREQUENCY) .word(String.valueOf(filter.getValue())) .similarity(similarity) .detectWord(Constants.EMPTY) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java index de8329593..660b847ec 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/QueryReqBuilder.java @@ -118,6 +118,7 @@ public class QueryReqBuilder { for (Filter dimensionFilter : queryStructReq.getDimensionFilters()) { QueryStructReq req = new QueryStructReq(); BeanUtils.copyProperties(queryStructReq, req); + req.setModelIds(new HashSet<>(queryStructReq.getModelIds())); req.setDimensionFilters(Lists.newArrayList(dimensionFilter)); queryStructReqs.add(req); } diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/ModelCluster.java b/common/src/main/java/com/tencent/supersonic/common/pojo/ModelCluster.java index ca02b953b..8070b65f4 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/ModelCluster.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/ModelCluster.java @@ -2,7 +2,9 @@ package com.tencent.supersonic.common.pojo; import lombok.Data; import org.apache.commons.lang3.StringUtils; +import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Map; @@ -49,7 +51,10 @@ public class ModelCluster { } public Long getFirstModel() { - return modelIds.stream().findFirst().orElse(null); + if (CollectionUtils.isEmpty(modelIds)) { + return -1L; + } + return new ArrayList<>(modelIds).get(0); } } diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/SysParameter.java b/common/src/main/java/com/tencent/supersonic/common/pojo/SysParameter.java index 403f59ab5..d21b7105b 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/SysParameter.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/SysParameter.java @@ -79,7 +79,7 @@ public class SysParameter { //llm config Parameter parameter = new Parameter("llm.model.name", "gpt3.5", - "模型名称", "","list", "Parser相关配置"); + "模型名称", "", "list", "Parser相关配置"); parameter.setCandidateValues(Lists.newArrayList("gpt3.5", "gpt3.5-16k")); parameters.add(parameter); parameters.add(new Parameter("llm.api.key", "sk-secret", diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index f3a33456c..533bb84bd 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -159,21 +159,6 @@ CREATE TABLE `s2_database` ( ); COMMENT ON TABLE s2_database IS 'database instance table'; -CREATE TABLE IF NOT EXISTS `s2_datasource` ( - `id` INT NOT NULL AUTO_INCREMENT, - `model_id` INT NOT NULL , - `name` varchar(255) NOT NULL , - `biz_name` varchar(255) NOT NULL , - `description` varchar(500) DEFAULT NULL , - - `created_at` TIMESTAMP NOT NULL , - `created_by` varchar(100) NOT NULL , - `updated_at` TIMESTAMP NOT NULL , - `updated_by` varchar(100) NOT NULL, - PRIMARY KEY (`id`) - ); -COMMENT ON TABLE s2_datasource IS 'datasource table'; - create table s2_auth_groups ( group_id INT, @@ -200,6 +185,7 @@ CREATE TABLE IF NOT EXISTS `s2_metric` ( `alias` varchar(500) DEFAULT NULL, `tags` varchar(500) DEFAULT NULL, `relate_dimensions` varchar(500) DEFAULT NULL, + `ext` LONGVARCHAR DEFAULT NULL , PRIMARY KEY (`id`) ); COMMENT ON TABLE s2_metric IS 'metric information table'; @@ -245,7 +231,7 @@ create table s2_view_info ( id INT auto_increment, domain_id INT null, - type varchar(20) null comment 'datasource、dimension、metric', + type varchar(20) null comment 'model、dimension、metric', config LONGVARCHAR null comment 'config detail', created_at TIMESTAMP null, created_by varchar(100) null, @@ -540,4 +526,16 @@ CREATE TABLE `s2_collect` ( `create_time` TIMESTAMP, `update_time` TIMESTAMP, PRIMARY KEY (`id`) -); \ No newline at end of file +); + +CREATE TABLE `s2_metric_query_default_config` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `metric_id` bigint , + `user_name` varchar(255) NOT NULL, + `default_config` varchar(1000) NOT NULL, + `created_at` TIMESTAMP null, + `updated_at` TIMESTAMP null, + `created_by` varchar(100) null, + `updated_by` varchar(100) not null, + PRIMARY KEY (`id`) +); diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index 62b9787a2..4734a7a44 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -200,38 +200,6 @@ CREATE TABLE `s2_database` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据库实例表'; -CREATE TABLE `s2_datasource` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `model_id` bigint(20) DEFAULT NULL, - `name` varchar(255) NOT NULL COMMENT '数据源名称', - `biz_name` varchar(255) NOT NULL COMMENT '内部名称', - `agg_time` varchar(32) DEFAULT 'day', - `description` varchar(500) DEFAULT NULL COMMENT '数据源描述', - `database_id` bigint(20) NOT NULL COMMENT '数据库实例ID', - `datasource_detail` mediumtext NOT NULL COMMENT '数据源配置', - `status` int(11) DEFAULT NULL , - `depends` text DEFAULT NULL COMMENT '上游依赖标识', - `filter_sql` varchar(1000) DEFAULT NULL , - `created_at` datetime NOT NULL COMMENT '创建时间', - `created_by` varchar(100) NOT NULL COMMENT '创建人', - `updated_at` datetime NOT NULL COMMENT '更新时间', - `updated_by` varchar(100) NOT NULL COMMENT '更新人', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `s2_datasource_rela` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `model_id` bigint(20) DEFAULT NULL, - `datasource_from` bigint(20) DEFAULT NULL, - `datasource_to` bigint(20) DEFAULT NULL, - `join_key` varchar(100) DEFAULT NULL, - `created_at` datetime DEFAULT NULL, - `created_by` varchar(100) DEFAULT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `s2_dictionary` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `item_id` bigint(20) DEFAULT NULL COMMENT '对应维度id、指标id等', @@ -475,6 +443,7 @@ CREATE TABLE `s2_materialization` `description` mediumtext COMMENT '备注说明', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + CREATE TABLE `s2_materialization_element` ( `id` bigint(20) NOT NULL COMMENT 'element类型对应id', @@ -493,6 +462,7 @@ CREATE TABLE `s2_materialization_element` `status` int(11) NOT NULL DEFAULT '1' COMMENT '0-废弃,1-使用中', PRIMARY KEY (`id`, `type`, `materialization_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `s2_materialization_record` ( `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', @@ -533,11 +503,22 @@ CREATE TABLE s2_model_rela )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE `s2_collect` ( - `id` bigint NOT NULL AUTO_INCREMENT, + `id` bigint NOT NULL primary key AUTO_INCREMENT, `type` varchar(20) NOT NULL, `username` varchar(20) NOT NULL, `collect_id` bigint NOT NULL, `create_time` datetime, `update_time` datetime, PRIMARY KEY (`id`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `s2_metric_query_default_config` ( + `id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT, + `metric_id` bigint, + `user_name` varchar(255) NOT NULL, + `default_config` varchar(1000) NOT NULL, + `created_at` datetime null, + `updated_at` datetime null, + `created_by` varchar(100) null, + `updated_by` varchar(100) null +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/launchers/standalone/src/main/resources/db/sql-update.sql b/launchers/standalone/src/main/resources/db/sql-update.sql index c17f4ad92..61d06443c 100644 --- a/launchers/standalone/src/main/resources/db/sql-update.sql +++ b/launchers/standalone/src/main/resources/db/sql-update.sql @@ -116,4 +116,28 @@ CREATE TABLE s2_model_rela ); alter table s2_view_info change model_id domain_id bigint; -alter table s2_dimension drop column datasource_id; \ No newline at end of file +alter table s2_dimension drop column datasource_id; + +-- 20231211 +CREATE TABLE `s2_collect` +( + `id` bigint NOT NULL primary key AUTO_INCREMENT, + `type` varchar(20) NOT NULL, + `username` varchar(20) NOT NULL, + `collect_id` bigint NOT NULL, + `create_time` datetime, + `update_time` datetime, + PRIMARY KEY (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE `s2_metric_query_default_config` +( + `id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT, + `metric_id` bigint, + `user_name` varchar(255) NOT NULL, + `default_config` varchar(1000) NOT NULL, + `created_at` datetime null, + `updated_at` datetime null, + `created_by` varchar(100) null, + `updated_by` varchar(100) null +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricQueryDefaultConfig.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricQueryDefaultConfig.java new file mode 100644 index 000000000..e9b77c552 --- /dev/null +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/pojo/MetricQueryDefaultConfig.java @@ -0,0 +1,18 @@ +package com.tencent.supersonic.semantic.api.model.pojo; + +import com.tencent.supersonic.common.pojo.RecordInfo; +import lombok.Data; + +@Data +public class MetricQueryDefaultConfig extends RecordInfo { + + private Long id; + + private Long metricId; + + private String userName; + + //string of queryStruct + private String defaultConfig; + +} diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java index dd371906a..bd0b3a37f 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/request/MetricBaseReq.java @@ -1,12 +1,15 @@ package com.tencent.supersonic.semantic.api.model.request; +import com.tencent.supersonic.common.pojo.DataFormat; import com.tencent.supersonic.semantic.api.model.pojo.RelateDimension; import com.tencent.supersonic.semantic.api.model.pojo.SchemaItem; -import com.tencent.supersonic.common.pojo.DataFormat; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; + +import java.util.HashMap; import java.util.List; +import java.util.Map; @Data @@ -24,6 +27,8 @@ public class MetricBaseReq extends SchemaItem { private RelateDimension relateDimension; + private Map ext = new HashMap<>(); + public String getTag() { if (CollectionUtils.isEmpty(tags)) { return ""; diff --git a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java index cb917ba85..4d0119440 100644 --- a/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java +++ b/semantic/api/src/main/java/com/tencent/supersonic/semantic/api/model/response/MetricResp.java @@ -14,7 +14,9 @@ import lombok.ToString; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -48,6 +50,8 @@ public class MetricResp extends SchemaItem { private Boolean isCollect; + private Map ext = new HashMap<>(); + public void setTag(String tag) { if (StringUtils.isBlank(tag)) { tags = Lists.newArrayList(); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java index f09599392..83d62cbae 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/DimensionServiceImpl.java @@ -43,7 +43,6 @@ import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -183,12 +182,6 @@ public class DimensionServiceImpl implements DimensionService { return null; } - @Override - public DimensionResp getDimension(Long id) { - DimensionDO dimensionDO = dimensionRepository.getDimensionById(id); - return DimensionConverter.convert2DimensionResp(dimensionDO, new HashMap<>()); - } - @Override public PageInfo queryDimension(PageDimensionReq pageDimensionReq) { DimensionFilter dimensionFilter = new DimensionFilter(); @@ -211,7 +204,8 @@ public class DimensionServiceImpl implements DimensionService { public List getDimensions(MetaFilter metaFilter) { DimensionFilter dimensionFilter = new DimensionFilter(); BeanUtils.copyProperties(metaFilter, dimensionFilter); - return convertList(dimensionRepository.getDimension(dimensionFilter), modelService.getModelMap()); + List dimensionDOS = dimensionRepository.getDimension(dimensionFilter); + return convertList(dimensionDOS, modelService.getModelMap()); } private List getDimensions(Long modelId) { @@ -238,7 +232,8 @@ public class DimensionServiceImpl implements DimensionService { List dimensionResps = Lists.newArrayList(); if (!CollectionUtils.isEmpty(dimensionDOS)) { dimensionResps = dimensionDOS.stream() - .map(dimensionDO -> DimensionConverter.convert2DimensionResp(dimensionDO, modelRespMap)) + .map(dimensionDO -> DimensionConverter + .convert2DimensionResp(dimensionDO, modelRespMap)) .collect(Collectors.toList()); } return dimensionResps; diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java index 9073204d0..d1669f732 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/MetricServiceImpl.java @@ -13,9 +13,11 @@ import com.tencent.supersonic.common.pojo.enums.EventType; import com.tencent.supersonic.common.pojo.enums.StatusEnum; 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.common.util.ChatGptHelper; import com.tencent.supersonic.semantic.api.model.pojo.DrillDownDimension; import com.tencent.supersonic.semantic.api.model.pojo.Measure; +import com.tencent.supersonic.semantic.api.model.pojo.MetricQueryDefaultConfig; import com.tencent.supersonic.semantic.api.model.pojo.MetricTypeParams; import com.tencent.supersonic.semantic.api.model.request.MetaBatchReq; import com.tencent.supersonic.semantic.api.model.request.MetricReq; @@ -29,6 +31,7 @@ import com.tencent.supersonic.semantic.model.domain.MetricService; import com.tencent.supersonic.semantic.model.domain.ModelService; import com.tencent.supersonic.semantic.model.domain.dataobject.CollectDO; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; +import com.tencent.supersonic.semantic.model.domain.dataobject.MetricQueryDefaultConfigDO; import com.tencent.supersonic.semantic.model.domain.pojo.MetaFilter; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import com.tencent.supersonic.semantic.model.domain.repository.MetricRepository; @@ -291,6 +294,29 @@ public class MetricServiceImpl implements MetricService { return metricDOS.stream().map(this::getDataItem).collect(Collectors.toList()); } + @Override + public void saveOrUpdateMetricQueryDefaultConfig(MetricQueryDefaultConfig queryDefaultConfig, User user) { + MetricQueryDefaultConfigDO metricQueryDefaultConfigDO = new MetricQueryDefaultConfigDO(); + if (queryDefaultConfig.getId() == null) { + queryDefaultConfig.createdBy(user.getName()); + BeanMapper.mapper(queryDefaultConfig, metricQueryDefaultConfigDO); + metricRepository.saveDefaultQueryConfig(metricQueryDefaultConfigDO); + } else { + queryDefaultConfig.updatedBy(user.getName()); + BeanMapper.mapper(queryDefaultConfig, metricQueryDefaultConfigDO); + metricRepository.updateDefaultQueryConfig(metricQueryDefaultConfigDO); + } + } + + @Override + public MetricQueryDefaultConfig getMetricQueryDefaultConfig(Long metricId, User user) { + MetricQueryDefaultConfigDO metricQueryDefaultConfigDO = + metricRepository.getDefaultQueryConfig(metricId, user.getName()); + MetricQueryDefaultConfig metricQueryDefaultConfig = new MetricQueryDefaultConfig(); + BeanMapper.mapper(metricQueryDefaultConfigDO, metricQueryDefaultConfig); + return metricQueryDefaultConfig; + } + private void checkParam(MetricReq metricReq) { MetricTypeParams typeParams = metricReq.getTypeParams(); List measures = typeParams.getMeasures(); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java index 7bffed91f..a1406c54e 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/application/ModelServiceImpl.java @@ -211,8 +211,8 @@ public class ModelServiceImpl implements ModelService { .stream().map(measure -> ModelConverter.convert(measure, modelResp))).collect(Collectors.toList()); } - private void batchCreateDimension(ModelDO datasourceDO, User user) throws Exception { - List dimensionReqs = ModelConverter.convertDimensionList(datasourceDO); + private void batchCreateDimension(ModelDO modelDO, User user) throws Exception { + List dimensionReqs = ModelConverter.convertDimensionList(modelDO); dimensionService.createDimensionBatch(dimensionReqs, user); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java index 773932b43..0b67f441c 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/DimensionService.java @@ -17,8 +17,6 @@ public interface DimensionService { List getDimensions(MetaFilter metaFilter); - DimensionResp getDimension(Long id); - DimensionResp getDimension(String bizName, Long modelId); void batchUpdateStatus(MetaBatchReq metaBatchReq, User user); diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java index a1a95c501..ca9149d38 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/MetricService.java @@ -5,6 +5,7 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.common.pojo.DataItem; import com.tencent.supersonic.common.pojo.enums.EventType; import com.tencent.supersonic.semantic.api.model.pojo.DrillDownDimension; +import com.tencent.supersonic.semantic.api.model.pojo.MetricQueryDefaultConfig; import com.tencent.supersonic.semantic.api.model.request.MetaBatchReq; import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; @@ -41,5 +42,9 @@ public interface MetricService { List getDataItems(Long modelId); + void saveOrUpdateMetricQueryDefaultConfig(MetricQueryDefaultConfig queryDefaultConfig, User user); + + MetricQueryDefaultConfig getMetricQueryDefaultConfig(Long metricId, User user); + void sendMetricEventBatch(List modelIds, EventType eventType); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java index 4b5466c16..021115a07 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricDO.java @@ -98,4 +98,6 @@ public class MetricDO { */ private String typeParams; + private String ext; + } \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricQueryDefaultConfigDO.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricQueryDefaultConfigDO.java new file mode 100644 index 000000000..8063033a6 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/dataobject/MetricQueryDefaultConfigDO.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.semantic.model.domain.dataobject; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("s2_metric_query_default_config") +public class MetricQueryDefaultConfigDO { + + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long metricId; + + private String userName; + + private String defaultConfig; + + private Date createdAt; + + private String createdBy; + + private Date updatedAt; + + private String updatedBy; + +} diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java index 81e24f771..be9c267b7 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/repository/MetricRepository.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.semantic.model.domain.repository; +import com.tencent.supersonic.semantic.model.domain.dataobject.MetricQueryDefaultConfigDO; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; import java.util.List; @@ -19,4 +20,10 @@ public interface MetricRepository { MetricDO getMetricById(Long id); List getMetric(MetricFilter metricFilter); + + void saveDefaultQueryConfig(MetricQueryDefaultConfigDO defaultConfigDO); + + void updateDefaultQueryConfig(MetricQueryDefaultConfigDO defaultConfigDO); + + MetricQueryDefaultConfigDO getDefaultQueryConfig(Long metricId, String userName); } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java index c0af6208c..af6a111ed 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/domain/utils/MetricConverter.java @@ -34,6 +34,7 @@ public class MetricConverter { metricDO.setTags(metricReq.getTag()); metricDO.setRelateDimensions(JSONObject.toJSONString(metricReq.getRelateDimension())); metricDO.setStatus(StatusEnum.ONLINE.getCode()); + metricDO.setExt(JSONObject.toJSONString(metricReq.getExt())); return metricDO; } @@ -47,6 +48,7 @@ public class MetricConverter { metricDO.setRelateDimensions(JSONObject.toJSONString(metricReq.getRelateDimension())); } metricDO.setTags(metricReq.getTag()); + metricDO.setExt(JSONObject.toJSONString(metricReq.getExt())); return metricDO; } @@ -74,6 +76,9 @@ public class MetricConverter { metricResp.setTag(metricDO.getTags()); metricResp.setRelateDimension(JSONObject.parseObject(metricDO.getRelateDimensions(), RelateDimension.class)); + if (metricDO.getExt() != null) { + metricResp.setExt(JSONObject.parseObject(metricDO.getExt(), Map.class)); + } return metricResp; } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricQueryDefaultConfigDOMapper.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricQueryDefaultConfigDOMapper.java new file mode 100644 index 000000000..36f81f655 --- /dev/null +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/mapper/MetricQueryDefaultConfigDOMapper.java @@ -0,0 +1,13 @@ +package com.tencent.supersonic.semantic.model.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tencent.supersonic.semantic.model.domain.dataobject.MetricQueryDefaultConfigDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MetricQueryDefaultConfigDOMapper extends BaseMapper { + + + + +} \ No newline at end of file diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java index c32bfc5c5..e9b9f9fbd 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/infrastructure/repository/MetricRepositoryImpl.java @@ -1,11 +1,15 @@ package com.tencent.supersonic.semantic.model.infrastructure.repository; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.tencent.supersonic.semantic.model.domain.dataobject.MetricDO; +import com.tencent.supersonic.semantic.model.domain.dataobject.MetricQueryDefaultConfigDO; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; import com.tencent.supersonic.semantic.model.domain.repository.MetricRepository; import com.tencent.supersonic.semantic.model.infrastructure.mapper.MetricDOCustomMapper; import com.tencent.supersonic.semantic.model.infrastructure.mapper.MetricDOMapper; +import com.tencent.supersonic.semantic.model.infrastructure.mapper.MetricQueryDefaultConfigDOMapper; import org.springframework.stereotype.Component; + import java.util.List; @@ -17,10 +21,14 @@ public class MetricRepositoryImpl implements MetricRepository { private MetricDOCustomMapper metricDOCustomMapper; + private MetricQueryDefaultConfigDOMapper metricQueryDefaultConfigDOMapper; + public MetricRepositoryImpl(MetricDOMapper metricDOMapper, - MetricDOCustomMapper metricDOCustomMapper) { + MetricDOCustomMapper metricDOCustomMapper, + MetricQueryDefaultConfigDOMapper metricQueryDefaultConfigDOMapper) { this.metricDOMapper = metricDOMapper; this.metricDOCustomMapper = metricDOCustomMapper; + this.metricQueryDefaultConfigDOMapper = metricQueryDefaultConfigDOMapper; } @Override @@ -54,4 +62,22 @@ public class MetricRepositoryImpl implements MetricRepository { return metricDOCustomMapper.query(metricFilter); } + @Override + public void saveDefaultQueryConfig(MetricQueryDefaultConfigDO defaultConfigDO) { + metricQueryDefaultConfigDOMapper.insert(defaultConfigDO); + } + + @Override + public void updateDefaultQueryConfig(MetricQueryDefaultConfigDO defaultConfigDO) { + metricQueryDefaultConfigDOMapper.updateById(defaultConfigDO); + } + + @Override + public MetricQueryDefaultConfigDO getDefaultQueryConfig(Long metricId, String userName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(MetricQueryDefaultConfigDO::getMetricId, metricId) + .eq(MetricQueryDefaultConfigDO::getCreatedBy, userName); + return metricQueryDefaultConfigDOMapper.selectOne(queryWrapper); + } + } diff --git a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java index 943907255..a2aed466d 100644 --- a/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java +++ b/semantic/model/src/main/java/com/tencent/supersonic/semantic/model/rest/MetricController.java @@ -7,25 +7,26 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; import com.tencent.supersonic.common.pojo.enums.SensitiveLevelEnum; import com.tencent.supersonic.semantic.api.model.pojo.DrillDownDimension; +import com.tencent.supersonic.semantic.api.model.pojo.MetricQueryDefaultConfig; import com.tencent.supersonic.semantic.api.model.request.MetaBatchReq; import com.tencent.supersonic.semantic.api.model.request.MetricReq; import com.tencent.supersonic.semantic.api.model.request.PageMetricReq; import com.tencent.supersonic.semantic.api.model.response.MetricResp; import com.tencent.supersonic.semantic.model.domain.MetricService; -import java.util.List; -import java.util.Set; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import com.tencent.supersonic.semantic.model.domain.pojo.MetaFilter; import com.tencent.supersonic.semantic.model.domain.pojo.MetricFilter; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Set; @RestController @@ -127,4 +128,22 @@ public class MetricController { public List getDrillDownDimension(Long metricId) { return metricService.getDrillDownDimension(metricId); } + + @PostMapping("/saveMetricQueryDefaultConfig") + public boolean saveMetricQueryDefaultConfig(@RequestBody MetricQueryDefaultConfig queryDefaultConfig, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + metricService.saveOrUpdateMetricQueryDefaultConfig(queryDefaultConfig, user); + return true; + } + + @RequestMapping("getMetricQueryDefaultConfig/{metricId}") + public MetricQueryDefaultConfig getMetricQueryDefaultConfig(@PathVariable("metricId") Long metricId, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return metricService.getMetricQueryDefaultConfig(metricId, user); + } + } diff --git a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java index 1e4731cf8..7d08713a0 100644 --- a/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java +++ b/semantic/query/src/main/java/com/tencent/supersonic/semantic/query/service/QueryServiceImpl.java @@ -6,6 +6,7 @@ import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.QueryType; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; @@ -310,6 +311,7 @@ public class QueryServiceImpl implements QueryService { dateInfo.setUnit(1); } queryStructReq.setDateInfo(dateInfo); + queryStructReq.setQueryType(QueryType.TAG); return queryStructReq; }