(improvement)(headless) add tag logic (#831)

This commit is contained in:
daikon
2024-03-19 19:40:06 +08:00
committed by GitHub
parent af53812d08
commit bd95552854
23 changed files with 448 additions and 761 deletions

View File

@@ -10,7 +10,6 @@ import java.util.Date;
@ToString @ToString
public class RecordInfo { public class RecordInfo {
private String createdBy; private String createdBy;
private String updatedBy; private String updatedBy;

View File

@@ -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<Long> ids;
private List<Long> itemIds;
private TagDefineType type;
}

View File

@@ -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;
}

View File

@@ -1,33 +1,20 @@
package com.tencent.supersonic.headless.api.pojo.request; package com.tencent.supersonic.headless.api.pojo.request;
import com.alibaba.fastjson.JSONObject; import com.tencent.supersonic.common.pojo.RecordInfo;
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 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 lombok.Data;
import javax.validation.constraints.NotNull;
@Data @Data
public class TagReq extends SchemaItem { public class TagReq extends RecordInfo {
private Long modelId; private Long id;
private Map<String, Object> ext = new HashMap<>();
@NotNull
private TagDefineType tagDefineType; private TagDefineType tagDefineType;
private TagDefineParams tagDefineParams;
public String getTypeParamsJson() { @NotNull
return JSONObject.toJSONString(tagDefineParams); private Long itemId;
}
public String getExtJson() {
return Objects.nonNull(ext) && ext.size() > 0 ? JSONObject.toJSONString(ext) : "";
}
public TagType getType() {
return TagType.getType(tagDefineType);
}
} }

View File

@@ -1,16 +1,13 @@
package com.tencent.supersonic.headless.api.pojo.response; 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.Data;
import lombok.ToString; import lombok.ToString;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
public class TagResp extends SchemaItem { public class TagResp {
private Long id;
private Long domainId; private Long domainId;
@@ -20,20 +17,22 @@ public class TagResp extends SchemaItem {
private String modelName; private String modelName;
private String type; private Long tagObjectId;
private String tagObjectName;
private Boolean isCollect; private Boolean isCollect;
private boolean hasAdminRes; private boolean hasAdminRes;
private Map<String, Object> ext = new HashMap<>(); private String tagDefineType;
private TagDefineType tagDefineType = TagDefineType.FIELD; private Long itemId;
private TagDefineParams tagDefineParams; private String name;
public String getExpr() { private String bizName;
return tagDefineParams.getExpr();
} private String description;
} }

View File

@@ -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.pojo.yaml.MetricYamlTpl;
import com.tencent.supersonic.headless.server.service.Catalog; import com.tencent.supersonic.headless.server.service.Catalog;
import com.tencent.supersonic.headless.server.utils.DatabaseConverter; import com.tencent.supersonic.headless.server.utils.DatabaseConverter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@@ -41,6 +42,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.lang3.tuple.Triple;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -123,12 +125,14 @@ public class SemanticSchemaManager {
private void addTagModel(TagResp tagResp, List<Dimension> modelDimensions, List<Metric> modelMetrics) private void addTagModel(TagResp tagResp, List<Dimension> modelDimensions, List<Metric> modelMetrics)
throws Exception { throws Exception {
switch (tagResp.getTagDefineType()) { TagDefineType tagDefineType = TagDefineType.valueOf(tagResp.getTagDefineType());
switch (tagDefineType) {
case FIELD: case FIELD:
case DIMENSION: case DIMENSION:
if (TagDefineType.DIMENSION.equals(tagResp.getTagDefineType())) { if (TagDefineType.DIMENSION.equals(tagResp.getTagDefineType())) {
Optional<Dimension> modelDimension = modelDimensions.stream() Optional<Dimension> modelDimension = modelDimensions.stream()
.filter(d -> d.getBizName().equals(tagResp.getExpr())).findFirst(); // .filter(d -> d.getBizName().equals(tagResp.getExpr()))
.findFirst();
if (modelDimension.isPresent()) { if (modelDimension.isPresent()) {
modelDimension.get().setName(tagResp.getBizName()); modelDimension.get().setName(tagResp.getBizName());
return; return;
@@ -136,7 +140,7 @@ public class SemanticSchemaManager {
} }
Dimension dimension = Dimension.builder().build(); Dimension dimension = Dimension.builder().build();
dimension.setType(""); dimension.setType("");
dimension.setExpr(tagResp.getExpr()); // dimension.setExpr(tagResp.getExpr());
dimension.setName(tagResp.getBizName()); dimension.setName(tagResp.getBizName());
dimension.setOwners(""); dimension.setOwners("");
dimension.setBizName(tagResp.getBizName()); dimension.setBizName(tagResp.getBizName());
@@ -150,12 +154,12 @@ public class SemanticSchemaManager {
return; return;
case METRIC: case METRIC:
Optional<Metric> modelMetric = modelMetrics.stream() Optional<Metric> modelMetric = modelMetrics.stream()
.filter(m -> m.getName().equalsIgnoreCase(tagResp.getExpr())).findFirst(); // .filter(m -> m.getName().equalsIgnoreCase(tagResp.getExpr()))
.findFirst();
if (modelMetric.isPresent()) { if (modelMetric.isPresent()) {
modelMetric.get().setName(tagResp.getBizName()); modelMetric.get().setName(tagResp.getBizName());
} else { } else {
throw new Exception(String.format("tag [{}] cant find the metric [{}]", tagResp.getBizName(), throw new Exception(String.format("tag [{}] cant find the metric", tagResp.getBizName()));
tagResp.getExpr()));
} }
return; return;
default: default:

View File

@@ -14,37 +14,12 @@ public class TagDO {
private Long id; 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; private String type;
@@ -68,12 +43,4 @@ public class TagDO {
*/ */
private String updatedBy; private String updatedBy;
/**
* 类型参数
*/
private String defineType;
private String typeParams;
private String ext;
} }

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.headless.server.persistence.mapper; 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.persistence.dataobject.TagDO;
import com.tencent.supersonic.headless.server.pojo.TagFilter; import com.tencent.supersonic.headless.server.pojo.TagFilter;
import java.util.List; import java.util.List;
@@ -7,7 +8,12 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface TagCustomMapper { public interface TagCustomMapper {
List<TagDO> query(TagFilter tagFilter);
Boolean batchUpdateStatus(List<TagDO> tagDOList); List<TagResp> queryTagRespList(TagFilter tagFilter);
List<TagDO> getTagDOList(TagFilter tagFilter);
Boolean deleteById(Long id);
void deleteBatch(List<Long> itemIds, List<Long> ids, String type);
} }

View File

@@ -1,6 +1,8 @@
package com.tencent.supersonic.headless.server.persistence.repository; 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.persistence.dataobject.TagDO;
import com.tencent.supersonic.headless.server.pojo.TagFilter; import com.tencent.supersonic.headless.server.pojo.TagFilter;
import java.util.List; import java.util.List;
@@ -14,7 +16,11 @@ public interface TagRepository {
TagDO getTagById(Long id); TagDO getTagById(Long id);
List<TagDO> query(TagFilter tagFilter); List<TagDO> getTagDOList(TagFilter tagFilter);
Boolean batchUpdateStatus(List<TagDO> tagDOList); List<TagResp> queryTagRespList(TagFilter tagFilter);
Boolean delete(Long id);
void deleteBatch(TagDeleteReq tagDeleteReq);
} }

View File

@@ -1,5 +1,7 @@
package com.tencent.supersonic.headless.server.persistence.repository.impl; 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.dataobject.TagDO;
import com.tencent.supersonic.headless.server.persistence.mapper.TagCustomMapper; import com.tencent.supersonic.headless.server.persistence.mapper.TagCustomMapper;
import com.tencent.supersonic.headless.server.persistence.mapper.TagMapper; import com.tencent.supersonic.headless.server.persistence.mapper.TagMapper;
@@ -38,12 +40,22 @@ public class TagRepositoryImpl implements TagRepository {
} }
@Override @Override
public List<TagDO> query(TagFilter tagFilter) { public List<TagDO> getTagDOList(TagFilter tagFilter) {
return tagCustomMapper.query(tagFilter); return tagCustomMapper.getTagDOList(tagFilter);
} }
@Override @Override
public Boolean batchUpdateStatus(List<TagDO> tagDOList) { public List<TagResp> queryTagRespList(TagFilter tagFilter) {
return tagCustomMapper.batchUpdateStatus(tagDOList); 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());
} }
} }

View File

@@ -1,17 +1,14 @@
package com.tencent.supersonic.headless.server.pojo; package com.tencent.supersonic.headless.server.pojo;
import java.util.List;
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class TagFilter extends MetaFilter { public class TagFilter extends MetaFilter {
private String type; private List<Long> itemIds;
private List<Integer> statusList;
private TagDefineType tagDefineType; private TagDefineType tagDefineType;
private List<String> bizNames;
} }

View File

@@ -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<Integer> statusList;
private TagDefineType tagDefineType;
}

View File

@@ -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.pojo.User;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder; 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.ItemValueReq;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; import com.tencent.supersonic.headless.api.pojo.request.TagDeleteReq;
import com.tencent.supersonic.headless.api.pojo.request.TagBatchCreateReq; 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.request.TagReq;
import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp; import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp;
import com.tencent.supersonic.headless.api.pojo.response.TagResp; 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 com.tencent.supersonic.headless.server.service.TagMetaService;
import javax.servlet.http.HttpServletRequest; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RestController
@RequestMapping("/api/semantic/tag") @RequestMapping("/api/semantic/tag")
public class TagController { public class TagController {
private final TagMetaService tagMetaService; private final TagMetaService tagMetaService;
private final TagQueryService tagQueryService; private final TagQueryService tagQueryService;
public TagController(TagMetaService tagMetaService, public TagController(TagMetaService tagMetaService,
TagQueryService tagQueryService) { TagQueryService tagQueryService) {
this.tagMetaService = tagMetaService; this.tagMetaService = tagMetaService;
@@ -38,6 +42,7 @@ public class TagController {
/** /**
* 新建标签 * 新建标签
*
* @param tagReq * @param tagReq
* @param request * @param request
* @param response * @param response
@@ -46,61 +51,49 @@ public class TagController {
*/ */
@PostMapping("/create") @PostMapping("/create")
public TagResp create(@RequestBody TagReq tagReq, public TagResp create(@RequestBody TagReq tagReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return tagMetaService.create(tagReq, user); return tagMetaService.create(tagReq, user);
} }
/** /**
* 从现有维度/指标批量新建标签 * 从现有维度/指标批量新建标签
* @param tagBatchReq *
* @param tagReqList
* @param request * @param request
* @param response * @param response
* @return * @return
* @throws Exception * @throws Exception
*/ */
@PostMapping("/create/batch") @PostMapping("/create/batch")
public Integer createBatch(@RequestBody TagBatchCreateReq tagBatchReq, public Integer createBatch(@RequestBody List<TagReq> tagReqList,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return tagMetaService.createBatch(tagBatchReq, user); return tagMetaService.createBatch(tagReqList, user);
} }
/** /**
* 编辑标签信息 * 批量删除标签
* @param tagReq *
* @param tagDeleteReq
* @param request * @param request
* @param response * @param response
* @return * @return
* @throws Exception * @throws Exception
*/ */
@PostMapping("/update") @PostMapping("/delete/batch")
public TagResp update(@RequestBody TagReq tagReq, public Boolean deleteBatch(@RequestBody TagDeleteReq tagDeleteReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return tagMetaService.update(tagReq, user); return tagMetaService.deleteBatch(tagDeleteReq, 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);
} }
/** /**
* 标签删除 * 标签删除
*
* @param id * @param id
* @param request * @param request
* @param response * @param response
@@ -109,8 +102,8 @@ public class TagController {
*/ */
@DeleteMapping("delete/{id}") @DeleteMapping("delete/{id}")
public Boolean delete(@PathVariable("id") Long id, public Boolean delete(@PathVariable("id") Long id,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
tagMetaService.delete(id, user); tagMetaService.delete(id, user);
return true; return true;
@@ -118,6 +111,7 @@ public class TagController {
/** /**
* 标签详情获取 * 标签详情获取
*
* @param id * @param id
* @param request * @param request
* @param response * @param response
@@ -125,31 +119,33 @@ public class TagController {
*/ */
@GetMapping("getTag/{id}") @GetMapping("getTag/{id}")
public TagResp getTag(@PathVariable("id") Long id, public TagResp getTag(@PathVariable("id") Long id,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return tagMetaService.getTag(id, user); return tagMetaService.getTag(id, user);
} }
/** /**
* 标签市场-分页查询 * 标签查询
* @param tagFilterPage *
* @param tagFilter
* @param request * @param request
* @param response * @param response
* @return * @return
* @throws Exception * @throws Exception
*/ */
@PostMapping("/queryTag") @PostMapping("/queryTag")
public PageInfo<TagResp> queryPage(@RequestBody TagFilterPage tagFilterPage, public List<TagDO> queryPage(@RequestBody TagFilter tagFilter,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return tagMetaService.queryPage(tagFilterPage, user); return tagMetaService.getTagDOList(tagFilter, user);
} }
/** /**
* 获取标签值分布信息 * 获取标签值分布信息
*
* @param itemValueReq * @param itemValueReq
* @param request * @param request
* @param response * @param response
@@ -164,4 +160,21 @@ public class TagController {
return tagQueryService.queryTagValue(itemValueReq, user); return tagQueryService.queryTagValue(itemValueReq, user);
} }
/**
* 标签市场-分页查询
*
* @param tagMarketPageReq
* @param request
* @param response
* @return
* @throws Exception
*/
@PostMapping("/queryTag/market")
public PageInfo<TagResp> queryTagMarketPage(@RequestBody TagFilterPageReq tagMarketPageReq,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response);
return tagMetaService.queryTagMarketPage(tagMarketPageReq, user);
}
} }

View File

@@ -2,29 +2,30 @@ package com.tencent.supersonic.headless.server.service;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User; 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.TagDeleteReq;
import com.tencent.supersonic.headless.api.pojo.request.TagBatchCreateReq; 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.request.TagReq;
import com.tencent.supersonic.headless.api.pojo.response.TagResp; 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.TagFilter;
import com.tencent.supersonic.headless.server.pojo.TagFilterPage;
import java.util.List; import java.util.List;
public interface TagMetaService { public interface TagMetaService {
TagResp create(TagReq tagReq, User user); TagResp create(TagReq tagReq, User user);
TagResp update(TagReq tagReq, User user); Integer createBatch(List<TagReq> 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); TagResp getTag(Long id, User user);
List<TagResp> getTags(TagFilter tagFilter); List<TagResp> getTags(TagFilter tagFilter);
PageInfo<TagResp> queryPage(TagFilterPage tagFilterPage, User user); List<TagDO> getTagDOList(TagFilter tagFilter, User user);
Boolean batchUpdateStatus(MetaBatchReq metaBatchReq, User user); PageInfo<TagResp> queryTagMarketPage(TagFilterPageReq tagMarketPageReq, User user);
Integer createBatch(TagBatchCreateReq tagBatchReq, User user);
} }

View File

@@ -1,40 +1,34 @@
package com.tencent.supersonic.headless.server.service.impl; package com.tencent.supersonic.headless.server.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.pojo.User; 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.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.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.TagDefineParams;
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; 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.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.request.TagReq;
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp; 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.MetricResp;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp; 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.api.pojo.response.TagResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.CollectDO; 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.dataobject.TagDO;
import com.tencent.supersonic.headless.server.persistence.repository.TagRepository; 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.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.CollectService;
import com.tencent.supersonic.headless.server.service.DimensionService; 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.MetricService;
import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.service.TagMetaService; 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.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -47,10 +41,7 @@ import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; 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.beans.BeanUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -61,189 +52,186 @@ public class TagMetaServiceImpl implements TagMetaService {
private final TagRepository tagRepository; private final TagRepository tagRepository;
private final ModelService modelService; private final ModelService modelService;
private final CollectService collectService; private final CollectService collectService;
private ApplicationEventPublisher eventPublisher;
private final DimensionService dimensionService; private final DimensionService dimensionService;
private final MetricService metricService; private final MetricService metricService;
private final TagObjectService tagObjectService;
private final DomainService domainService;
public TagMetaServiceImpl(TagRepository tagRepository, ModelService modelService, public TagMetaServiceImpl(TagRepository tagRepository, ModelService modelService,
CollectService collectService, ApplicationEventPublisher eventPublisher, CollectService collectService, @Lazy DimensionService dimensionService,
@Lazy DimensionService dimensionService, @Lazy MetricService metricService) { @Lazy MetricService metricService, TagObjectService tagObjectService,
DomainService domainService) {
this.tagRepository = tagRepository; this.tagRepository = tagRepository;
this.modelService = modelService; this.modelService = modelService;
this.collectService = collectService; this.collectService = collectService;
this.eventPublisher = eventPublisher;
this.dimensionService = dimensionService; this.dimensionService = dimensionService;
this.metricService = metricService; this.metricService = metricService;
this.tagObjectService = tagObjectService;
this.domainService = domainService;
} }
@Override @Override
public TagResp create(TagReq tagReq, User user) { public TagResp create(TagReq tagReq, User user) {
checkParam(tagReq);
checkExit(tagReq); checkExit(tagReq);
TagDO tagDO = convert(tagReq); TagDO tagDO = convert(tagReq);
Date date = new Date(); Date date = new Date();
tagDO.setId(null);
tagDO.setCreatedBy(user.getName()); tagDO.setCreatedBy(user.getName());
tagDO.setCreatedAt(date); tagDO.setCreatedAt(date);
tagDO.setUpdatedBy(user.getName()); tagDO.setUpdatedBy(user.getName());
tagDO.setUpdatedAt(date); tagDO.setUpdatedAt(date);
if (Objects.nonNull(tagReq.getStatus())) {
tagDO.setStatus(tagReq.getStatus());
} else {
tagDO.setStatus(StatusEnum.ONLINE.getCode());
}
tagRepository.create(tagDO); tagRepository.create(tagDO);
sendEventBatch(Lists.newArrayList(tagDO), EventType.ADD); return convert2Resp(tagDO);
return convert(tagDO);
}
private void sendEventBatch(List<TagDO> tagDOS, EventType eventType) {
List<DataItem> 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();
} }
@Override @Override
public TagResp update(TagReq tagReq, User user) { public Integer createBatch(List<TagReq> tagReqList, User user) {
if (Objects.isNull(tagReq.getId()) || tagReq.getId() <= 0) { tagReqList.stream().forEach(tagReq -> {
throw new RuntimeException("id is empty"); create(tagReq, user);
} });
TagDO tagDO = tagRepository.getTagById(tagReq.getId()); return tagReqList.size();
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);
} }
@Override @Override
public void delete(Long id, User user) { public Boolean delete(Long id, User user) {
TagDO tagDO = tagRepository.getTagById(id); tagRepository.delete(id);
if (Objects.isNull(tagDO)) { return true;
throw new RuntimeException("tag not found"); }
}
tagDO.setStatus(StatusEnum.DELETED.getCode()); @Override
tagDO.setUpdatedBy(user.getName()); public Boolean deleteBatch(TagDeleteReq tagDeleteReq, User user) {
tagDO.setUpdatedAt(new Date()); tagRepository.deleteBatch(tagDeleteReq);
tagRepository.update(tagDO); return true;
sendEventBatch(Lists.newArrayList(tagDO), EventType.DELETE);
} }
@Override @Override
public TagResp getTag(Long id, User user) { public TagResp getTag(Long id, User user) {
TagDO tagDO = tagRepository.getTagById(id); TagDO tagDO = tagRepository.getTagById(id);
TagResp tagResp = fillCollectAndAdminInfo(tagDO, user); TagResp tagResp = convert2Resp(tagDO);
tagResp = fillModelInfo(tagResp); tagResp = fillTagObjectInfo(tagResp, user);
tagResp = fillCollectAndAdminInfo(tagResp, user);
return tagResp; return tagResp;
} }
@Override @Override
public List<TagResp> getTags(TagFilter tagFilter) { public List<TagResp> getTags(TagFilter tagFilter) {
List<TagDO> tagDOS = tagRepository.query(tagFilter); List<TagResp> tagRespList = tagRepository.queryTagRespList(tagFilter);
if (!CollectionUtils.isEmpty(tagDOS)) { return tagRespList;
return tagDOS.stream().map(tagDO -> convert(tagDO)).collect(Collectors.toList());
}
return new ArrayList<>();
} }
@Override @Override
public PageInfo<TagResp> queryPage(TagFilterPage tagFilterPage, User user) { public List<TagDO> getTagDOList(TagFilter tagFilter, User user) {
TagFilter tagFilter = new TagFilter(); return tagRepository.getTagDOList(tagFilter);
BeanUtils.copyProperties(tagFilterPage, tagFilter); }
List<ModelResp> modelRespList = modelService.getAllModelByDomainIds(tagFilterPage.getDomainIds());
List<Long> modelIds = modelRespList.stream().map(ModelResp::getId).collect(Collectors.toList());
tagFilterPage.getModelIds().addAll(modelIds);
tagFilter.setModelIds(tagFilterPage.getModelIds());
List<CollectDO> collectList = collectService.getCollectList(user.getName()) /**
.stream().filter(collectDO -> TypeEnums.TAG.name().equalsIgnoreCase(collectDO.getType())) * 分页查询标签列表信息
.collect(Collectors.toList()); *
List<Long> collectIds = collectList.stream().map(CollectDO::getCollectId).collect(Collectors.toList()); * @param tagMarketPageReq
if (tagFilterPage.isHasCollect()) { * @param user
if (CollectionUtils.isEmpty(collectIds)) { * @return
tagFilter.setIds(Lists.newArrayList(-1L)); */
} else { @Override
tagFilter.setIds(collectIds); public PageInfo<TagResp> queryTagMarketPage(TagFilterPageReq tagMarketPageReq, User user) {
List<ModelResp> modelRespList = getRelatedModel(tagMarketPageReq);
List<Long> modelIds = modelRespList.stream().map(model -> model.getId()).collect(Collectors.toList());
TagFilter tagFilter = new TagFilter();
BeanUtils.copyProperties(tagMarketPageReq, tagFilter);
tagFilter.setModelIds(modelIds);
PageInfo<TagResp> tagDOPageInfo = PageHelper.startPage(tagMarketPageReq.getCurrent(),
tagMarketPageReq.getPageSize())
.doSelectPageInfo(() -> getTags(tagFilter));
List<TagResp> tagRespList = tagDOPageInfo.getList();
fillModelInfo(tagRespList);
fillDomainInfo(tagRespList);
fillTagObjectInfo(tagRespList, user);
return tagDOPageInfo;
}
private void fillTagObjectInfo(List<TagResp> tagRespList, User user) {
TagObjectFilter filter = new TagObjectFilter();
List<TagObjectResp> tagObjects = tagObjectService.getTagObjects(filter, user);
if (CollectionUtils.isEmpty(tagObjects)) {
return;
}
Map<Long, TagObjectResp> 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<TagResp> tagRespList) {
Map<Long, DomainResp> 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<ModelResp> getRelatedModel(TagFilterPageReq tagMarketPageReq) {
List<ModelResp> modelRespList = new ArrayList<>();
Map<Long, ModelResp> 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);
} }
} }
return modelRespList;
PageInfo<TagDO> tagDOPageInfo = PageHelper.startPage(tagFilterPage.getCurrent(),
tagFilterPage.getPageSize())
.doSelectPageInfo(() -> getTags(tagFilter));
PageInfo<TagResp> pageInfo = new PageInfo<>();
BeanUtils.copyProperties(tagDOPageInfo, pageInfo);
List<TagResp> 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<TagDO> 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<Long> modelIds = new ArrayList<>();
modelIds.add(modelId);
metaFilter.setModelIds(modelIds);
if (Objects.isNull(tagLoadReq.getType()) || SchemaElementType.DIMENSION.equals(tagLoadReq.getType())) {
List<DimensionResp> dimensions = dimensionService.getDimensions(metaFilter);
num += loadDimTagBatch(tagLoadReq, dimensions, user);
}
if (Objects.isNull(tagLoadReq.getType()) || SchemaElementType.METRIC.equals(tagLoadReq.getType())) {
List<MetricResp> metrics = metricService.getMetrics(metaFilter);
num += loadMetricTagBatch(tagLoadReq, metrics, user);
}
log.info("loadTagBatch finished ,tag num:{}", num);
return num;
} }
private int loadMetricTagBatch(TagBatchCreateReq tagLoadReq, List<MetricResp> metrics, User user) { private int loadMetricTagBatch(TagBatchCreateReq tagLoadReq, List<MetricResp> metrics, User user) {
@@ -255,12 +243,10 @@ public class TagMetaServiceImpl implements TagMetaService {
TagReq tagReq = new TagReq(); TagReq tagReq = new TagReq();
BeanUtils.copyProperties(metric, tagReq); BeanUtils.copyProperties(metric, tagReq);
tagReq.setId(null); tagReq.setId(null);
tagReq.setBizName(metric.getBizName());
tagReq.setTagDefineType(TagDefineType.METRIC); tagReq.setTagDefineType(TagDefineType.METRIC);
TagDefineParams tagDefineParams = new TagDefineParams(); TagDefineParams tagDefineParams = new TagDefineParams();
tagDefineParams.setExpr(metric.getBizName()); tagDefineParams.setExpr(metric.getBizName());
tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(metric.getId()))); tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(metric.getId())));
tagReq.setTagDefineParams(tagDefineParams);
try { try {
create(tagReq, user); create(tagReq, user);
} catch (Exception e) { } catch (Exception e) {
@@ -279,12 +265,10 @@ public class TagMetaServiceImpl implements TagMetaService {
TagReq tagReq = new TagReq(); TagReq tagReq = new TagReq();
BeanUtils.copyProperties(dim, tagReq); BeanUtils.copyProperties(dim, tagReq);
tagReq.setId(null); tagReq.setId(null);
tagReq.setBizName(dim.getBizName());
tagReq.setTagDefineType(TagDefineType.DIMENSION); tagReq.setTagDefineType(TagDefineType.DIMENSION);
TagDefineParams tagDefineParams = new TagDefineParams(); TagDefineParams tagDefineParams = new TagDefineParams();
tagDefineParams.setExpr(dim.getBizName()); tagDefineParams.setExpr(dim.getBizName());
tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(dim.getId()))); tagDefineParams.setDependencies(new ArrayList<>(Arrays.asList(dim.getId())));
tagReq.setTagDefineParams(tagDefineParams);
try { try {
create(tagReq, user); create(tagReq, user);
} catch (Exception e) { } catch (Exception e) {
@@ -295,35 +279,6 @@ public class TagMetaServiceImpl implements TagMetaService {
return dimensions.size(); 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) { private TagResp fillModelInfo(TagResp tagResp) {
ModelResp model = modelService.getModel(tagResp.getModelId()); ModelResp model = modelService.getModel(tagResp.getModelId());
tagResp.setModelName(model.getName()); tagResp.setModelName(model.getName());
@@ -337,16 +292,19 @@ public class TagMetaServiceImpl implements TagMetaService {
if (Objects.nonNull(modelIdAndRespMap) && modelIdAndRespMap.containsKey(tagResp.getModelId())) { if (Objects.nonNull(modelIdAndRespMap) && modelIdAndRespMap.containsKey(tagResp.getModelId())) {
tagResp.setModelName(modelIdAndRespMap.get(tagResp.getModelId()).getName()); tagResp.setModelName(modelIdAndRespMap.get(tagResp.getModelId()).getName());
tagResp.setDomainId(modelIdAndRespMap.get(tagResp.getModelId()).getDomainId()); 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<Long> collectIds = collectService.getCollectList(user.getName()) List<Long> collectIds = collectService.getCollectList(user.getName())
.stream().filter(collectDO -> TypeEnums.TAG.name().equalsIgnoreCase(collectDO.getType())) .stream().filter(collectDO -> TypeEnums.TAG.name().equalsIgnoreCase(collectDO.getType()))
.map(CollectDO::getCollectId).collect(Collectors.toList()); .map(CollectDO::getCollectId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(collectIds) && collectIds.contains(tagResp.getId())) {
List<TagResp> tagRespList = convertList(new ArrayList<>(Arrays.asList(tagDO)), collectIds); tagResp.setIsCollect(true);
}
List<TagResp> tagRespList = Arrays.asList(tagResp);
fillAdminRes(tagRespList, user); fillAdminRes(tagRespList, user);
return tagRespList.get(0); return tagRespList.get(0);
} }
@@ -366,85 +324,23 @@ public class TagMetaServiceImpl implements TagMetaService {
} }
} }
private List<TagResp> convertList(List<TagDO> tagDOList, List<Long> collectIds) {
List<TagResp> 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) { private void checkExit(TagReq tagReq) {
TagFilter tagFilter = new TagFilter(); TagFilter tagFilter = new TagFilter();
tagFilter.setModelIds(Arrays.asList(tagReq.getModelId())); tagFilter.setTagDefineType(tagReq.getTagDefineType());
if (Objects.nonNull(tagReq.getItemId())) {
List<TagResp> tagResps = getTags(tagFilter); tagFilter.setItemIds(Arrays.asList(tagReq.getItemId()));
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("表达式不可为空");
} }
if (NameCheckUtils.containsSpecialCharacters(tagReq.getBizName())) { List<TagDO> tagRespList = tagRepository.getTagDOList(tagFilter);
throw new InvalidArgumentException("名称包含特殊字符, 请修改"); 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<String, Object> 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) { private TagDO convert(TagReq tagReq) {
TagDO tagDO = new TagDO(); TagDO tagDO = new TagDO();
BeanUtils.copyProperties(tagReq, tagDO); BeanUtils.copyProperties(tagReq, tagDO);
tagDO.setDefineType(tagReq.getTagDefineType().name()); tagDO.setType(tagReq.getTagDefineType().name());
tagDO.setType(tagReq.getType().name());
tagDO.setTypeParams(tagReq.getTypeParamsJson());
tagDO.setExt(tagReq.getExtJson());
return tagDO; return tagDO;
} }
} }

View File

@@ -58,7 +58,7 @@ public class TagObjectServiceImpl implements TagObjectService {
throw new Exception(String.format("the bizName %s is exit", tagObjectReq.getBizName())); throw new Exception(String.format("the bizName %s is exit", tagObjectReq.getBizName()));
} }
if (tagObject.getName().equalsIgnoreCase(tagObjectReq.getName())) { 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()));
} }
} }
} }

