diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java b/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java index b630dc5ea..00e6362eb 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/RecordInfo.java @@ -10,7 +10,6 @@ import java.util.Date; @ToString public class RecordInfo { - private String createdBy; private String updatedBy; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagDeleteReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagDeleteReq.java new file mode 100644 index 000000000..313dd1502 --- /dev/null +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagDeleteReq.java @@ -0,0 +1,14 @@ +package com.tencent.supersonic.headless.api.pojo.request; + +import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; +import lombok.Data; + +import java.util.List; + +@Data +public class TagDeleteReq { + + private List ids; + private List itemIds; + private TagDefineType type; +} \ No newline at end of file diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagFilterPageReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagFilterPageReq.java new file mode 100644 index 000000000..ef89db282 --- /dev/null +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagFilterPageReq.java @@ -0,0 +1,15 @@ +package com.tencent.supersonic.headless.api.pojo.request; + +import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class TagFilterPageReq extends PageSchemaItemReq { + + @NotNull + private Long tagObjectId; + + private TagDefineType tagDefineType; +} \ No newline at end of file diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagReq.java index e03a95890..2c7f04851 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/TagReq.java @@ -1,33 +1,20 @@ package com.tencent.supersonic.headless.api.pojo.request; -import com.alibaba.fastjson.JSONObject; -import com.tencent.supersonic.headless.api.pojo.SchemaItem; -import com.tencent.supersonic.headless.api.pojo.TagDefineParams; +import com.tencent.supersonic.common.pojo.RecordInfo; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; -import com.tencent.supersonic.headless.api.pojo.enums.TagType; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; import lombok.Data; +import javax.validation.constraints.NotNull; + @Data -public class TagReq extends SchemaItem { +public class TagReq extends RecordInfo { - private Long modelId; - private Map ext = new HashMap<>(); + private Long id; + + @NotNull private TagDefineType tagDefineType; - private TagDefineParams tagDefineParams; - public String getTypeParamsJson() { - return JSONObject.toJSONString(tagDefineParams); - } - - public String getExtJson() { - return Objects.nonNull(ext) && ext.size() > 0 ? JSONObject.toJSONString(ext) : ""; - } - - public TagType getType() { - return TagType.getType(tagDefineType); - } + @NotNull + private Long itemId; } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TagResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TagResp.java index f1e13582c..bd416f6cc 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TagResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/TagResp.java @@ -1,16 +1,13 @@ package com.tencent.supersonic.headless.api.pojo.response; -import com.tencent.supersonic.headless.api.pojo.SchemaItem; -import com.tencent.supersonic.headless.api.pojo.TagDefineParams; -import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; -import java.util.HashMap; -import java.util.Map; import lombok.Data; import lombok.ToString; @Data @ToString(callSuper = true) -public class TagResp extends SchemaItem { +public class TagResp { + + private Long id; private Long domainId; @@ -20,20 +17,22 @@ public class TagResp extends SchemaItem { private String modelName; - private String type; + private Long tagObjectId; + + private String tagObjectName; private Boolean isCollect; private boolean hasAdminRes; - private Map ext = new HashMap<>(); + private String tagDefineType; - private TagDefineType tagDefineType = TagDefineType.FIELD; + private Long itemId; - private TagDefineParams tagDefineParams; + private String name; - public String getExpr() { - return tagDefineParams.getExpr(); - } + private String bizName; + + private String description; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java index 917def893..88245bef4 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/manager/SemanticSchemaManager.java @@ -31,6 +31,7 @@ import com.tencent.supersonic.headless.server.pojo.yaml.MetricTypeParamsYamlTpl; import com.tencent.supersonic.headless.server.pojo.yaml.MetricYamlTpl; import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.utils.DatabaseConverter; + import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -41,6 +42,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Triple; import org.springframework.stereotype.Service; @@ -123,12 +125,14 @@ public class SemanticSchemaManager { private void addTagModel(TagResp tagResp, List modelDimensions, List modelMetrics) throws Exception { - switch (tagResp.getTagDefineType()) { + TagDefineType tagDefineType = TagDefineType.valueOf(tagResp.getTagDefineType()); + switch (tagDefineType) { case FIELD: case DIMENSION: if (TagDefineType.DIMENSION.equals(tagResp.getTagDefineType())) { Optional modelDimension = modelDimensions.stream() - .filter(d -> d.getBizName().equals(tagResp.getExpr())).findFirst(); + // .filter(d -> d.getBizName().equals(tagResp.getExpr())) + .findFirst(); if (modelDimension.isPresent()) { modelDimension.get().setName(tagResp.getBizName()); return; @@ -136,7 +140,7 @@ public class SemanticSchemaManager { } Dimension dimension = Dimension.builder().build(); dimension.setType(""); - dimension.setExpr(tagResp.getExpr()); + // dimension.setExpr(tagResp.getExpr()); dimension.setName(tagResp.getBizName()); dimension.setOwners(""); dimension.setBizName(tagResp.getBizName()); @@ -150,12 +154,12 @@ public class SemanticSchemaManager { return; case METRIC: Optional modelMetric = modelMetrics.stream() - .filter(m -> m.getName().equalsIgnoreCase(tagResp.getExpr())).findFirst(); + // .filter(m -> m.getName().equalsIgnoreCase(tagResp.getExpr())) + .findFirst(); if (modelMetric.isPresent()) { modelMetric.get().setName(tagResp.getBizName()); } else { - throw new Exception(String.format("tag [{}] cant find the metric [{}]", tagResp.getBizName(), - tagResp.getExpr())); + throw new Exception(String.format("tag [{}] cant find the metric", tagResp.getBizName())); } return; default: diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/TagDO.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/TagDO.java index 24dbca99b..66f8604c8 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/TagDO.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/dataobject/TagDO.java @@ -14,37 +14,12 @@ public class TagDO { private Long id; /** - * 主体域ID + * itemID */ - private Long modelId; + private Long itemId; /** - * 标签名称 - */ - private String name; - - /** - * 标签业务名称 - */ - private String bizName; - - /** - * 描述 - */ - private String description; - - /** - * 指标状态,0正常,1下架,2删除 - */ - private Integer status; - - /** - * 敏感级别 - */ - private Integer sensitiveLevel; - - /** - * 类型 DERIVED,ATOMIC + * 标签类型 */ private String type; @@ -68,12 +43,4 @@ public class TagDO { */ private String updatedBy; - - /** - * 类型参数 - */ - private String defineType; - private String typeParams; - private String ext; - } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/TagCustomMapper.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/TagCustomMapper.java index 597bcc8bf..0cceaed97 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/TagCustomMapper.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/mapper/TagCustomMapper.java @@ -1,5 +1,6 @@ package com.tencent.supersonic.headless.server.persistence.mapper; +import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; import com.tencent.supersonic.headless.server.pojo.TagFilter; import java.util.List; @@ -7,7 +8,12 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface TagCustomMapper { - List query(TagFilter tagFilter); - Boolean batchUpdateStatus(List tagDOList); + List queryTagRespList(TagFilter tagFilter); + + List getTagDOList(TagFilter tagFilter); + + Boolean deleteById(Long id); + + void deleteBatch(List itemIds, List ids, String type); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/TagRepository.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/TagRepository.java index 7445776d4..c306e0c91 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/TagRepository.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/TagRepository.java @@ -1,6 +1,8 @@ package com.tencent.supersonic.headless.server.persistence.repository; +import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq; +import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; import com.tencent.supersonic.headless.server.pojo.TagFilter; import java.util.List; @@ -14,7 +16,11 @@ public interface TagRepository { TagDO getTagById(Long id); - List query(TagFilter tagFilter); + List getTagDOList(TagFilter tagFilter); - Boolean batchUpdateStatus(List tagDOList); + List queryTagRespList(TagFilter tagFilter); + + Boolean delete(Long id); + + void deleteBatch(TagDeleteReq tagDeleteReq); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/TagRepositoryImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/TagRepositoryImpl.java index 3a9fa5011..71de1de05 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/TagRepositoryImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/persistence/repository/impl/TagRepositoryImpl.java @@ -1,5 +1,7 @@ package com.tencent.supersonic.headless.server.persistence.repository.impl; +import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq; +import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; import com.tencent.supersonic.headless.server.persistence.mapper.TagCustomMapper; import com.tencent.supersonic.headless.server.persistence.mapper.TagMapper; @@ -38,12 +40,22 @@ public class TagRepositoryImpl implements TagRepository { } @Override - public List query(TagFilter tagFilter) { - return tagCustomMapper.query(tagFilter); + public List getTagDOList(TagFilter tagFilter) { + return tagCustomMapper.getTagDOList(tagFilter); } @Override - public Boolean batchUpdateStatus(List tagDOList) { - return tagCustomMapper.batchUpdateStatus(tagDOList); + public List queryTagRespList(TagFilter tagFilter) { + return tagCustomMapper.queryTagRespList(tagFilter); + } + + @Override + public Boolean delete(Long id) { + return tagCustomMapper.deleteById(id); + } + + @Override + public void deleteBatch(TagDeleteReq tagDeleteReq) { + tagCustomMapper.deleteBatch(tagDeleteReq.getItemIds(), tagDeleteReq.getIds(), tagDeleteReq.getType().name()); } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilter.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilter.java index c03731ac6..eca312603 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilter.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilter.java @@ -1,17 +1,14 @@ package com.tencent.supersonic.headless.server.pojo; - -import java.util.List; - import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; import lombok.Data; +import java.util.List; + @Data public class TagFilter extends MetaFilter { - private String type; - private List statusList; + private List itemIds; private TagDefineType tagDefineType; - private List bizNames; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilterPage.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilterPage.java deleted file mode 100644 index 4ed30aad9..000000000 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/pojo/TagFilterPage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.headless.server.pojo; - - -import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; -import com.tencent.supersonic.headless.api.pojo.request.PageSchemaItemReq; - -import java.util.List; - -public class TagFilterPage extends PageSchemaItemReq { - private String type; - private List statusList; - private TagDefineType tagDefineType; -} \ No newline at end of file diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/TagController.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/TagController.java index a15f63977..ff7d16d51 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/TagController.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/rest/TagController.java @@ -4,12 +4,13 @@ import com.github.pagehelper.PageInfo; 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.ItemValueReq; -import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; -import com.tencent.supersonic.headless.api.pojo.request.TagBatchCreateReq; +import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq; +import com.tencent.supersonic.headless.api.pojo.request.TagFilterPageReq; import com.tencent.supersonic.headless.api.pojo.request.TagReq; import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp; import com.tencent.supersonic.headless.api.pojo.response.TagResp; -import com.tencent.supersonic.headless.server.pojo.TagFilterPage; +import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; +import com.tencent.supersonic.headless.server.pojo.TagFilter; import com.tencent.supersonic.headless.server.service.TagMetaService; import javax.servlet.http.HttpServletRequest; @@ -24,12 +25,15 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/api/semantic/tag") public class TagController { private final TagMetaService tagMetaService; private final TagQueryService tagQueryService; + public TagController(TagMetaService tagMetaService, TagQueryService tagQueryService) { this.tagMetaService = tagMetaService; @@ -38,6 +42,7 @@ public class TagController { /** * 新建标签 + * * @param tagReq * @param request * @param response @@ -46,61 +51,49 @@ public class TagController { */ @PostMapping("/create") public TagResp create(@RequestBody TagReq tagReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); return tagMetaService.create(tagReq, user); } /** * 从现有维度/指标批量新建标签 - * @param tagBatchReq + * + * @param tagReqList * @param request * @param response * @return * @throws Exception */ @PostMapping("/create/batch") - public Integer createBatch(@RequestBody TagBatchCreateReq tagBatchReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + public Integer createBatch(@RequestBody List tagReqList, + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); - return tagMetaService.createBatch(tagBatchReq, user); + return tagMetaService.createBatch(tagReqList, user); } /** - * 编辑标签信息 - * @param tagReq + * 批量删除标签 + * + * @param tagDeleteReq * @param request * @param response * @return * @throws Exception */ - @PostMapping("/update") - public TagResp update(@RequestBody TagReq tagReq, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + @PostMapping("/delete/batch") + public Boolean deleteBatch(@RequestBody TagDeleteReq tagDeleteReq, + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); - return tagMetaService.update(tagReq, user); - } - - /** - * 批量更新标签状态 - * @param metaBatchReq - * @param request - * @param response - * @return - */ - @PostMapping("/batchUpdateStatus") - public Boolean batchUpdateStatus(@RequestBody MetaBatchReq metaBatchReq, - HttpServletRequest request, - HttpServletResponse response) { - User user = UserHolder.findUser(request, response); - return tagMetaService.batchUpdateStatus(metaBatchReq, user); + return tagMetaService.deleteBatch(tagDeleteReq, user); } /** * 标签删除 + * * @param id * @param request * @param response @@ -109,8 +102,8 @@ public class TagController { */ @DeleteMapping("delete/{id}") public Boolean delete(@PathVariable("id") Long id, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); tagMetaService.delete(id, user); return true; @@ -118,6 +111,7 @@ public class TagController { /** * 标签详情获取 + * * @param id * @param request * @param response @@ -125,31 +119,33 @@ public class TagController { */ @GetMapping("getTag/{id}") public TagResp getTag(@PathVariable("id") Long id, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { User user = UserHolder.findUser(request, response); return tagMetaService.getTag(id, user); } /** - * 标签市场-分页查询 - * @param tagFilterPage + * 标签查询 + * + * @param tagFilter * @param request * @param response * @return * @throws Exception */ @PostMapping("/queryTag") - public PageInfo queryPage(@RequestBody TagFilterPage tagFilterPage, - HttpServletRequest request, - HttpServletResponse response) throws Exception { + public List queryPage(@RequestBody TagFilter tagFilter, + HttpServletRequest request, + HttpServletResponse response) throws Exception { User user = UserHolder.findUser(request, response); - return tagMetaService.queryPage(tagFilterPage, user); + return tagMetaService.getTagDOList(tagFilter, user); } /** * 获取标签值分布信息 + * * @param itemValueReq * @param request * @param response @@ -164,4 +160,21 @@ public class TagController { return tagQueryService.queryTagValue(itemValueReq, user); } + /** + * 标签市场-分页查询 + * + * @param tagMarketPageReq + * @param request + * @param response + * @return + * @throws Exception + */ + @PostMapping("/queryTag/market") + public PageInfo queryTagMarketPage(@RequestBody TagFilterPageReq tagMarketPageReq, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + User user = UserHolder.findUser(request, response); + return tagMetaService.queryTagMarketPage(tagMarketPageReq, user); + } + } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/TagMetaService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/TagMetaService.java index 98add95d5..12abe9701 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/TagMetaService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/TagMetaService.java @@ -2,29 +2,30 @@ package com.tencent.supersonic.headless.server.service; import com.github.pagehelper.PageInfo; import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; -import com.tencent.supersonic.headless.api.pojo.request.TagBatchCreateReq; +import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq; +import com.tencent.supersonic.headless.api.pojo.request.TagFilterPageReq; import com.tencent.supersonic.headless.api.pojo.request.TagReq; import com.tencent.supersonic.headless.api.pojo.response.TagResp; +import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; import com.tencent.supersonic.headless.server.pojo.TagFilter; -import com.tencent.supersonic.headless.server.pojo.TagFilterPage; + import java.util.List; public interface TagMetaService { TagResp create(TagReq tagReq, User user); - TagResp update(TagReq tagReq, User user); + Integer createBatch(List tagReqList, User user); - void delete(Long id, User user); + Boolean delete(Long id, User user); + + Boolean deleteBatch(TagDeleteReq tagDeleteReq, User user); TagResp getTag(Long id, User user); List getTags(TagFilter tagFilter); - PageInfo queryPage(TagFilterPage tagFilterPage, User user); + List getTagDOList(TagFilter tagFilter, User user); - Boolean batchUpdateStatus(MetaBatchReq metaBatchReq, User user); - - Integer createBatch(TagBatchCreateReq tagBatchReq, User user); + PageInfo queryTagMarketPage(TagFilterPageReq tagMarketPageReq, User user); } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagMetaServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagMetaServiceImpl.java index f6870b51a..40849369b 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagMetaServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagMetaServiceImpl.java @@ -1,40 +1,34 @@ package com.tencent.supersonic.headless.server.service.impl; -import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.pojo.User; -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.enums.AuthType; -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.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.TagDefineParams; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; -import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; import com.tencent.supersonic.headless.api.pojo.request.TagBatchCreateReq; +import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq; +import com.tencent.supersonic.headless.api.pojo.request.TagFilterPageReq; import com.tencent.supersonic.headless.api.pojo.request.TagReq; import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; +import com.tencent.supersonic.headless.api.pojo.response.DomainResp; 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.TagObjectResp; import com.tencent.supersonic.headless.api.pojo.response.TagResp; import com.tencent.supersonic.headless.server.persistence.dataobject.CollectDO; import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO; import com.tencent.supersonic.headless.server.persistence.repository.TagRepository; -import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.pojo.TagFilter; -import com.tencent.supersonic.headless.server.pojo.TagFilterPage; +import com.tencent.supersonic.headless.server.pojo.TagObjectFilter; import com.tencent.supersonic.headless.server.service.CollectService; 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.ModelService; import com.tencent.supersonic.headless.server.service.TagMetaService; -import com.tencent.supersonic.headless.server.utils.NameCheckUtils; +import com.tencent.supersonic.headless.server.service.TagObjectService; import java.util.ArrayList; import java.util.Arrays; @@ -47,10 +41,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.util.Strings; import org.springframework.beans.BeanUtils; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -61,189 +52,186 @@ public class TagMetaServiceImpl implements TagMetaService { private final TagRepository tagRepository; private final ModelService modelService; private final CollectService collectService; - private ApplicationEventPublisher eventPublisher; private final DimensionService dimensionService; private final MetricService metricService; + private final TagObjectService tagObjectService; + private final DomainService domainService; public TagMetaServiceImpl(TagRepository tagRepository, ModelService modelService, - CollectService collectService, ApplicationEventPublisher eventPublisher, - @Lazy DimensionService dimensionService, @Lazy MetricService metricService) { + CollectService collectService, @Lazy DimensionService dimensionService, + @Lazy MetricService metricService, TagObjectService tagObjectService, + DomainService domainService) { this.tagRepository = tagRepository; this.modelService = modelService; this.collectService = collectService; - this.eventPublisher = eventPublisher; this.dimensionService = dimensionService; this.metricService = metricService; + this.tagObjectService = tagObjectService; + this.domainService = domainService; } @Override public TagResp create(TagReq tagReq, User user) { - checkParam(tagReq); checkExit(tagReq); TagDO tagDO = convert(tagReq); Date date = new Date(); + tagDO.setId(null); tagDO.setCreatedBy(user.getName()); tagDO.setCreatedAt(date); tagDO.setUpdatedBy(user.getName()); tagDO.setUpdatedAt(date); - if (Objects.nonNull(tagReq.getStatus())) { - tagDO.setStatus(tagReq.getStatus()); - } else { - tagDO.setStatus(StatusEnum.ONLINE.getCode()); - } tagRepository.create(tagDO); - sendEventBatch(Lists.newArrayList(tagDO), EventType.ADD); - return convert(tagDO); - } - - private void sendEventBatch(List tagDOS, EventType eventType) { - List dataItems = tagDOS.stream().map(this::getDataItem) - .collect(Collectors.toList()); - eventPublisher.publishEvent(new DataEvent(this, dataItems, eventType)); - } - - private void sendEvent(DataItem dataItem, EventType eventType) { - eventPublisher.publishEvent(new DataEvent(this, - Lists.newArrayList(dataItem), eventType)); - } - - private DataItem getDataItem(TagDO tagDO) { - return DataItem.builder().id(tagDO.getId() + Constants.UNDERLINE).name(tagDO.getName()) - .bizName(tagDO.getBizName()).modelId(tagDO.getModelId() + Constants.UNDERLINE) - .type(TypeEnums.TAG).build(); + return convert2Resp(tagDO); } @Override - public TagResp update(TagReq tagReq, User user) { - if (Objects.isNull(tagReq.getId()) || tagReq.getId() <= 0) { - throw new RuntimeException("id is empty"); - } - TagDO tagDO = tagRepository.getTagById(tagReq.getId()); - String oldName = tagDO.getName(); - tagDO = fillUpdateInfo(tagReq, tagDO); - tagDO.setUpdatedBy(user.getName()); - tagDO.setUpdatedAt(new Date()); - tagRepository.update(tagDO); - if (!oldName.equals(tagReq.getName())) { - DataItem dataItem = getDataItem(tagDO); - dataItem.setName(oldName); - dataItem.setNewName(tagReq.getName()); - sendEvent(getDataItem(tagDO), EventType.UPDATE); - } - return convert(tagDO); + public Integer createBatch(List tagReqList, User user) { + tagReqList.stream().forEach(tagReq -> { + create(tagReq, user); + }); + return tagReqList.size(); } @Override - public void delete(Long id, User user) { - TagDO tagDO = tagRepository.getTagById(id); - if (Objects.isNull(tagDO)) { - throw new RuntimeException("tag not found"); - } - tagDO.setStatus(StatusEnum.DELETED.getCode()); - tagDO.setUpdatedBy(user.getName()); - tagDO.setUpdatedAt(new Date()); - tagRepository.update(tagDO); - sendEventBatch(Lists.newArrayList(tagDO), EventType.DELETE); + public Boolean delete(Long id, User user) { + tagRepository.delete(id); + return true; + } + + @Override + public Boolean deleteBatch(TagDeleteReq tagDeleteReq, User user) { + tagRepository.deleteBatch(tagDeleteReq); + return true; } @Override public TagResp getTag(Long id, User user) { TagDO tagDO = tagRepository.getTagById(id); - TagResp tagResp = fillCollectAndAdminInfo(tagDO, user); - tagResp = fillModelInfo(tagResp); + TagResp tagResp = convert2Resp(tagDO); + tagResp = fillTagObjectInfo(tagResp, user); + tagResp = fillCollectAndAdminInfo(tagResp, user); return tagResp; } @Override public List getTags(TagFilter tagFilter) { - List tagDOS = tagRepository.query(tagFilter); - if (!CollectionUtils.isEmpty(tagDOS)) { - return tagDOS.stream().map(tagDO -> convert(tagDO)).collect(Collectors.toList()); - } - return new ArrayList<>(); + List tagRespList = tagRepository.queryTagRespList(tagFilter); + return tagRespList; } @Override - public PageInfo queryPage(TagFilterPage tagFilterPage, User user) { - TagFilter tagFilter = new TagFilter(); - BeanUtils.copyProperties(tagFilterPage, tagFilter); - List modelRespList = modelService.getAllModelByDomainIds(tagFilterPage.getDomainIds()); - List modelIds = modelRespList.stream().map(ModelResp::getId).collect(Collectors.toList()); - tagFilterPage.getModelIds().addAll(modelIds); - tagFilter.setModelIds(tagFilterPage.getModelIds()); + public List getTagDOList(TagFilter tagFilter, User user) { + return tagRepository.getTagDOList(tagFilter); + } - List collectList = collectService.getCollectList(user.getName()) - .stream().filter(collectDO -> TypeEnums.TAG.name().equalsIgnoreCase(collectDO.getType())) - .collect(Collectors.toList()); - List collectIds = collectList.stream().map(CollectDO::getCollectId).collect(Collectors.toList()); - if (tagFilterPage.isHasCollect()) { - if (CollectionUtils.isEmpty(collectIds)) { - tagFilter.setIds(Lists.newArrayList(-1L)); - } else { - tagFilter.setIds(collectIds); + /** + * 分页查询标签列表信息 + * + * @param tagMarketPageReq + * @param user + * @return + */ + @Override + public PageInfo queryTagMarketPage(TagFilterPageReq tagMarketPageReq, User user) { + List modelRespList = getRelatedModel(tagMarketPageReq); + List modelIds = modelRespList.stream().map(model -> model.getId()).collect(Collectors.toList()); + TagFilter tagFilter = new TagFilter(); + BeanUtils.copyProperties(tagMarketPageReq, tagFilter); + tagFilter.setModelIds(modelIds); + PageInfo tagDOPageInfo = PageHelper.startPage(tagMarketPageReq.getCurrent(), + tagMarketPageReq.getPageSize()) + .doSelectPageInfo(() -> getTags(tagFilter)); + + List tagRespList = tagDOPageInfo.getList(); + fillModelInfo(tagRespList); + fillDomainInfo(tagRespList); + fillTagObjectInfo(tagRespList, user); + return tagDOPageInfo; + } + + private void fillTagObjectInfo(List tagRespList, User user) { + TagObjectFilter filter = new TagObjectFilter(); + List tagObjects = tagObjectService.getTagObjects(filter, user); + if (CollectionUtils.isEmpty(tagObjects)) { + return; + } + Map tagObjectMap = tagObjects.stream() + .collect(Collectors.toMap(TagObjectResp::getId, tagObject -> tagObject, (v1, v2) -> v2)); + if (CollectionUtils.isNotEmpty(tagRespList)) { + tagRespList.stream().forEach(tagResp -> { + if (tagObjectMap.containsKey(tagResp.getTagObjectId())) { + tagResp.setTagObjectName(tagObjectMap.get(tagResp.getTagObjectId()).getName()); + } + }); + } + } + + private TagResp fillTagObjectInfo(TagResp tagResp, User user) { + Long modelId = tagResp.getModelId(); + ModelResp model = modelService.getModel(modelId); + TagObjectResp tagObject = tagObjectService.getTagObject(model.getTagObjectId(), user); + tagResp.setTagObjectId(tagObject.getId()); + tagResp.setTagObjectName(tagObject.getName()); + return tagResp; + } + + private void fillDomainInfo(List tagRespList) { + Map domainMap = domainService.getDomainList().stream() + .collect(Collectors.toMap(DomainResp::getId, domain -> domain, (v1, v2) -> v2)); + if (CollectionUtils.isNotEmpty(tagRespList) && Objects.nonNull(domainMap)) { + tagRespList.stream().forEach(tagResp -> { + if (domainMap.containsKey(tagResp.getDomainId())) { + tagResp.setDomainName(domainMap.get(tagResp.getDomainId()).getName()); + } + }); + } + } + + private TagResp convert2Resp(TagDO tagDO) { + TagResp tagResp = new TagResp(); + BeanUtils.copyProperties(tagDO, tagResp); + if (TagDefineType.METRIC.name().equalsIgnoreCase(tagDO.getType())) { + MetricResp metric = metricService.getMetric(tagDO.getItemId()); + tagResp.setBizName(metric.getBizName()); + tagResp.setName(metric.getName()); + tagResp.setModelId(metric.getModelId()); + tagResp.setModelName(metric.getModelName()); + tagResp.setDomainId(metric.getDomainId()); + } + if (TagDefineType.DIMENSION.name().equalsIgnoreCase(tagDO.getType())) { + DimensionResp dimensionResp = dimensionService.getDimension(tagDO.getItemId()); + tagResp.setBizName(dimensionResp.getBizName()); + tagResp.setName(dimensionResp.getName()); + tagResp.setModelId(dimensionResp.getModelId()); + tagResp.setModelName(dimensionResp.getModelName()); + } + + return tagResp; + } + + private List getRelatedModel(TagFilterPageReq tagMarketPageReq) { + List modelRespList = new ArrayList<>(); + Map modelMap = modelService.getModelMap(); + for (Long modelId : modelMap.keySet()) { + ModelResp modelResp = modelMap.get(modelId); + if (Objects.isNull(modelResp)) { + continue; + } + if (tagMarketPageReq.getTagObjectId().equals(modelResp.getTagObjectId())) { + if (CollectionUtils.isNotEmpty(tagMarketPageReq.getDomainIds())) { + if (!tagMarketPageReq.getDomainIds().contains(modelResp.getDomainId())) { + continue; + } + } + if (CollectionUtils.isNotEmpty(tagMarketPageReq.getModelIds())) { + if (!tagMarketPageReq.getModelIds().contains(modelResp.getId())) { + continue; + } + } + modelRespList.add(modelResp); } } - - PageInfo tagDOPageInfo = PageHelper.startPage(tagFilterPage.getCurrent(), - tagFilterPage.getPageSize()) - .doSelectPageInfo(() -> getTags(tagFilter)); - PageInfo pageInfo = new PageInfo<>(); - BeanUtils.copyProperties(tagDOPageInfo, pageInfo); - List tagRespList = convertList(tagDOPageInfo.getList(), collectIds); - fillAdminRes(tagRespList, user); - fillModelInfo(tagRespList); - pageInfo.setList(tagRespList); - - return pageInfo; - } - - @Override - public Boolean batchUpdateStatus(MetaBatchReq metaBatchReq, User user) { - if (Objects.isNull(metaBatchReq)) { - return false; - } - TagFilter tagFilter = new TagFilter(); - BeanUtils.copyProperties(metaBatchReq, tagFilter); - tagFilter.setStatus(null); - List tagDOList = tagRepository.query(tagFilter); - log.info("tagFilter:{},{}", tagFilter.getModelIds(), tagFilter.getBizNames()); - if (CollectionUtils.isEmpty(tagDOList)) { - return true; - } - tagDOList.stream().forEach(tagDO -> { - tagDO.setStatus(metaBatchReq.getStatus()); - tagDO.setUpdatedAt(new Date()); - tagDO.setUpdatedBy(user.getName()); - }); - - tagRepository.batchUpdateStatus(tagDOList); - if (StatusEnum.OFFLINE.getCode().equals(metaBatchReq.getStatus()) - || StatusEnum.DELETED.getCode().equals(metaBatchReq.getStatus())) { - sendEventBatch(tagDOList, EventType.DELETE); - } else if (StatusEnum.ONLINE.getCode().equals(metaBatchReq.getStatus())) { - sendEventBatch(tagDOList, EventType.ADD); - } - return true; - } - - @Override - public Integer createBatch(TagBatchCreateReq tagLoadReq, User user) { - Long modelId = tagLoadReq.getModelId(); - int num = 0; - MetaFilter metaFilter = new MetaFilter(); - List modelIds = new ArrayList<>(); - modelIds.add(modelId); - metaFilter.setModelIds(modelIds); - if (Objects.isNull(tagLoadReq.getType()) || SchemaElementType.DIMENSION.equals(tagLoadReq.getType())) { - List dimensions = dimensionService.getDimensions(metaFilter); - num += loadDimTagBatch(tagLoadReq, dimensions, user); - } - if (Objects.isNull(tagLoadReq.getType()) || SchemaElementType.METRIC.equals(tagLoadReq.getType())) { - List metrics = metricService.getMetrics(metaFilter); - num += loadMetricTagBatch(tagLoadReq, metrics, user); - } - log.info("loadTagBatch finished ,tag num:{}", num); - return num; + return modelRespList; } private int loadMetricTagBatch(TagBatchCreateReq tagLoadReq, List metrics, User user) { @@ -255,12 +243,10 @@ public class TagMetaServiceImpl implements TagMetaService { TagReq tagReq = new TagReq(); BeanUtils.copyProperties(metric, tagReq); tagReq.setId(null); - tagReq.setBizName(metric.getBizName()); tagReq.setTagDefineType(TagDefineType.METRIC); TagDefineParams tagDefineParams = new TagDefineParams(); tagDefineParams.setExpr(metric.getBizName()); tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(metric.getId()))); - tagReq.setTagDefineParams(tagDefineParams); try { create(tagReq, user); } catch (Exception e) { @@ -279,12 +265,10 @@ public class TagMetaServiceImpl implements TagMetaService { TagReq tagReq = new TagReq(); BeanUtils.copyProperties(dim, tagReq); tagReq.setId(null); - tagReq.setBizName(dim.getBizName()); tagReq.setTagDefineType(TagDefineType.DIMENSION); TagDefineParams tagDefineParams = new TagDefineParams(); tagDefineParams.setExpr(dim.getBizName()); tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(dim.getId()))); - tagReq.setTagDefineParams(tagDefineParams); try { create(tagReq, user); } catch (Exception e) { @@ -295,35 +279,6 @@ public class TagMetaServiceImpl implements TagMetaService { return dimensions.size(); } - private TagDO fillUpdateInfo(TagReq tagReq, TagDO tagDO) { - if (Objects.nonNull(tagDO) && tagDO.getId() > 0) { - if (Objects.nonNull(tagReq.getExt()) && !tagReq.getExt().isEmpty()) { - tagDO.setExt(tagReq.getExtJson()); - } - } - if (Objects.nonNull(tagReq.getTagDefineType())) { - tagDO.setDefineType(tagReq.getTagDefineType().name()); - } - if (Objects.nonNull(tagReq.getTagDefineParams()) && !StringUtils.isBlank( - tagReq.getTagDefineParams().getExpr())) { - tagDO.setTypeParams(tagReq.getTypeParamsJson()); - } - if (Strings.isNotEmpty(tagReq.getDescription())) { - tagDO.setDescription(tagReq.getDescription()); - } - if (Objects.nonNull(tagReq.getSensitiveLevel())) { - tagDO.setSensitiveLevel(tagReq.getSensitiveLevel()); - } - if (Strings.isNotEmpty(tagReq.getName())) { - tagDO.setName(tagReq.getName()); - } - if (Objects.nonNull(tagReq.getStatus())) { - tagDO.setStatus(tagReq.getStatus()); - } - - return tagDO; - } - private TagResp fillModelInfo(TagResp tagResp) { ModelResp model = modelService.getModel(tagResp.getModelId()); tagResp.setModelName(model.getName()); @@ -337,16 +292,19 @@ public class TagMetaServiceImpl implements TagMetaService { if (Objects.nonNull(modelIdAndRespMap) && modelIdAndRespMap.containsKey(tagResp.getModelId())) { tagResp.setModelName(modelIdAndRespMap.get(tagResp.getModelId()).getName()); tagResp.setDomainId(modelIdAndRespMap.get(tagResp.getModelId()).getDomainId()); + tagResp.setTagObjectId(modelIdAndRespMap.get(tagResp.getModelId()).getTagObjectId()); } }); } - private TagResp fillCollectAndAdminInfo(TagDO tagDO, User user) { + private TagResp fillCollectAndAdminInfo(TagResp tagResp, User user) { List collectIds = collectService.getCollectList(user.getName()) .stream().filter(collectDO -> TypeEnums.TAG.name().equalsIgnoreCase(collectDO.getType())) .map(CollectDO::getCollectId).collect(Collectors.toList()); - - List tagRespList = convertList(new ArrayList<>(Arrays.asList(tagDO)), collectIds); + if (CollectionUtils.isNotEmpty(collectIds) && collectIds.contains(tagResp.getId())) { + tagResp.setIsCollect(true); + } + List tagRespList = Arrays.asList(tagResp); fillAdminRes(tagRespList, user); return tagRespList.get(0); } @@ -366,85 +324,23 @@ public class TagMetaServiceImpl implements TagMetaService { } } - private List convertList(List tagDOList, List collectIds) { - List tagRespList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(tagDOList)) { - tagDOList.stream().forEach(tagDO -> { - TagResp tagResp = convert(tagDO); - tagResp.setTypeEnum(TypeEnums.TAG); - if (CollectionUtils.isNotEmpty(collectIds) && collectIds.contains(tagDO.getId())) { - tagResp.setIsCollect(true); - } else { - tagResp.setIsCollect(false); - } - tagRespList.add(tagResp); - }); - } - return tagRespList; - } - private void checkExit(TagReq tagReq) { TagFilter tagFilter = new TagFilter(); - tagFilter.setModelIds(Arrays.asList(tagReq.getModelId())); - - List tagResps = getTags(tagFilter); - if (!CollectionUtils.isEmpty(tagResps)) { - Long bizNameSameCount = tagResps.stream().filter(tagResp -> !tagResp.getId().equals(tagReq.getId())) - .filter(tagResp -> tagResp.getBizName().equalsIgnoreCase(tagReq.getBizName())).count(); - if (bizNameSameCount > 0) { - throw new RuntimeException(String.format("the bizName %s is exit", tagReq.getBizName())); - } - Long nameSameCount = tagResps.stream().filter(tagResp -> !tagResp.getId().equals(tagReq.getId())) - .filter(tagResp -> tagResp.getName().equalsIgnoreCase(tagReq.getName())).count(); - if (nameSameCount > 0) { - throw new RuntimeException(String.format("the name %s is exit", tagReq.getName())); - } - } - } - - private void checkParam(TagReq tagReq) { - if (Objects.isNull(tagReq.getModelId()) || tagReq.getModelId() <= 0) { - throw new RuntimeException("the modelId is empty"); - } - if (Objects.isNull(tagReq.getBizName()) || tagReq.getBizName().isEmpty() || Objects.isNull(tagReq.getName()) - || tagReq.getName().isEmpty()) { - throw new RuntimeException("the bizName or name is empty"); - } - if (Objects.isNull(tagReq.getTagDefineType()) || Objects.isNull(tagReq.getTagDefineParams()) - || StringUtils.isBlank(tagReq.getTagDefineParams().getExpr())) { - throw new InvalidArgumentException("表达式不可为空"); + tagFilter.setTagDefineType(tagReq.getTagDefineType()); + if (Objects.nonNull(tagReq.getItemId())) { + tagFilter.setItemIds(Arrays.asList(tagReq.getItemId())); } - if (NameCheckUtils.containsSpecialCharacters(tagReq.getBizName())) { - throw new InvalidArgumentException("名称包含特殊字符, 请修改"); + List tagRespList = tagRepository.getTagDOList(tagFilter); + if (!CollectionUtils.isEmpty(tagRespList)) { + throw new RuntimeException(String.format("the tag is exit, itemId:{}", tagReq.getItemId())); } } - private TagResp convert(TagDO tagDO) { - TagResp tagResp = new TagResp(); - BeanUtils.copyProperties(tagDO, tagResp); - if (Objects.nonNull(tagDO.getExt()) && !tagDO.getExt().isEmpty()) { - Map ext = JSONObject.parseObject(tagDO.getExt(), - Map.class); - tagResp.setExt(ext); - } - tagResp.setTagDefineType(TagDefineType.valueOf(tagDO.getDefineType())); - if (Objects.nonNull(tagDO.getTypeParams()) && !tagDO.getTypeParams().isEmpty()) { - TagDefineParams tagDefineParams = JSONObject.parseObject(tagDO.getTypeParams(), - TagDefineParams.class); - tagResp.setTagDefineParams(tagDefineParams); - } - - return tagResp; - } - private TagDO convert(TagReq tagReq) { TagDO tagDO = new TagDO(); BeanUtils.copyProperties(tagReq, tagDO); - tagDO.setDefineType(tagReq.getTagDefineType().name()); - tagDO.setType(tagReq.getType().name()); - tagDO.setTypeParams(tagReq.getTypeParamsJson()); - tagDO.setExt(tagReq.getExtJson()); + tagDO.setType(tagReq.getTagDefineType().name()); return tagDO; } } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagObjectServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagObjectServiceImpl.java index 7aea6f72b..ad9076d22 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagObjectServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagObjectServiceImpl.java @@ -58,7 +58,7 @@ public class TagObjectServiceImpl implements TagObjectService { throw new Exception(String.format("the bizName %s is exit", tagObjectReq.getBizName())); } if (tagObject.getName().equalsIgnoreCase(tagObjectReq.getName())) { - throw new Exception(String.format("the bizName %s is exit", tagObjectReq.getName())); + throw new Exception(String.format("the name %s is exit", tagObjectReq.getName())); } } } diff --git a/headless/server/src/main/resources/mapper/custom/TagCustomMapper.xml b/headless/server/src/main/resources/mapper/custom/TagCustomMapper.xml index 28acf2387..3b2e1a026 100644 --- a/headless/server/src/main/resources/mapper/custom/TagCustomMapper.xml +++ b/headless/server/src/main/resources/mapper/custom/TagCustomMapper.xml @@ -2,129 +2,132 @@ - + - - - - - - + - - - + + + + + + + + + + + + + + - + + + + - - - - update s2_tag - set status = #{tag.status,jdbcType=INTEGER}, - updated_at = #{tag.updatedAt,jdbcType=TIMESTAMP}, - updated_by = #{tag.updatedBy,jdbcType=VARCHAR} - where id = #{tag.id,jdbcType=BIGINT} - - + diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java b/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java index b4f47ff96..04e7c74fa 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/ModelDemoDataLoader.java @@ -33,7 +33,6 @@ import com.tencent.supersonic.headless.api.pojo.MetricTypeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.ModelDetail; import com.tencent.supersonic.headless.api.pojo.QueryConfig; import com.tencent.supersonic.headless.api.pojo.RelateDimension; -import com.tencent.supersonic.headless.api.pojo.TagDefineParams; import com.tencent.supersonic.headless.api.pojo.TagTypeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.TimeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.enums.DataType; @@ -41,14 +40,12 @@ import com.tencent.supersonic.headless.api.pojo.enums.DimensionType; import com.tencent.supersonic.headless.api.pojo.enums.IdentifyType; import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType; import com.tencent.supersonic.headless.api.pojo.enums.SemanticType; -import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; import com.tencent.supersonic.headless.api.pojo.request.DataSetReq; import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq; import com.tencent.supersonic.headless.api.pojo.request.DimensionReq; import com.tencent.supersonic.headless.api.pojo.request.DomainReq; import com.tencent.supersonic.headless.api.pojo.request.MetricReq; import com.tencent.supersonic.headless.api.pojo.request.ModelReq; -import com.tencent.supersonic.headless.api.pojo.request.TagReq; import com.tencent.supersonic.headless.server.service.DataSetService; import com.tencent.supersonic.headless.server.service.DatabaseService; import com.tencent.supersonic.headless.server.service.DimensionService; @@ -405,60 +402,6 @@ public class ModelDemoDataLoader { metricService.updateMetric(metricReq, user); } - private void addTags() { - TagReq tagReq = new TagReq(); - tagReq.setModelId(4L); - tagReq.setName("活跃区域"); - tagReq.setBizName("act_area"); - tagReq.setStatus(StatusEnum.ONLINE.getCode()); - tagReq.setTypeEnum(TypeEnums.TAG); - tagReq.setTagDefineType(TagDefineType.DIMENSION); - TagDefineParams tagDefineParams = new TagDefineParams(); - tagDefineParams.setExpr("act_area"); - tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(4))); - tagReq.setTagDefineParams(tagDefineParams); - tagMetaService.create(tagReq, user); - - TagReq tagReq2 = new TagReq(); - tagReq2.setModelId(4L); - tagReq2.setName("风格"); - tagReq2.setBizName("genre"); - tagReq2.setStatus(StatusEnum.ONLINE.getCode()); - tagReq2.setTypeEnum(TypeEnums.TAG); - tagReq2.setTagDefineType(TagDefineType.DIMENSION); - TagDefineParams tagDefineParam2s = new TagDefineParams(); - tagDefineParam2s.setExpr("genre"); - tagDefineParam2s.setDependencies(new ArrayList<>(Arrays.asList(6))); - tagReq2.setTagDefineParams(tagDefineParam2s); - tagMetaService.create(tagReq2, user); - - TagReq tagReq3 = new TagReq(); - tagReq3.setModelId(4L); - tagReq3.setName("播放量"); - tagReq3.setBizName("js_play_cnt"); - tagReq3.setStatus(StatusEnum.ONLINE.getCode()); - tagReq3.setTypeEnum(TypeEnums.TAG); - tagReq3.setTagDefineType(TagDefineType.METRIC); - TagDefineParams tagDefineParam3s = new TagDefineParams(); - tagDefineParam3s.setExpr("js_play_cnt"); - tagDefineParam3s.setDependencies(new ArrayList<>(Arrays.asList(5))); - tagReq3.setTagDefineParams(tagDefineParam3s); - tagMetaService.create(tagReq3, user); - - TagReq tagReq4 = new TagReq(); - tagReq4.setModelId(4L); - tagReq4.setName("歌手名"); - tagReq4.setBizName("singer_name"); - tagReq4.setStatus(StatusEnum.ONLINE.getCode()); - tagReq4.setTypeEnum(TypeEnums.TAG); - tagReq4.setTagDefineType(TagDefineType.DIMENSION); - TagDefineParams tagDefineParam4s = new TagDefineParams(); - tagDefineParam4s.setExpr("singer_name"); - tagDefineParam4s.setDependencies(new ArrayList<>(Arrays.asList(7))); - tagReq4.setTagDefineParams(tagDefineParam4s); - tagMetaService.create(tagReq4, user); - } - public void addMetric_uv() throws Exception { MetricReq metricReq = new MetricReq(); metricReq.setModelId(2L); diff --git a/launchers/standalone/src/main/resources/config.update/sql-update.sql b/launchers/standalone/src/main/resources/config.update/sql-update.sql index 27c462b39..ec317b990 100644 --- a/launchers/standalone/src/main/resources/config.update/sql-update.sql +++ b/launchers/standalone/src/main/resources/config.update/sql-update.sql @@ -194,26 +194,6 @@ alter table s2_view_info rename to s2_canvas; alter table s2_query_stat_info add column `view_id` bigint(20) DEFAULT NULL after `model_id`; ---20240221 -CREATE TABLE s2_tag( - `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 , - `status` INT NOT NULL , - `sensitive_level` INT NOT NULL , - `type` varchar(50) NOT NULL , -- ATOMIC, DERIVED - `define_type` varchar(50) NOT NULL, -- FIELD, DIMENSION - `type_params` LONGVARCHAR DEFAULT NULL , - `created_at` TIMESTAMP NOT NULL , - `created_by` varchar(100) NOT NULL , - `updated_at` TIMESTAMP DEFAULT NULL , - `updated_by` varchar(100) DEFAULT NULL , - `ext` LONGVARCHAR DEFAULT NULL , - PRIMARY KEY (`id`) -)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --20240301 CREATE TABLE IF NOT EXISTS `s2_dictionary_conf` ( `id` INT NOT NULL AUTO_INCREMENT, @@ -270,4 +250,18 @@ CREATE TABLE IF NOT EXISTS `s2_tag_object` `ext` text DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB -DEFAULT CHARSET = utf8 COMMENT ='标签表对象'; \ No newline at end of file +DEFAULT CHARSET = utf8 COMMENT ='标签表对象'; + +alter table s2_model add column `tag_object_id` bigint(20) DEFAULT NULL after domain_id; + +CREATE TABLE IF NOT EXISTS s2_tag( + `id` INT NOT NULL AUTO_INCREMENT, + `item_id` INT NOT NULL , + `type` varchar(255) NOT NULL , + `created_at` TIMESTAMP NOT NULL , + `created_by` varchar(100) NOT NULL , + `updated_at` TIMESTAMP DEFAULT NULL , + `updated_by` varchar(100) DEFAULT NULL , + `ext` LONGVARCHAR DEFAULT NULL , + PRIMARY KEY (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index 939ca3c5a..e8f147b02 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -578,20 +578,12 @@ CREATE TABLE IF NOT EXISTS `s2_data_set` ( CREATE TABLE IF NOT EXISTS `s2_tag` ( `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 , - `status` INT NOT NULL , - `sensitive_level` INT NOT NULL , + `item_id` INT NOT NULL , `type` varchar(50) NOT NULL , -- ATOMIC, DERIVED - `define_type` varchar(50) NOT NULL, -- FIELD, DIMENSION - `type_params` LONGVARCHAR DEFAULT NULL , `created_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP DEFAULT NULL , `updated_by` varchar(100) DEFAULT NULL , - `ext` LONGVARCHAR DEFAULT NULL , PRIMARY KEY (`id`) ); COMMENT ON TABLE s2_tag IS 'tag information'; diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index 15010c04f..2fe5bcf24 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -498,26 +498,18 @@ CREATE TABLE s2_view `admin_org` varchar(3000) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -CREATE TABLE `s2_tag` +CREATE TABLE IF NOT EXISTS `s2_tag` ( `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 '英文名称', - `description` varchar(500) DEFAULT NULL COMMENT '描述', - `status` int(10) NOT NULL COMMENT '状态', - `sensitive_level` int(10) NOT NULL COMMENT '敏感级别', - `type` varchar(50) NOT NULL COMMENT '类型(DERIVED,ATOMIC)', - `define_type` varchar(50) DEFAULT NULL, -- FIELD, DIMENSION - `type_params` text NOT NULL COMMENT '类型参数', + `item_id` bigint(20) DEFAULT NULL, + `type` varchar(255) NOT NULL , `created_at` datetime NOT NULL COMMENT '创建时间', `created_by` varchar(100) NOT NULL COMMENT '创建人', `updated_at` datetime NULL COMMENT '更新时间', `updated_by` varchar(100) NULL COMMENT '更新人', `ext` text DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE = InnoDB - DEFAULT CHARSET = utf8 COMMENT ='标签表'; +) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='标签表'; CREATE TABLE IF NOT EXISTS `s2_tag_object` ( diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/headless/TagTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/headless/TagTest.java deleted file mode 100644 index 54926be70..000000000 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/headless/TagTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.tencent.supersonic.headless; - - -import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.pojo.enums.StatusEnum; -import com.tencent.supersonic.common.pojo.enums.TypeEnums; -import com.tencent.supersonic.headless.api.pojo.ItemValueConfig; -import com.tencent.supersonic.headless.api.pojo.TagDefineParams; -import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; -import com.tencent.supersonic.headless.api.pojo.request.DictItemReq; -import com.tencent.supersonic.headless.api.pojo.request.DictSingleTaskReq; -import com.tencent.supersonic.headless.api.pojo.request.ItemValueReq; -import com.tencent.supersonic.headless.api.pojo.request.TagReq; -import com.tencent.supersonic.headless.api.pojo.response.TagResp; -import com.tencent.supersonic.headless.server.pojo.TagFilter; -import com.tencent.supersonic.headless.server.service.DictConfService; -import com.tencent.supersonic.headless.server.service.DictTaskService; -import com.tencent.supersonic.headless.server.service.TagMetaService; -import com.tencent.supersonic.headless.server.service.TagQueryService; -import org.junit.Assert; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.Arrays; - -public class TagTest extends BaseTest { - - private final String bizName = "page"; - private final Long modelId = 3L; - private final Integer dimId = 3; - - @Autowired - private TagMetaService tagMetaService; - @Autowired - private TagQueryService tagQueryService; - @Autowired - private DictConfService dictConfService; - @Autowired - private DictTaskService dictTaskService; - - @Test - void testCreateTag() { - TagReq tagReq = newTagReq(); - tagMetaService.create(tagReq, User.getFakeUser()); - - TagResp tag = queryTagRespByBizName(bizName); - Assert.assertEquals(bizName, tag.getBizName()); - tagMetaService.delete(tag.getId(), User.getFakeUser()); - } - - @Test - void testUpdateTag() { - TagReq tagReq = newTagReq(); - TagResp tagResp = tagMetaService.create(tagReq, User.getFakeUser()); - Assert.assertEquals(bizName, tagReq.getBizName()); - tagReq.setId(tagResp.getId()); - tagReq.setName("新页面"); - tagMetaService.update(tagReq, User.getFakeUser()); - - TagResp tag = queryTagRespByBizName(bizName); - Assert.assertEquals("新页面", tag.getName()); - tagMetaService.delete(tag.getId(), User.getFakeUser()); - } - - private TagResp queryTagRespByBizName(String bizName) { - TagFilter tagFilter = new TagFilter(); - tagFilter.setBizName(bizName); - TagResp tagRespDb = tagMetaService.getTags(tagFilter).get(0); - return tagRespDb; - } - - private TagReq newTagReq() { - TagReq tagReq = new TagReq(); - tagReq.setModelId(modelId); - tagReq.setName("页面"); - tagReq.setBizName(bizName); - tagReq.setStatus(1); - tagReq.setTypeEnum(TypeEnums.TAG); - tagReq.setTagDefineType(TagDefineType.DIMENSION); - - TagDefineParams tagDefineParams = new TagDefineParams(); - tagDefineParams.setExpr(bizName); - tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(dimId))); - tagReq.setTagDefineParams(tagDefineParams); - return tagReq; - } - - @Test - void testQueryTag() { - TagReq tagReq = newTagReq(); - tagMetaService.create(tagReq, User.getFakeUser()); - TagResp tag = queryTagRespByBizName(bizName); - Assert.assertEquals(bizName, tag.getBizName()); - tagMetaService.delete(tag.getId(), User.getFakeUser()); - } - - @Test - void testTagValue() { - TagReq tagReq = newTagReq(); - tagMetaService.create(tagReq, User.getFakeUser()); - TagResp tag = queryTagRespByBizName(bizName); - ItemValueReq itemValueReq = new ItemValueReq(); - itemValueReq.setItemId(tag.getId()); - // ItemValueResp itemValueResp = tagQueryService.queryTagValue(itemValueReq, User.getFakeUser()); - tagMetaService.delete(tag.getId(), User.getFakeUser()); - } - - @Test - void testTagDict() { - User user = User.getFakeUser(); - TagReq tagReq = newTagReq(); - TagResp tagResp = tagMetaService.create(tagReq, user); - // add conf - DictItemReq itemValueReq = new DictItemReq(); - itemValueReq.setType(TypeEnums.TAG); - itemValueReq.setItemId(tagResp.getId()); - itemValueReq.setStatus(StatusEnum.ONLINE); - ItemValueConfig config = new ItemValueConfig(); - config.setMetricId(4L); - config.setWhiteList(Arrays.asList("p10", "p20")); - config.setBlackList(Arrays.asList("p1", "p2")); - itemValueReq.setConfig(config); - dictConfService.addDictConf(itemValueReq, user); - // run Task - DictSingleTaskReq taskReq = DictSingleTaskReq.builder().type(TypeEnums.TAG).itemId(tagResp.getId()).build(); - dictTaskService.addDictTask(taskReq, user); - - tagMetaService.delete(tagResp.getId(), user); - } - -} \ No newline at end of file diff --git a/launchers/standalone/src/test/resources/db/schema-h2.sql b/launchers/standalone/src/test/resources/db/schema-h2.sql index d406c2780..eaa956393 100644 --- a/launchers/standalone/src/test/resources/db/schema-h2.sql +++ b/launchers/standalone/src/test/resources/db/schema-h2.sql @@ -579,20 +579,12 @@ CREATE TABLE IF NOT EXISTS `s2_data_set` ( CREATE TABLE IF NOT EXISTS `s2_tag` ( `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 , - `status` INT NOT NULL , - `sensitive_level` INT NOT NULL , + `item_id` INT NOT NULL , `type` varchar(50) NOT NULL , -- ATOMIC, DERIVED - `define_type` varchar(50) NOT NULL, -- FIELD, DIMENSION - `type_params` LONGVARCHAR DEFAULT NULL , `created_at` TIMESTAMP NOT NULL , `created_by` varchar(100) NOT NULL , `updated_at` TIMESTAMP DEFAULT NULL , `updated_by` varchar(100) DEFAULT NULL , - `ext` LONGVARCHAR DEFAULT NULL , PRIMARY KEY (`id`) ); COMMENT ON TABLE s2_tag IS 'tag information';