diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java index c61d88e9d..be0ac2efa 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java @@ -25,6 +25,7 @@ public class NL2SQLParser implements ChatParser { if (!ParseResp.ParseState.FAILED.equals(text2SqlParseResp.getState())) { parseResp.getSelectedParses().addAll(text2SqlParseResp.getSelectedParses()); } + parseResp.getParseTimeCost().setSqlTime(text2SqlParseResp.getParseTimeCost().getSqlTime()); } private boolean checkSkip(ParseResp parseResp) { diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java index fca502dfe..a3516c643 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/DateConf.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.common.pojo; +import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.common.util.DateUtils; import lombok.Data; import org.springframework.util.CollectionUtils; @@ -46,6 +47,8 @@ public class DateConf { private boolean isInherited; + private boolean groupByDate; + public List getDateList() { if (!CollectionUtils.isEmpty(dateList)) { return dateList; @@ -55,6 +58,18 @@ public class DateConf { return DateUtils.getDateList(startDateStr, endDateStr, getPeriod()); } + public String getGroupByTimeDimension() { + if (Constants.DAY.equals(period)) { + return TimeDimensionEnum.DAY.getName(); + } else if (Constants.WEEK.equals(period)) { + return TimeDimensionEnum.WEEK.getName(); + } else if (Constants.MONTH.equals(period)) { + return TimeDimensionEnum.MONTH.getName(); + } else { + return TimeDimensionEnum.DAY.getName(); + } + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java b/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java index cd2bb7d7b..c3037ce3a 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/Filter.java @@ -2,10 +2,10 @@ package com.tencent.supersonic.common.pojo; import com.tencent.supersonic.common.pojo.enums.FilterOperatorEnum; -import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; @Data @AllArgsConstructor @@ -13,6 +13,7 @@ import lombok.NoArgsConstructor; public class Filter { private Relation relation = Relation.FILTER; + private Long id; private String bizName; private String name; private FilterOperatorEnum operator; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadStructReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadMetricReq.java similarity index 80% rename from headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadStructReq.java rename to headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadMetricReq.java index c9c967e1b..93ae72097 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadStructReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DownloadMetricReq.java @@ -3,7 +3,7 @@ package com.tencent.supersonic.headless.api.pojo.request; import lombok.Data; @Data -public class DownloadStructReq extends QueryStructReq { +public class DownloadMetricReq extends QueryMetricReq { private boolean isTransform; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/PageMetricReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/PageMetricReq.java index 3e870f7a2..8ad709659 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/PageMetricReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/PageMetricReq.java @@ -11,4 +11,6 @@ public class PageMetricReq extends PageSchemaItemReq { private Integer isTag; + private Integer isPublish; + } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java index 7e9c11459..b7dfaee2f 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryMetricReq.java @@ -1,23 +1,28 @@ package com.tencent.supersonic.headless.api.pojo.request; +import com.google.common.collect.Lists; import com.tencent.supersonic.common.pojo.DateConf; -import java.util.List; +import com.tencent.supersonic.common.pojo.Filter; import lombok.Data; import lombok.ToString; +import java.util.List; + @Data @ToString public class QueryMetricReq { private Long domainId; - private List metricIds; + private List metricIds = Lists.newArrayList(); - private List metricNames; + private List metricNames = Lists.newArrayList(); - private List dimensionIds; + private List dimensionIds = Lists.newArrayList(); - private List dimensionNames; + private List dimensionNames = Lists.newArrayList(); + + private List filters = Lists.newArrayList(); private DateConf dateInfo = new DateConf(); diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MetricResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MetricResp.java index 408cd5f79..fe8160577 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MetricResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MetricResp.java @@ -63,6 +63,8 @@ public class MetricResp extends SchemaItem { private int isTag; + private Integer isPublish; + public void setClassifications(String tag) { if (StringUtils.isBlank(tag)) { classifications = Lists.newArrayList(); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/MetricDO.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/MetricDO.java index a733e06f4..048192882 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/MetricDO.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/MetricDO.java @@ -103,4 +103,6 @@ public class MetricDO { private String defineType; + private Integer isPublish; + } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/MetricDOCustomMapper.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/MetricDOCustomMapper.java index 1c93f17ba..772989c55 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/MetricDOCustomMapper.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/MetricDOCustomMapper.java @@ -3,8 +3,8 @@ package com.tencent.supersonic.headless.server.persistence.mapper; import com.tencent.supersonic.headless.server.persistence.dataobject.MetricDO; import com.tencent.supersonic.headless.server.pojo.MetricFilter; import com.tencent.supersonic.headless.server.pojo.MetricsFilter; -import java.util.List; import org.apache.ibatis.annotations.Mapper; +import java.util.List; @Mapper public interface MetricDOCustomMapper { @@ -13,6 +13,10 @@ public interface MetricDOCustomMapper { void batchUpdateStatus(List metricDOS); + void batchPublish(List metricDOS); + + void batchUnPublish(List metricDOS); + List query(MetricFilter metricFilter); List queryMetrics(MetricsFilter metricsFilter); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/MetricRepository.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/MetricRepository.java index 4ba881c94..cdf2fc48f 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/MetricRepository.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/MetricRepository.java @@ -18,6 +18,10 @@ public interface MetricRepository { void batchUpdateStatus(List metricDOS); + void batchPublish(List metricDOS); + + void batchUnPublish(List metricDOS); + MetricDO getMetricById(Long id); List getMetric(MetricFilter metricFilter); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/MetricRepositoryImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/MetricRepositoryImpl.java index 6b4f04783..11ce0b317 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/MetricRepositoryImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/MetricRepositoryImpl.java @@ -52,6 +52,16 @@ public class MetricRepositoryImpl implements MetricRepository { metricDOCustomMapper.batchUpdateStatus(metricDOS); } + @Override + public void batchPublish(List metricDOS) { + metricDOCustomMapper.batchPublish(metricDOS); + } + + @Override + public void batchUnPublish(List metricDOS) { + metricDOCustomMapper.batchUnPublish(metricDOS); + } + @Override public MetricDO getMetricById(Long id) { return metricDOMapper.selectById(id); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java index 28bb45e48..b86dd0ebb 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetaFilter.java @@ -3,6 +3,7 @@ package com.tencent.supersonic.headless.server.pojo; import com.google.common.base.Objects; import lombok.Data; import lombok.NoArgsConstructor; + import java.util.List; @@ -26,7 +27,7 @@ public class MetaFilter { private Integer sensitiveLevel; - private Integer status; + private List status; private String key; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetricFilter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetricFilter.java index 72b32f411..c5f95d3c3 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetricFilter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/MetricFilter.java @@ -7,4 +7,7 @@ public class MetricFilter extends MetaFilter { private String type; + private String userName; + + private Integer isPublish; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java index b8a510314..3f1dfd0cb 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/processor/SqlInfoProcessor.java @@ -34,6 +34,7 @@ public class SqlInfoProcessor implements ResultProcessor { @Override public void process(ParseResp parseResp, QueryContext queryContext, ChatContext chatContext) { + long start = System.currentTimeMillis(); List semanticQueries = queryContext.getCandidateQueries(); if (CollectionUtils.isEmpty(semanticQueries)) { return; @@ -41,6 +42,7 @@ public class SqlInfoProcessor implements ResultProcessor { List selectedParses = semanticQueries.stream().map(SemanticQuery::getParseInfo) .collect(Collectors.toList()); addSqlInfo(queryContext, selectedParses); + parseResp.getParseTimeCost().setSqlTime(System.currentTimeMillis() - start); } private void addSqlInfo(QueryContext queryContext, List semanticParseInfos) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DimensionController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DimensionController.java index 0169454bd..b5b4b7822 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DimensionController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/DimensionController.java @@ -9,10 +9,14 @@ import com.tencent.supersonic.headless.api.pojo.DimValueMap; import com.tencent.supersonic.headless.api.pojo.request.DimensionReq; import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; import com.tencent.supersonic.headless.api.pojo.request.PageDimensionReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; +import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.server.pojo.DimensionFilter; import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.service.DimensionService; +import com.tencent.supersonic.headless.server.service.QueryService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -30,11 +34,11 @@ import java.util.List; @RequestMapping("/api/semantic/dimension") public class DimensionController { + @Autowired private DimensionService dimensionService; - public DimensionController(DimensionService dimensionService) { - this.dimensionService = dimensionService; - } + @Autowired + private QueryService queryService; /** @@ -107,6 +111,14 @@ public class DimensionController { return dimensionService.queryDimension(pageDimensionReq); } + @PostMapping("/queryDimValue") + public SemanticQueryResp queryDimValue(@RequestBody QueryDimValueReq queryDimValueReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + return queryService.queryDimValue(queryDimValueReq, user); + } + @DeleteMapping("deleteDimension/{id}") public Boolean deleteDimension(@PathVariable("id") Long id, HttpServletRequest request, diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricController.java index e6b43cef4..1cb5b30af 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/MetricController.java @@ -65,6 +65,24 @@ public class MetricController { return true; } + @PostMapping("/batchPublish") + public Boolean batchPublish(@RequestBody MetaBatchReq metaBatchReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + metricService.batchPublish(metaBatchReq.getIds(), user); + return true; + } + + @PostMapping("/batchUnPublish") + public Boolean batchUnPublish(@RequestBody MetaBatchReq metaBatchReq, + HttpServletRequest request, + HttpServletResponse response) { + User user = UserHolder.findUser(request, response); + metricService.batchUnPublish(metaBatchReq.getIds(), user); + return true; + } + @PostMapping("/mockMetricAlias") public List mockMetricAlias(@RequestBody MetricBaseReq metricReq, HttpServletRequest request, diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/QueryController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/QueryController.java deleted file mode 100644 index 512a88195..000000000 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/QueryController.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.tencent.supersonic.headless.server.rest; - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; -import com.tencent.supersonic.common.util.JsonUtil; -import com.tencent.supersonic.headless.api.pojo.enums.QueryMethod; -import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq; -import com.tencent.supersonic.headless.api.pojo.request.DownloadStructReq; -import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; -import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; -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.response.ExplainResp; -import com.tencent.supersonic.headless.api.pojo.response.ItemQueryResultResp; -import com.tencent.supersonic.headless.api.pojo.response.ItemUseResp; -import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; -import com.tencent.supersonic.headless.server.service.DownloadService; -import com.tencent.supersonic.headless.server.service.QueryService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -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 javax.validation.Valid; -import java.util.List; - -@RestController -@RequestMapping("/api/semantic/query") -@Slf4j -public class QueryController { - - @Autowired - private QueryService queryService; - - @Autowired - private DownloadService downloadService; - - @PostMapping("/struct") - public Object queryByStruct(@RequestBody QueryStructReq queryStructReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); - QuerySqlReq querySqlReq = queryStructReq.convert(true); - return queryService.queryByReq(querySqlReq, user); - } - - @PostMapping("/queryMetricDataById") - public ItemQueryResultResp queryMetricDataById(@Valid @RequestBody QueryItemReq queryApiReq, - HttpServletRequest request) throws Exception { - return queryService.queryMetricDataById(queryApiReq, request); - } - - @PostMapping("/download/struct") - public void downloadByStruct(@RequestBody DownloadStructReq downloadStructReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); - downloadService.downloadByStruct(downloadStructReq, user, response); - } - - @PostMapping("/download/batch") - public void downloadBatch(@RequestBody BatchDownloadReq batchDownloadReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); - downloadService.batchDownload(batchDownloadReq, user, response); - } - - /** - * queryByMultiStruct - */ - @PostMapping("/multiStruct") - public Object queryByMultiStruct(@RequestBody QueryMultiStructReq queryMultiStructReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); - return queryService.queryByReq(queryMultiStructReq, user); - } - - /** - * getStatInfo - * query the used frequency of the metric/dimension - * - * @param itemUseReq - */ - @PostMapping("/stat") - public List getStatInfo(@RequestBody ItemUseReq itemUseReq) { - return queryService.getStatInfo(itemUseReq); - } - - @PostMapping("/queryDimValue") - public SemanticQueryResp queryDimValue(@RequestBody QueryDimValueReq queryDimValueReq, - HttpServletRequest request, - HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return queryService.queryDimValue(queryDimValueReq, user); - } - - @PostMapping("/explain") - public ExplainResp explain(@RequestBody ExplainSqlReq explainSqlReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { - User user = UserHolder.findUser(request, response); - String queryReqJson = JsonUtil.toString(explainSqlReq.getQueryReq()); - - if (QueryMethod.SQL.equals(explainSqlReq.getQueryTypeEnum())) { - ExplainSqlReq explainSqlReqNew = ExplainSqlReq.builder() - .queryReq(JsonUtil.toObject(queryReqJson, QuerySqlReq.class)) - .queryTypeEnum(explainSqlReq.getQueryTypeEnum()).build(); - return queryService.explain(explainSqlReqNew, user); - } - if (QueryMethod.STRUCT.equals(explainSqlReq.getQueryTypeEnum())) { - ExplainSqlReq explainSqlReqNew = ExplainSqlReq.builder() - .queryReq(JsonUtil.toObject(queryReqJson, QueryStructReq.class)) - .queryTypeEnum(explainSqlReq.getQueryTypeEnum()).build(); - return queryService.explain(explainSqlReqNew, user); - } - return null; - } - -} diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/api/MetricQueryApiController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/api/MetricQueryApiController.java index 601631003..beff50abf 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/api/MetricQueryApiController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/api/MetricQueryApiController.java @@ -2,8 +2,11 @@ package com.tencent.supersonic.headless.server.rest.api; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; +import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq; +import com.tencent.supersonic.headless.api.pojo.request.DownloadMetricReq; import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; +import com.tencent.supersonic.headless.server.service.DownloadService; import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.QueryService; import lombok.extern.slf4j.Slf4j; @@ -27,13 +30,32 @@ public class MetricQueryApiController { @Autowired private MetricService metricService; + @Autowired + private DownloadService downloadService; + @PostMapping("/metric") public Object queryByMetric(@RequestBody QueryMetricReq queryMetricReq, HttpServletRequest request, HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); QueryStructReq queryStructReq = metricService.convert(queryMetricReq); - return queryService.queryByReq(queryStructReq.convert(), user); + return queryService.queryByReq(queryStructReq.convert(true), user); + } + + @PostMapping("/download/metric") + public void downloadMetric(@RequestBody DownloadMetricReq downloadMetricReq, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + User user = UserHolder.findUser(request, response); + downloadService.downloadByStruct(downloadMetricReq, user, response); + } + + @PostMapping("/downloadBatch/metric") + public void downloadBatch(@RequestBody BatchDownloadReq batchDownloadReq, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + User user = UserHolder.findUser(request, response); + downloadService.batchDownload(batchDownloadReq, user, response); } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/DownloadService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/DownloadService.java index 45ecfc37b..403c3dbb1 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/DownloadService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/DownloadService.java @@ -2,12 +2,12 @@ package com.tencent.supersonic.headless.server.service; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq; -import com.tencent.supersonic.headless.api.pojo.request.DownloadStructReq; +import com.tencent.supersonic.headless.api.pojo.request.DownloadMetricReq; import javax.servlet.http.HttpServletResponse; public interface DownloadService { - void downloadByStruct(DownloadStructReq downloadStructReq, + void downloadByStruct(DownloadMetricReq downloadStructReq, User user, HttpServletResponse response) throws Exception; void batchDownload(BatchDownloadReq batchDownloadReq, User user, HttpServletResponse response) throws Exception; diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/MetricService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/MetricService.java index 1b1ec96ba..9d312b749 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/MetricService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/MetricService.java @@ -27,6 +27,10 @@ public interface MetricService { void batchUpdateStatus(MetaBatchReq metaBatchReq, User user); + void batchPublish(List metricIds, User user); + + void batchUnPublish(List metricIds, User user); + void deleteMetric(Long id, User user) throws Exception; PageInfo queryMetric(PageMetricReq pageMetricReq, User user); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java index ed21023ee..96557fdc0 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/QueryService.java @@ -4,15 +4,11 @@ import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; -import com.tencent.supersonic.headless.api.pojo.response.ItemQueryResultResp; import com.tencent.supersonic.headless.api.pojo.response.ItemUseResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; -import com.tencent.supersonic.headless.server.annotation.ApiHeaderCheck; -import javax.servlet.http.HttpServletRequest; import java.util.List; public interface QueryService { @@ -25,6 +21,4 @@ public interface QueryService { ExplainResp explain(ExplainSqlReq explainSqlReq, User user) throws Exception; - @ApiHeaderCheck - ItemQueryResultResp queryMetricDataById(QueryItemReq queryApiReq, HttpServletRequest request) throws Exception; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java index 2a1f8511a..e84022998 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DataSetServiceImpl.java @@ -33,6 +33,13 @@ import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DomainService; import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.TagMetaService; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.Arrays; import java.util.Comparator; import java.util.Date; @@ -43,13 +50,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; @Service public class DataSetServiceImpl @@ -109,8 +109,8 @@ public class DataSetServiceImpl if (!CollectionUtils.isEmpty(metaFilter.getIds())) { wrapper.lambda().in(DataSetDO::getId, metaFilter.getIds()); } - if (metaFilter.getStatus() != null) { - wrapper.lambda().eq(DataSetDO::getStatus, metaFilter.getStatus()); + if (!CollectionUtils.isEmpty(metaFilter.getStatus())) { + wrapper.lambda().in(DataSetDO::getStatus, metaFilter.getStatus()); } wrapper.lambda().ne(DataSetDO::getStatus, StatusEnum.DELETED.getCode()); return list(wrapper).stream().map(entry -> convert(entry, user)).collect(Collectors.toList()); @@ -212,7 +212,7 @@ public class DataSetServiceImpl @Override public Map> getModelIdToDataSetIds(List dataSetIds, User user) { MetaFilter metaFilter = new MetaFilter(); - metaFilter.setStatus(StatusEnum.ONLINE.getCode()); + metaFilter.setStatus(Lists.newArrayList(StatusEnum.ONLINE.getCode())); metaFilter.setIds(dataSetIds); List dataSetList = dataSetSchemaCache.getIfPresent(metaFilter); if (CollectionUtils.isEmpty(dataSetList)) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DownloadServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DownloadServiceImpl.java index 617de4893..7755f3104 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DownloadServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DownloadServiceImpl.java @@ -16,8 +16,9 @@ import com.tencent.supersonic.headless.api.pojo.DrillDownDimension; import com.tencent.supersonic.headless.api.pojo.RelateDimension; import com.tencent.supersonic.headless.api.pojo.enums.SemanticType; import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq; -import com.tencent.supersonic.headless.api.pojo.request.DownloadStructReq; +import com.tencent.supersonic.headless.api.pojo.request.DownloadMetricReq; 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.response.DimensionResp; import com.tencent.supersonic.headless.api.pojo.response.MetricResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; @@ -73,14 +74,14 @@ public class DownloadServiceImpl implements DownloadService { } @Override - public void downloadByStruct(DownloadStructReq downloadStructReq, - User user, HttpServletResponse response) throws Exception { + public void downloadByStruct(DownloadMetricReq downloadMetricReq, + User user, HttpServletResponse response) throws Exception { String fileName = String.format("%s_%s.xlsx", "supersonic", DateUtils.format(new Date(), DateUtils.FORMAT)); File file = FileUtils.createTmpFile(fileName); try { - QuerySqlReq querySqlReq = downloadStructReq.convert(true); - SemanticQueryResp queryResult = queryService.queryByReq(querySqlReq, user); - DataDownload dataDownload = buildDataDownload(queryResult, downloadStructReq); + QueryStructReq queryStructReq = metricService.convert(downloadMetricReq); + SemanticQueryResp queryResult = queryService.queryByReq(queryStructReq.convert(true), user); + DataDownload dataDownload = buildDataDownload(queryResult, queryStructReq, downloadMetricReq.isTransform()); EasyExcel.write(file).sheet("Sheet1").head(dataDownload.getHeaders()).doWrite(dataDownload.getData()); } catch (RuntimeException e) { EasyExcel.write(file).sheet("Sheet1").head(buildErrMessageHead()) @@ -126,11 +127,12 @@ public class DownloadServiceImpl implements DownloadService { List dimensions = getMetricRelaDimensions(metricResp, dimensionRespMap); for (MetricResp metric : metrics) { try { - DownloadStructReq downloadStructReq = buildDownloadReq(dimensions, metric, batchDownloadReq); - QuerySqlReq querySqlReq = downloadStructReq.convert(); + QueryStructReq queryStructReq = buildDownloadReq(dimensions, metric, batchDownloadReq); + QuerySqlReq querySqlReq = queryStructReq.convert(); querySqlReq.setNeedAuth(true); SemanticQueryResp queryResult = queryService.queryByReq(querySqlReq, user); - DataDownload dataDownload = buildDataDownload(queryResult, downloadStructReq); + DataDownload dataDownload = buildDataDownload(queryResult, + queryStructReq, batchDownloadReq.isTransform()); WriteSheet writeSheet = EasyExcel.writerSheet("Sheet" + sheetCount) .head(dataDownload.getHeaders()).build(); excelWriter.write(dataDownload.getData(), writeSheet); @@ -215,15 +217,16 @@ public class DownloadServiceImpl implements DownloadService { return data; } - private DataDownload buildDataDownload(SemanticQueryResp queryResult, DownloadStructReq downloadStructReq) { + private DataDownload buildDataDownload(SemanticQueryResp queryResult, + QueryStructReq queryStructReq, boolean isTransform) { List metricColumns = queryResult.getMetricColumns(); List dimensionColumns = queryResult.getDimensionColumns(); - if (downloadStructReq.isTransform() && !CollectionUtils.isEmpty(metricColumns)) { + if (isTransform && !CollectionUtils.isEmpty(metricColumns)) { QueryColumn metric = metricColumns.get(0); - List groups = downloadStructReq.getGroups(); + List groups = queryStructReq.getGroups(); List> dataTransformed = DataTransformUtils.transform(queryResult.getResultList(), - metric.getNameEn(), groups, downloadStructReq.getDateInfo()); - List> headers = buildHeader(dimensionColumns, downloadStructReq.getDateInfo().getDateList()); + metric.getNameEn(), groups, queryStructReq.getDateInfo()); + List> headers = buildHeader(dimensionColumns, queryStructReq.getDateInfo().getDateList()); List> data = buildData(headers, getDimensionNameMap(dimensionColumns), dataTransformed, metric.getName()); return DataDownload.builder().headers(headers).data(data).build(); @@ -234,23 +237,22 @@ public class DownloadServiceImpl implements DownloadService { } } - private DownloadStructReq buildDownloadReq(List dimensionResps, MetricResp metricResp, - BatchDownloadReq batchDownloadReq) { + private QueryStructReq buildDownloadReq(List dimensionResps, MetricResp metricResp, + BatchDownloadReq batchDownloadReq) { DateConf dateConf = batchDownloadReq.getDateInfo(); Set modelIds = dimensionResps.stream().map(DimensionResp::getModelId).collect(Collectors.toSet()); modelIds.add(metricResp.getModelId()); - DownloadStructReq downloadStructReq = new DownloadStructReq(); - downloadStructReq.setGroups(dimensionResps.stream() + QueryStructReq queryStructReq = new QueryStructReq(); + queryStructReq.setGroups(dimensionResps.stream() .map(DimensionResp::getBizName).collect(Collectors.toList())); - downloadStructReq.getGroups().add(0, getTimeDimension(dateConf)); + queryStructReq.getGroups().add(0, getTimeDimension(dateConf)); Aggregator aggregator = new Aggregator(); aggregator.setColumn(metricResp.getBizName()); - downloadStructReq.setAggregators(Lists.newArrayList(aggregator)); - downloadStructReq.setDateInfo(dateConf); - downloadStructReq.setModelIds(modelIds); - downloadStructReq.setLimit(downloadSize); - downloadStructReq.setIsTransform(batchDownloadReq.isTransform()); - return downloadStructReq; + queryStructReq.setAggregators(Lists.newArrayList(aggregator)); + queryStructReq.setDateInfo(dateConf); + queryStructReq.setModelIds(modelIds); + queryStructReq.setLimit(downloadSize); + return queryStructReq; } private String getTimeDimension(DateConf dateConf) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java index 155b4a933..9478ed685 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java @@ -11,6 +11,7 @@ import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.DataEvent; import com.tencent.supersonic.common.pojo.DataItem; +import com.tencent.supersonic.common.pojo.Filter; import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.pojo.enums.EventType; import com.tencent.supersonic.common.pojo.enums.StatusEnum; @@ -56,6 +57,7 @@ import com.tencent.supersonic.headless.server.utils.MetricCheckUtils; import com.tencent.supersonic.headless.server.utils.MetricConverter; import com.tencent.supersonic.headless.server.utils.ModelClusterBuilder; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -190,6 +192,30 @@ public class MetricServiceImpl implements MetricService { } } + @Override + public void batchPublish(List metricIds, User user) { + MetricFilter metricFilter = new MetricFilter(); + metricFilter.setIds(metricIds); + List metrics = metricRepository.getMetric(metricFilter); + for (MetricDO metricDO : metrics) { + metricDO.setUpdatedAt(new Date()); + metricDO.setUpdatedBy(user.getName()); + } + metricRepository.batchPublish(metrics); + } + + @Override + public void batchUnPublish(List metricIds, User user) { + MetricFilter metricFilter = new MetricFilter(); + metricFilter.setIds(metricIds); + List metrics = metricRepository.getMetric(metricFilter); + for (MetricDO metricDO : metrics) { + metricDO.setUpdatedAt(new Date()); + metricDO.setUpdatedBy(user.getName()); + } + metricRepository.batchUnPublish(metrics); + } + @Override public void deleteMetric(Long id, User user) { MetricDO metricDO = metricRepository.getMetricById(id); @@ -206,6 +232,7 @@ public class MetricServiceImpl implements MetricService { @Override public PageInfo queryMetric(PageMetricReq pageMetricReq, User user) { MetricFilter metricFilter = new MetricFilter(); + metricFilter.setUserName(user.getName()); BeanUtils.copyProperties(pageMetricReq, metricFilter); List modelResps = modelService.getAllModelByDomainIds(pageMetricReq.getDomainIds()); List modelIds = modelResps.stream().map(ModelResp::getId).collect(Collectors.toList()); @@ -550,7 +577,9 @@ public class MetricServiceImpl implements MetricService { //2. get metrics and dimensions List metricResps = getMetricResps(queryMetricReq, modelIdsByDomainId); - List dimensionResps = getDimensionResps(queryMetricReq, modelIdsByDomainId); + List dimensionResps = getDimensionResps(modelIdsByDomainId); + Map dimensionRespMap = dimensionResps.stream() + .collect(Collectors.toMap(DimensionResp::getId, d -> d)); //3. choose ModelCluster Set modelIds = getModelIds(modelIdsByDomainId, metricResps, dimensionResps); @@ -559,16 +588,22 @@ public class MetricServiceImpl implements MetricService { //4. set groups List dimensionBizNames = dimensionResps.stream() .filter(entry -> modelCluster.getModelIds().contains(entry.getModelId())) - .map(entry -> entry.getBizName()).collect(Collectors.toList()); + .filter(entry -> queryMetricReq.getDimensionNames().contains(entry.getName()) + || queryMetricReq.getDimensionNames().contains(entry.getBizName()) + || queryMetricReq.getDimensionIds().contains(entry.getId())) + .map(SchemaItem::getBizName).collect(Collectors.toList()); QueryStructReq queryStructReq = new QueryStructReq(); - if (org.apache.commons.collections.CollectionUtils.isNotEmpty(dimensionBizNames)) { - queryStructReq.setGroups(dimensionBizNames); + if (queryMetricReq.getDateInfo().isGroupByDate()) { + queryStructReq.getGroups().add(queryMetricReq.getDateInfo().getGroupByTimeDimension()); + } + if (!CollectionUtils.isEmpty(dimensionBizNames)) { + queryStructReq.getGroups().addAll(dimensionBizNames); } //5. set aggregators List metricBizNames = metricResps.stream() .filter(entry -> modelCluster.getModelIds().contains(entry.getModelId())) - .map(entry -> entry.getBizName()).collect(Collectors.toList()); + .map(SchemaItem::getBizName).collect(Collectors.toList()); if (org.apache.commons.collections.CollectionUtils.isEmpty(metricBizNames)) { throw new IllegalArgumentException("Invalid input parameters, unable to obtain valid metrics"); } @@ -584,6 +619,16 @@ public class MetricServiceImpl implements MetricService { for (Long modelId : modelCluster.getModelIds()) { queryStructReq.addModelId(modelId); } + List filters = queryMetricReq.getFilters(); + for (Filter filter : filters) { + if (StringUtils.isBlank(filter.getBizName())) { + DimensionResp dimensionResp = dimensionRespMap.get(filter.getId()); + if (dimensionResp != null) { + filter.setBizName(dimensionResp.getBizName()); + } + } + } + queryStructReq.setDimensionFilters(filters); //7. set dateInfo queryStructReq.setDateInfo(queryMetricReq.getDateInfo()); return queryStructReq; @@ -626,9 +671,8 @@ public class MetricServiceImpl implements MetricService { return result; } - private List getDimensionResps(QueryMetricReq queryMetricReq, Set modelIds) { + private List getDimensionResps(Set modelIds) { DimensionsFilter dimensionsFilter = new DimensionsFilter(); - BeanUtils.copyProperties(queryMetricReq, dimensionsFilter); dimensionsFilter.setModelIds(new ArrayList<>(modelIds)); return dimensionService.queryDimensions(dimensionsFilter); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java index 734cc7c79..582c8c8f3 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/QueryServiceImpl.java @@ -3,32 +3,21 @@ package com.tencent.supersonic.headless.server.service.impl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.tencent.supersonic.auth.api.authentication.pojo.User; -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.enums.ApiItemType; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; -import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.headless.api.pojo.Dim; -import com.tencent.supersonic.headless.api.pojo.Item; import com.tencent.supersonic.headless.api.pojo.QueryParam; -import com.tencent.supersonic.headless.api.pojo.SingleItemQueryResult; import com.tencent.supersonic.headless.api.pojo.request.ExplainSqlReq; import com.tencent.supersonic.headless.api.pojo.request.ItemUseReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDimValueReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq; import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; 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.SchemaFilterReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; -import com.tencent.supersonic.headless.api.pojo.response.AppDetailResp; import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; import com.tencent.supersonic.headless.api.pojo.response.ExplainResp; -import com.tencent.supersonic.headless.api.pojo.response.ItemQueryResultResp; import com.tencent.supersonic.headless.api.pojo.response.ItemUseResp; -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.SemanticSchemaResp; @@ -41,27 +30,22 @@ import com.tencent.supersonic.headless.core.planner.QueryPlanner; import com.tencent.supersonic.headless.core.pojo.QueryStatement; import com.tencent.supersonic.headless.core.utils.ComponentFactory; import com.tencent.supersonic.headless.server.annotation.S2DataPermission; -import com.tencent.supersonic.headless.server.aspect.ApiHeaderCheckAspect; import com.tencent.supersonic.headless.server.manager.SemanticSchemaManager; -import com.tencent.supersonic.headless.server.pojo.DimensionFilter; import com.tencent.supersonic.headless.server.service.AppService; import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.utils.QueryReqConverter; import com.tencent.supersonic.headless.server.utils.QueryUtils; import com.tencent.supersonic.headless.server.utils.StatUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + @Service @Slf4j @@ -158,7 +142,7 @@ public class QueryServiceImpl implements QueryService { return null; } - private QueryStatement buildStructQueryStatement(QueryStructReq queryStructReq) throws Exception { + private QueryStatement buildStructQueryStatement(QueryStructReq queryStructReq) { SchemaFilterReq filter = buildSchemaFilterReq(queryStructReq); SemanticSchemaResp semanticSchemaResp = catalog.fetchSemanticSchema(filter); QueryStatement queryStatement = new QueryStatement(); @@ -217,84 +201,6 @@ public class QueryServiceImpl implements QueryService { return getExplainResp(queryStatement); } - @Override - public ItemQueryResultResp queryMetricDataById(QueryItemReq queryItemReq, - HttpServletRequest request) throws Exception { - AppDetailResp appDetailResp = getAppDetailResp(request); - authCheck(appDetailResp, queryItemReq.getIds(), ApiItemType.METRIC); - List results = Lists.newArrayList(); - Map map = appDetailResp.getConfig().getItems().stream() - .collect(Collectors.toMap(Item::getId, i -> i)); - for (Long id : queryItemReq.getIds()) { - Item item = map.get(id); - SingleItemQueryResult apiQuerySingleResult = dataQuery(appDetailResp.getId(), - item, queryItemReq.getDateConf(), queryItemReq.getLimit()); - results.add(apiQuerySingleResult); - } - return ItemQueryResultResp.builder().results(results).build(); - } - - private QueryStructReq buildQueryStructReq(List dimensionResps, - MetricResp metricResp, DateConf dateConf, Long limit) { - Set modelIds = dimensionResps.stream().map(DimensionResp::getModelId).collect(Collectors.toSet()); - modelIds.add(metricResp.getModelId()); - QueryStructReq queryStructReq = new QueryStructReq(); - queryStructReq.setGroups(dimensionResps.stream() - .map(DimensionResp::getBizName).collect(Collectors.toList())); - queryStructReq.getGroups().add(0, getTimeDimension(dateConf)); - Aggregator aggregator = new Aggregator(); - aggregator.setColumn(metricResp.getBizName()); - queryStructReq.setAggregators(Lists.newArrayList(aggregator)); - queryStructReq.setDateInfo(dateConf); - queryStructReq.setModelIds(modelIds); - queryStructReq.setLimit(limit); - return queryStructReq; - } - - private SingleItemQueryResult dataQuery(Integer appId, Item item, DateConf dateConf, Long limit) throws Exception { - MetricResp metricResp = catalog.getMetric(item.getId()); - item.setCreatedBy(metricResp.getCreatedBy()); - item.setBizName(metricResp.getBizName()); - item.setName(metricResp.getName()); - List items = item.getRelateItems(); - List dimensionResps = Lists.newArrayList(); - if (!CollectionUtils.isEmpty(items)) { - List ids = items.stream().map(Item::getId).collect(Collectors.toList()); - DimensionFilter dimensionFilter = new DimensionFilter(); - dimensionFilter.setIds(ids); - dimensionResps = catalog.getDimensions(dimensionFilter); - } - QueryStructReq queryStructReq = buildQueryStructReq(dimensionResps, metricResp, dateConf, limit); - SemanticQueryResp semanticQueryResp = queryByReq(queryStructReq, User.getAppUser(appId)); - SingleItemQueryResult apiQuerySingleResult = new SingleItemQueryResult(); - apiQuerySingleResult.setItem(item); - apiQuerySingleResult.setResult(semanticQueryResp); - return apiQuerySingleResult; - } - - private AppDetailResp getAppDetailResp(HttpServletRequest request) { - int appId = Integer.parseInt(request.getHeader(ApiHeaderCheckAspect.APPID)); - return appService.getApp(appId); - } - - private String getTimeDimension(DateConf dateConf) { - if (Constants.MONTH.equals(dateConf.getPeriod())) { - return TimeDimensionEnum.MONTH.getName(); - } else if (Constants.WEEK.equals(dateConf.getPeriod())) { - return TimeDimensionEnum.WEEK.getName(); - } else { - return TimeDimensionEnum.DAY.getName(); - } - } - - private void authCheck(AppDetailResp appDetailResp, List ids, ApiItemType type) { - Set idsInApp = appDetailResp.allItems().stream() - .filter(item -> type.equals(item.getType())).map(Item::getId).collect(Collectors.toSet()); - if (!idsInApp.containsAll(ids)) { - throw new InvalidArgumentException("查询范围超过应用申请范围, 请检查"); - } - } - private ExplainResp getExplainResp(QueryStatement queryStatement) { String sql = ""; if (Objects.nonNull(queryStatement)) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SchemaServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SchemaServiceImpl.java index c0df510ba..463bb28fb 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SchemaServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/SchemaServiceImpl.java @@ -1,7 +1,5 @@ package com.tencent.supersonic.headless.server.service.impl; -import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; - import com.github.pagehelper.PageInfo; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -49,6 +47,12 @@ import com.tencent.supersonic.headless.server.utils.DataSetSchemaBuilder; import com.tencent.supersonic.headless.server.utils.DimensionConverter; import com.tencent.supersonic.headless.server.utils.MetricConverter; import com.tencent.supersonic.headless.server.utils.StatUtils; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -57,11 +61,8 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; + +import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; @Slf4j @Service @@ -159,7 +160,7 @@ public class SchemaServiceImpl implements SchemaService { public List buildDataSetSchema(DataSetFilterReq filter) { MetaFilter metaFilter = new MetaFilter(); - metaFilter.setStatus(StatusEnum.ONLINE.getCode()); + metaFilter.setStatus(Lists.newArrayList(StatusEnum.ONLINE.getCode())); metaFilter.setIds(filter.getDataSetIds()); List dataSetResps = dataSetService.getDataSetList(metaFilter, User.getFakeUser()); Map dataSetRespMap = getDataSetMap(dataSetResps); @@ -209,7 +210,7 @@ public class SchemaServiceImpl implements SchemaService { return modelSchemaResps; } MetaFilter metaFilter = new MetaFilter(modelIds); - metaFilter.setStatus(StatusEnum.ONLINE.getCode()); + metaFilter.setStatus(Lists.newArrayList(StatusEnum.ONLINE.getCode())); Map> metricRespMap = metricService.getMetrics(metaFilter) .stream().collect(Collectors.groupingBy(MetricResp::getModelId)); Map> dimensionRespsMap = dimensionService.getDimensions(metaFilter) diff --git a/headless/server/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml b/headless/server/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml index ffb6e36fe..c0af37429 100644 --- a/headless/server/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml +++ b/headless/server/src/main/resources/mapper/custom/DimensionDOCustomMapper.xml @@ -143,8 +143,12 @@ and t.sensitive_level = #{sensitiveLevel} - - and t.status = #{status} + + and t.status in + + #{status} + and t.model_id in @@ -166,6 +170,9 @@ and t1.id is not null + + and t1.id is null + diff --git a/headless/server/src/main/resources/mapper/custom/MetricDOCustomMapper.xml b/headless/server/src/main/resources/mapper/custom/MetricDOCustomMapper.xml index 9654f5c32..312ef93ee 100644 --- a/headless/server/src/main/resources/mapper/custom/MetricDOCustomMapper.xml +++ b/headless/server/src/main/resources/mapper/custom/MetricDOCustomMapper.xml @@ -97,6 +97,26 @@ + + + update s2_metric + set is_publish = 1, + updated_at = #{metric.updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{metric.updatedBy,jdbcType=VARCHAR} + where id = #{metric.id,jdbcType=BIGINT} + + + + + + update s2_metric + set is_publish = 0, + updated_at = #{metric.updatedAt,jdbcType=TIMESTAMP}, + updated_by = #{metric.updatedBy,jdbcType=VARCHAR} + where id = #{metric.id,jdbcType=BIGINT} + + +