View File

@@ -2,129 +2,132 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tencent.supersonic.headless.server.persistence.mapper.TagCustomMapper"> <mapper namespace="com.tencent.supersonic.headless.server.persistence.mapper.TagCustomMapper">
<resultMap id="BaseResultMap" type="com.tencent.supersonic.headless.server.persistence.dataobject.TagDO"> <resultMap id="BaseTagDO" type="com.tencent.supersonic.headless.server.persistence.dataobject.TagDO">
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="model_id" jdbcType="BIGINT" property="modelId" /> <result column="item_id" jdbcType="BIGINT" property="itemId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="biz_name" jdbcType="VARCHAR" property="bizName" />
<result column="description" jdbcType="VARCHAR" property="description" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="sensitive_level" jdbcType="INTEGER" property="sensitiveLevel" />
<result column="type" jdbcType="VARCHAR" property="type" /> <result column="type" jdbcType="VARCHAR" property="type" />
<result column="created_at" jdbcType="TIMESTAMP" property="createdAt" /> <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
<result column="created_by" jdbcType="VARCHAR" property="createdBy" /> <result column="created_by" jdbcType="VARCHAR" property="createdBy" />
<result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" /> <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
<result column="updated_by" jdbcType="VARCHAR" property="updatedBy" /> <result column="updated_by" jdbcType="VARCHAR" property="updatedBy" />
<result column="define_type" jdbcType="VARCHAR" property="defineType" />
</resultMap> </resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.tencent.supersonic.headless.server.persistence.dataobject.TagDO">
<result column="type_params" jdbcType="LONGVARCHAR" property="typeParams" /> <resultMap id="TagResp" type="com.tencent.supersonic.headless.api.pojo.response.TagResp">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="domain_id" jdbcType="BIGINT" property="domainId" />
<result column="domain_name" jdbcType="VARCHAR" property="domainName" />
<result column="model_id" jdbcType="BIGINT" property="modelId" />
<result column="model_name" jdbcType="VARCHAR" property="modelName" />
<result column="tag_object_id" jdbcType="BIGINT" property="tagObjectId" />
<result column="tag_object_name" jdbcType="VARCHAR" property="tagObjectName" />
<result column="tag_define_type" jdbcType="VARCHAR" property="tagDefineType" />
<result column="item_id" jdbcType="VARCHAR" property="itemId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="biz_name" jdbcType="VARCHAR" property="bizName" />
<result column="description" jdbcType="VARCHAR" property="description" />
</resultMap> </resultMap>
<sql id="Example_Where_Clause">
<select id="getTagDOList" resultMap="BaseTagDO">
select * from s2_tag
<where> <where>
<foreach collection="oredCriteria" item="criteria" separator="or"> <if test="itemIds != null and itemIds.size >0">
<if test="criteria.valid"> and item_id in
<trim prefix="(" prefixOverrides="and" suffix=")"> <foreach collection="itemIds" index="index" item="itemId" open="(" close=")"
<foreach collection="criteria.criteria" item="criterion"> separator=",">
<choose> #{itemId}
<when test="criterion.noValue"> </foreach>
and ${criterion.condition} </if>
</when> <if test="ids != null and ids.size >0">
<when test="criterion.singleValue"> and id in
and ${criterion.condition} #{criterion.value} <foreach collection="ids" index="index" item="tagId" open="(" close=")"
</when> separator=",">
<when test="criterion.betweenValue"> #{tagId}
and ${criterion.condition} #{criterion.value} and </foreach>
#{criterion.secondValue} </if>
</when> <if test="tagDefineType != null">
<when test="criterion.listValue"> and tag_define_type = #{tagDefineType}
and ${criterion.condition} </if>
<foreach close=")" collection="criterion.value" item="listItem"
open="(" separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where> </where>
</sql> </select>
<sql id="Base_Column_List">
id, model_id, name, biz_name, description, status, sensitive_level, type, created_at, <select id="queryTagRespList" resultMap="TagResp">
created_by, updated_at, updated_by, define_type select * from (
</sql> select s2_tag.id as id, s2_dimension.model_id as model_id, "DIMENSION" as tag_define_type, s2_dimension.id as item_id,
<sql id="Blob_Column_List"> s2_dimension.name as name, s2_dimension.biz_name as biz_name, s2_dimension.description as description, s2_tag.updated_at as updated_at
type_params from s2_tag join s2_dimension
</sql> on s2_tag.item_id = s2_dimension.id
where s2_dimension.status=1
union
select s2_tag.id as id, s2_metric.model_id as model_id, "METRIC" as tag_define_type, s2_metric.id as item_id,
s2_metric.name as name, s2_metric.biz_name as biz_name, s2_metric.description as description, s2_tag.updated_at as updated_at
from s2_tag join s2_metric
on s2_tag.item_id = s2_metric.id
where s2_metric.status=1
)t
<where>
<if test="tagDefineType != null">
and tag_define_type = #{tagDefineType}
</if>
<if test="itemIds != null and itemIds.size >0">
and item_id in
<foreach collection="itemIds" index="index" item="itemId" open="(" close=")"
separator=",">
#{itemId}
</foreach>
</if>
<if test="ids != null and ids.size >0">
and id in
<foreach collection="ids" index="index" item="tagId" open="(" close=")"
separator=",">
#{tagId}
</foreach>
</if>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="bizName != null and bizName != ''">
and biz_Name = #{bizName}
</if>
<if test="modelIds != null and modelIds.size >0">
and model_id in
<foreach collection="modelIds" index="index" item="modelId" open="(" close=")"
separator=",">
#{modelId}
</foreach>
</if>
<if test="key != null and key != ''">
and ( id like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
name like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
biz_name like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
description like CONCAT('%',#{key , jdbcType=VARCHAR},'%'))
</if>
</where>
order by updated_at desc
</select>
<select id="query" resultMap="ResultMapWithBLOBs"> <delete id="deleteById">
select * delete from s2_tag where id = #{id}
from s2_tag </delete>
where status != 3
<if test="type != null and type != ''"> <delete id="deleteBatch">
and type = #{type} delete from s2_tag
</if> where type = #{type}
<if test="tagDefineType != null"> <if test="itemIds != null and itemIds.size >0">
and define_type = #{tagDefineType} and item_id in
</if> <foreach collection="itemIds" index="index" item="itemId" open="(" close=")"
<if test="key != null and key != ''">
and ( id like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
name like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
biz_name like CONCAT('%',#{key , jdbcType=VARCHAR},'%') or
description like CONCAT('%',#{key , jdbcType=VARCHAR},'%'))
</if>
<if test="id != null">
and id like CONCAT('%',#{id , jdbcType=VARCHAR},'%')
</if>
<if test="name != null and name != '' ">
and name like CONCAT('%',#{name , jdbcType=VARCHAR},'%')
</if>
<if test="bizName != null and bizName != ''">
and biz_name like CONCAT('%',#{bizName , jdbcType=VARCHAR},'%')
</if>
<if test="sensitiveLevel != null">
and sensitive_level = #{sensitiveLevel}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="modelIds != null and modelIds.size >0">
and model_id in
<foreach collection="modelIds" index="index" item="model" open="(" close=")"
separator=","> separator=",">
#{model} #{itemId}
</foreach> </foreach>
</if> </if>
<if test="ids != null and ids.size >0"> <if test="ids != null and ids.size >0">
and id in and id in
<foreach collection="ids" index="index" item="id" open="(" close=")" <foreach collection="ids" index="index" item="tagId" open="(" close=")"
separator=","> separator=",">
#{id} #{tagId}
</foreach> </foreach>
</if> </if>
<if test="bizNames != null and bizNames.size >0">
and biz_name in
<foreach collection="bizNames" index="index" item="bizName" open="(" close=")"
separator=",">
#{bizName}
</foreach>
</if>
<if test="createdBy != null">
and created_by = #{createdBy}
</if>
</select>
<update id="batchUpdateStatus" parameterType="java.util.List"> </delete>
<foreach collection="list" item="tag" separator=";">
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}
</foreach>
</update>
</mapper> </mapper>

View File

@@ -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.ModelDetail;
import com.tencent.supersonic.headless.api.pojo.QueryConfig; import com.tencent.supersonic.headless.api.pojo.QueryConfig;
import com.tencent.supersonic.headless.api.pojo.RelateDimension; 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.TagTypeDefaultConfig;
import com.tencent.supersonic.headless.api.pojo.TimeDefaultConfig; import com.tencent.supersonic.headless.api.pojo.TimeDefaultConfig;
import com.tencent.supersonic.headless.api.pojo.enums.DataType; 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.IdentifyType;
import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType; 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.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.DataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.DatabaseReq; 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.DimensionReq;
import com.tencent.supersonic.headless.api.pojo.request.DomainReq; 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.MetricReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelReq; 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.DataSetService;
import com.tencent.supersonic.headless.server.service.DatabaseService; import com.tencent.supersonic.headless.server.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.DimensionService; import com.tencent.supersonic.headless.server.service.DimensionService;
@@ -405,60 +402,6 @@ public class ModelDemoDataLoader {
metricService.updateMetric(metricReq, user); 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 { public void addMetric_uv() throws Exception {
MetricReq metricReq = new MetricReq(); MetricReq metricReq = new MetricReq();
metricReq.setModelId(2L); metricReq.setModelId(2L);

View File

@@ -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`; 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 --20240301
CREATE TABLE IF NOT EXISTS `s2_dictionary_conf` ( CREATE TABLE IF NOT EXISTS `s2_dictionary_conf` (
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
@@ -270,4 +250,18 @@ CREATE TABLE IF NOT EXISTS `s2_tag_object`
`ext` text DEFAULT NULL, `ext` text DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE = InnoDB ) ENGINE = InnoDB
DEFAULT CHARSET = utf8 COMMENT ='标签表对象'; 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;

View File

@@ -578,20 +578,12 @@ CREATE TABLE IF NOT EXISTS `s2_data_set` (
CREATE TABLE IF NOT EXISTS `s2_tag` ( CREATE TABLE IF NOT EXISTS `s2_tag` (
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
`model_id` INT NOT NULL , `item_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 `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_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL , `created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL , `updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL , `updated_by` varchar(100) DEFAULT NULL ,
`ext` LONGVARCHAR DEFAULT NULL ,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
); );
COMMENT ON TABLE s2_tag IS 'tag information'; COMMENT ON TABLE s2_tag IS 'tag information';

View File

@@ -498,26 +498,18 @@ CREATE TABLE s2_view
`admin_org` varchar(3000) DEFAULT NULL `admin_org` varchar(3000) DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; )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, `id` bigint(20) NOT NULL AUTO_INCREMENT,
`model_id` bigint(20) DEFAULT NULL, `item_id` bigint(20) DEFAULT NULL,
`name` varchar(255) NOT NULL COMMENT '名称', `type` varchar(255) NOT NULL ,
`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 '类型参数',
`created_at` datetime NOT NULL COMMENT '创建时间', `created_at` datetime NOT NULL COMMENT '创建时间',
`created_by` varchar(100) NOT NULL COMMENT '创建人', `created_by` varchar(100) NOT NULL COMMENT '创建人',
`updated_at` datetime NULL COMMENT '更新时间', `updated_at` datetime NULL COMMENT '更新时间',
`updated_by` varchar(100) NULL COMMENT '更新人', `updated_by` varchar(100) NULL COMMENT '更新人',
`ext` text DEFAULT NULL, `ext` text DEFAULT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE = InnoDB ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='标签表';
DEFAULT CHARSET = utf8 COMMENT ='标签表';
CREATE TABLE IF NOT EXISTS `s2_tag_object` CREATE TABLE IF NOT EXISTS `s2_tag_object`
( (

View File

@@ -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);
}
}

View File

@@ -579,20 +579,12 @@ CREATE TABLE IF NOT EXISTS `s2_data_set` (
CREATE TABLE IF NOT EXISTS `s2_tag` ( CREATE TABLE IF NOT EXISTS `s2_tag` (
`id` INT NOT NULL AUTO_INCREMENT, `id` INT NOT NULL AUTO_INCREMENT,
`model_id` INT NOT NULL , `item_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 `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_at` TIMESTAMP NOT NULL ,
`created_by` varchar(100) NOT NULL , `created_by` varchar(100) NOT NULL ,
`updated_at` TIMESTAMP DEFAULT NULL , `updated_at` TIMESTAMP DEFAULT NULL ,
`updated_by` varchar(100) DEFAULT NULL , `updated_by` varchar(100) DEFAULT NULL ,
`ext` LONGVARCHAR DEFAULT NULL ,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
); );
COMMENT ON TABLE s2_tag IS 'tag information'; COMMENT ON TABLE s2_tag IS 'tag information';