(improvement)(Headless) remove queryType in dataSet (#830)

This commit is contained in:
lexluo09
2024-03-19 15:29:32 +08:00
committed by GitHub
parent 8994a6ddca
commit af53812d08
12 changed files with 59 additions and 285 deletions

View File

@@ -20,12 +20,9 @@ public class DataSetModelConfig {
private List<Long> dimensions = Lists.newArrayList(); private List<Long> dimensions = Lists.newArrayList();
private List<Long> tagIds = Lists.newArrayList(); public DataSetModelConfig(Long id, List<Long> dimensions, List<Long> metrics) {
public DataSetModelConfig(Long id, List<Long> dimensions, List<Long> metrics, List<Long> tagIds) {
this.id = id; this.id = id;
this.metrics = metrics; this.metrics = metrics;
this.dimensions = dimensions; this.dimensions = dimensions;
this.tagIds = tagIds;
} }
} }

View File

@@ -47,11 +47,6 @@ public class DataSetResp extends SchemaItem {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public List<Long> getAllTags() {
return getDataSetModelConfigs().stream().map(DataSetModelConfig::getTagIds)
.flatMap(Collection::stream).collect(Collectors.toList());
}
public List<Long> getAllIncludeAllModels() { public List<Long> getAllIncludeAllModels() {
return getDataSetModelConfigs().stream().filter(DataSetModelConfig::isIncludesAll) return getDataSetModelConfigs().stream().filter(DataSetModelConfig::isIncludesAll)
.map(DataSetModelConfig::getId) .map(DataSetModelConfig::getId)

View File

@@ -13,7 +13,6 @@ import com.tencent.supersonic.headless.api.pojo.DimValueMap;
import com.tencent.supersonic.headless.api.pojo.SchemaItem; import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryTagReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
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.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
@@ -47,7 +46,7 @@ public class DimValueAspect {
@Autowired @Autowired
private DimensionService dimensionService; private DimensionService dimensionService;
@Around("execution(* com.tencent.supersonic.headless.server.service.ChatQueryService.queryByReq(..))") @Around("execution(* com.tencent.supersonic.headless.server.service.QueryService.queryByReq(..))")
public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable { public Object handleDimValue(ProceedingJoinPoint joinPoint) throws Throwable {
if (!dimensionValueMapEnable) { if (!dimensionValueMapEnable) {
log.debug("dimensionValueMapEnable is false, skip dimensionValueMap"); log.debug("dimensionValueMapEnable is false, skip dimensionValueMap");
@@ -63,17 +62,9 @@ public class DimValueAspect {
if (queryReq instanceof QuerySqlReq) { if (queryReq instanceof QuerySqlReq) {
return handleSqlDimValue(joinPoint); return handleSqlDimValue(joinPoint);
} }
if (queryReq instanceof QueryTagReq) {
return handleTagValue(joinPoint);
}
throw new InvalidArgumentException("queryReq is not Invalid:" + queryReq); throw new InvalidArgumentException("queryReq is not Invalid:" + queryReq);
} }
public Object handleTagValue(ProceedingJoinPoint joinPoint) throws Throwable {
return (SemanticQueryResp) joinPoint.proceed();
}
private SemanticQueryResp handleStructDimValue(ProceedingJoinPoint joinPoint) throws Throwable { private SemanticQueryResp handleStructDimValue(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
QueryStructReq queryStructReq = (QueryStructReq) args[0]; QueryStructReq queryStructReq = (QueryStructReq) args[0];

View File

@@ -42,24 +42,24 @@ public class MetricController {
@PostMapping("/createMetric") @PostMapping("/createMetric")
public MetricResp createMetric(@RequestBody MetricReq metricReq, public MetricResp createMetric(@RequestBody MetricReq metricReq,
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 metricService.createMetric(metricReq, user); return metricService.createMetric(metricReq, user);
} }
@PostMapping("/updateMetric") @PostMapping("/updateMetric")
public MetricResp updateMetric(@RequestBody MetricReq metricReq, public MetricResp updateMetric(@RequestBody MetricReq metricReq,
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 metricService.updateMetric(metricReq, user); return metricService.updateMetric(metricReq, user);
} }
@PostMapping("/batchUpdateStatus") @PostMapping("/batchUpdateStatus")
public Boolean batchUpdateStatus(@RequestBody MetaBatchReq metaBatchReq, public Boolean batchUpdateStatus(@RequestBody MetaBatchReq metaBatchReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
metricService.batchUpdateStatus(metaBatchReq, user); metricService.batchUpdateStatus(metaBatchReq, user);
return true; return true;
@@ -67,8 +67,8 @@ public class MetricController {
@PostMapping("/mockMetricAlias") @PostMapping("/mockMetricAlias")
public List<String> mockMetricAlias(@RequestBody MetricBaseReq metricReq, public List<String> mockMetricAlias(@RequestBody MetricBaseReq metricReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return metricService.mockAlias(metricReq, "indicator", user); return metricService.mockAlias(metricReq, "indicator", user);
} }
@@ -86,8 +86,8 @@ public class MetricController {
@PostMapping("/queryMetric") @PostMapping("/queryMetric")
public PageInfo<MetricResp> queryMetric(@RequestBody PageMetricReq pageMetricReq, public PageInfo<MetricResp> queryMetric(@RequestBody PageMetricReq pageMetricReq,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return metricService.queryMetric(pageMetricReq, user); return metricService.queryMetric(pageMetricReq, user);
} }
@@ -95,22 +95,22 @@ public class MetricController {
@Deprecated @Deprecated
@GetMapping("getMetric/{modelId}/{bizName}") @GetMapping("getMetric/{modelId}/{bizName}")
public MetricResp getMetric(@PathVariable("modelId") Long modelId, public MetricResp getMetric(@PathVariable("modelId") Long modelId,
@PathVariable("bizName") String bizName) { @PathVariable("bizName") String bizName) {
return metricService.getMetric(modelId, bizName); return metricService.getMetric(modelId, bizName);
} }
@GetMapping("getMetric/{id}") @GetMapping("getMetric/{id}")
public MetricResp getMetric(@PathVariable("id") Long id, public MetricResp getMetric(@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 metricService.getMetric(id, user); return metricService.getMetric(id, user);
} }
@DeleteMapping("deleteMetric/{id}") @DeleteMapping("deleteMetric/{id}")
public Boolean deleteMetric(@PathVariable("id") Long id, public Boolean deleteMetric(@PathVariable("id") Long id,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
metricService.deleteMetric(id, user); metricService.deleteMetric(id, user);
return true; return true;
@@ -135,8 +135,8 @@ public class MetricController {
@PostMapping("/saveMetricQueryDefaultConfig") @PostMapping("/saveMetricQueryDefaultConfig")
public boolean saveMetricQueryDefaultConfig(@RequestBody MetricQueryDefaultConfig queryDefaultConfig, public boolean saveMetricQueryDefaultConfig(@RequestBody MetricQueryDefaultConfig queryDefaultConfig,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
metricService.saveMetricQueryDefaultConfig(queryDefaultConfig, user); metricService.saveMetricQueryDefaultConfig(queryDefaultConfig, user);
return true; return true;
@@ -144,8 +144,8 @@ public class MetricController {
@RequestMapping("getMetricQueryDefaultConfig/{metricId}") @RequestMapping("getMetricQueryDefaultConfig/{metricId}")
public MetricQueryDefaultConfig getMetricQueryDefaultConfig(@PathVariable("metricId") Long metricId, public MetricQueryDefaultConfig getMetricQueryDefaultConfig(@PathVariable("metricId") Long metricId,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) { HttpServletResponse response) {
User user = UserHolder.findUser(request, response); User user = UserHolder.findUser(request, response);
return metricService.getMetricQueryDefaultConfig(metricId, user); return metricService.getMetricQueryDefaultConfig(metricId, user);
} }

View File

@@ -2,8 +2,10 @@ package com.tencent.supersonic.headless.server.rest.api;
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.QueryTagReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.QueryService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -11,9 +13,6 @@ 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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController @RestController
@RequestMapping("/api/semantic/query") @RequestMapping("/api/semantic/query")
@Slf4j @Slf4j
@@ -23,11 +22,11 @@ public class TagQueryApiController {
private QueryService queryService; private QueryService queryService;
@PostMapping("/tag") @PostMapping("/tag")
public Object queryByTag(@RequestBody QueryTagReq queryTagReq, public Object queryByTag(@RequestBody QueryStructReq queryStructReq,
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 queryService.queryByReq(queryTagReq, user); return queryService.queryByReq(queryStructReq.convert(), user);
} }
} }

View File

@@ -8,39 +8,28 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.collect.Lists; 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.enums.AuthType; import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.pojo.enums.StatusEnum; 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.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.BeanMapper;
import com.tencent.supersonic.headless.api.pojo.DataSetModelConfig;
import com.tencent.supersonic.headless.api.pojo.QueryConfig;
import com.tencent.supersonic.headless.api.pojo.DataSetDetail; import com.tencent.supersonic.headless.api.pojo.DataSetDetail;
import com.tencent.supersonic.headless.api.pojo.QueryConfig;
import com.tencent.supersonic.headless.api.pojo.request.DataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.request.DataSetReq; import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
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.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.DataSetResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.DataSetDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DataSetDO;
import com.tencent.supersonic.headless.server.persistence.mapper.DataSetDOMapper; import com.tencent.supersonic.headless.server.persistence.mapper.DataSetDOMapper;
import com.tencent.supersonic.headless.server.pojo.MetaFilter; import com.tencent.supersonic.headless.server.pojo.MetaFilter;
import com.tencent.supersonic.headless.server.service.DataSetService;
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.DomainService;
import com.tencent.supersonic.headless.server.service.MetricService; import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.DataSetService;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
@@ -51,6 +40,13 @@ import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@Service @Service
public class DataSetServiceImpl public class DataSetServiceImpl
@@ -171,11 +167,6 @@ public class DataSetServiceImpl
dataSetResp.setAdminOrgs(StringUtils.isBlank(dataSetDO.getAdminOrg()) dataSetResp.setAdminOrgs(StringUtils.isBlank(dataSetDO.getAdminOrg())
? Lists.newArrayList() : Arrays.asList(dataSetDO.getAdminOrg().split(","))); ? Lists.newArrayList() : Arrays.asList(dataSetDO.getAdminOrg().split(",")));
dataSetResp.setTypeEnum(TypeEnums.DATASET); dataSetResp.setTypeEnum(TypeEnums.DATASET);
String queryType = dataSetDO.getQueryType();
if (Objects.isNull(queryType)) {
queryType = QueryType.METRIC.name();
}
dataSetResp.setQueryType(QueryType.valueOf(queryType));
return dataSetResp; return dataSetResp;
} }
@@ -184,8 +175,6 @@ public class DataSetServiceImpl
BeanMapper.mapper(dataSetReq, dataSetDO); BeanMapper.mapper(dataSetReq, dataSetDO);
dataSetDO.setDataSetDetail(JSONObject.toJSONString(dataSetReq.getDataSetDetail())); dataSetDO.setDataSetDetail(JSONObject.toJSONString(dataSetReq.getDataSetDetail()));
dataSetDO.setQueryConfig(JSONObject.toJSONString(dataSetReq.getQueryConfig())); dataSetDO.setQueryConfig(JSONObject.toJSONString(dataSetReq.getQueryConfig()));
QueryType queryType = getQueryType(dataSetReq);
dataSetDO.setQueryType(queryType.name());
return dataSetDO; return dataSetDO;
} }
@@ -198,24 +187,6 @@ public class DataSetServiceImpl
return queryReq; return queryReq;
} }
private QueryType getQueryType(DataSetReq dataSetReq) {
QueryType queryType = dataSetReq.getQueryType();
if (Objects.nonNull(queryType)) {
return queryType;
}
List<DataSetModelConfig> dataSetModelConfigs = dataSetReq.getDataSetDetail().getDataSetModelConfigs();
if (CollectionUtils.isEmpty(dataSetModelConfigs)) {
return QueryType.METRIC;
}
Set<DataSetModelConfig> collect = dataSetModelConfigs.stream()
.filter(config -> !CollectionUtils.isEmpty(config.getTagIds())).collect(Collectors.toSet());
if (CollectionUtils.isEmpty(collect)) {
return QueryType.METRIC;
}
return QueryType.TAG;
}
public static boolean checkAdminPermission(User user, DataSetResp dataSetResp) { public static boolean checkAdminPermission(User user, DataSetResp dataSetResp) {
List<String> admins = dataSetResp.getAdmins(); List<String> admins = dataSetResp.getAdmins();
if (user.isSuperAdmin()) { if (user.isSuperAdmin()) {

View File

@@ -7,7 +7,6 @@ import com.tencent.supersonic.common.pojo.Aggregator;
import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.enums.ApiItemType; import com.tencent.supersonic.common.pojo.enums.ApiItemType;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum; import com.tencent.supersonic.common.pojo.enums.TaskStatusEnum;
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
@@ -22,7 +21,6 @@ import com.tencent.supersonic.headless.api.pojo.request.QueryItemReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryMultiStructReq;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryTagReq;
import com.tencent.supersonic.headless.api.pojo.request.SchemaFilterReq; import com.tencent.supersonic.headless.api.pojo.request.SchemaFilterReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq; import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.response.AppDetailResp; import com.tencent.supersonic.headless.api.pojo.response.AppDetailResp;
@@ -52,7 +50,6 @@ import com.tencent.supersonic.headless.server.service.QueryService;
import com.tencent.supersonic.headless.server.utils.QueryReqConverter; import com.tencent.supersonic.headless.server.utils.QueryReqConverter;
import com.tencent.supersonic.headless.server.utils.QueryUtils; import com.tencent.supersonic.headless.server.utils.QueryUtils;
import com.tencent.supersonic.headless.server.utils.StatUtils; import com.tencent.supersonic.headless.server.utils.StatUtils;
import com.tencent.supersonic.headless.server.utils.TagConverter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -73,7 +70,6 @@ public class QueryServiceImpl implements QueryService {
private StatUtils statUtils; private StatUtils statUtils;
private final QueryUtils queryUtils; private final QueryUtils queryUtils;
private final QueryReqConverter queryReqConverter; private final QueryReqConverter queryReqConverter;
private final TagConverter tagConverter;
private final Catalog catalog; private final Catalog catalog;
private final AppService appService; private final AppService appService;
private final SemanticSchemaManager semanticSchemaManager; private final SemanticSchemaManager semanticSchemaManager;
@@ -84,7 +80,7 @@ public class QueryServiceImpl implements QueryService {
StatUtils statUtils, StatUtils statUtils,
QueryUtils queryUtils, QueryUtils queryUtils,
QueryReqConverter queryReqConverter, QueryReqConverter queryReqConverter,
TagConverter tagConverter, Catalog catalog, Catalog catalog,
AppService appService, AppService appService,
SemanticSchemaManager semanticSchemaManager, SemanticSchemaManager semanticSchemaManager,
DefaultQueryParser queryParser, DefaultQueryParser queryParser,
@@ -92,7 +88,6 @@ public class QueryServiceImpl implements QueryService {
this.statUtils = statUtils; this.statUtils = statUtils;
this.queryUtils = queryUtils; this.queryUtils = queryUtils;
this.queryReqConverter = queryReqConverter; this.queryReqConverter = queryReqConverter;
this.tagConverter = tagConverter;
this.catalog = catalog; this.catalog = catalog;
this.appService = appService; this.appService = appService;
this.semanticSchemaManager = semanticSchemaManager; this.semanticSchemaManager = semanticSchemaManager;
@@ -160,9 +155,6 @@ public class QueryServiceImpl implements QueryService {
if (semanticQueryReq instanceof QueryMultiStructReq) { if (semanticQueryReq instanceof QueryMultiStructReq) {
return buildMultiStructQueryStatement((QueryMultiStructReq) semanticQueryReq); return buildMultiStructQueryStatement((QueryMultiStructReq) semanticQueryReq);
} }
if (semanticQueryReq instanceof QueryTagReq) {
return buildTagQueryStatement((QueryTagReq) semanticQueryReq);
}
return null; return null;
} }
@@ -177,12 +169,7 @@ public class QueryServiceImpl implements QueryService {
queryStatement.setEnableOptimize(queryUtils.enableOptimize()); queryStatement.setEnableOptimize(queryUtils.enableOptimize());
queryStatement.setDataSetId(queryStructReq.getDataSetId()); queryStatement.setDataSetId(queryStructReq.getDataSetId());
queryStatement.setSemanticSchemaResp(semanticSchemaResp); queryStatement.setSemanticSchemaResp(semanticSchemaResp);
if (QueryType.TAG.equals(semanticSchemaResp.getQueryType())) { queryStatement.setSemanticModel(semanticSchemaManager.getSemanticModel(semanticSchemaResp));
queryStatement = tagConverter.convert(queryStructReq, semanticSchemaResp);
queryStatement.setSemanticModel(semanticSchemaManager.getTagSemanticModel(semanticSchemaResp));
} else {
queryStatement.setSemanticModel(semanticSchemaManager.getSemanticModel(semanticSchemaResp));
}
return queryStatement; return queryStatement;
} }
@@ -202,21 +189,6 @@ public class QueryServiceImpl implements QueryService {
return queryUtils.sqlParserUnion(queryMultiStructReq, sqlParsers); return queryUtils.sqlParserUnion(queryMultiStructReq, sqlParsers);
} }
private QueryStatement buildTagQueryStatement(QueryTagReq queryTagReq)
throws Exception {
SchemaFilterReq schemaFilterReq = new SchemaFilterReq();
SchemaFilterReq filter = buildSchemaFilterReq(queryTagReq);
schemaFilterReq.setModelIds(queryTagReq.getModelIds());
SemanticSchemaResp semanticSchemaResp = catalog.fetchSemanticSchema(filter);
QueryStatement queryStatement = tagConverter.convert(queryTagReq, semanticSchemaResp);
queryStatement.setModelIds(queryTagReq.getModelIds());
queryStatement.setEnableOptimize(queryUtils.enableOptimize());
queryStatement.setSemanticSchemaResp(semanticSchemaResp);
SemanticModel semanticModel = semanticSchemaManager.getTagSemanticModel(semanticSchemaResp);
queryStatement.setSemanticModel(semanticModel);
return queryStatement;
}
private SchemaFilterReq buildSchemaFilterReq(SemanticQueryReq semanticQueryReq) { private SchemaFilterReq buildSchemaFilterReq(SemanticQueryReq semanticQueryReq) {
SchemaFilterReq schemaFilterReq = new SchemaFilterReq(); SchemaFilterReq schemaFilterReq = new SchemaFilterReq();
schemaFilterReq.setDataSetId(semanticQueryReq.getDataSetId()); schemaFilterReq.setDataSetId(semanticQueryReq.getDataSetId());

View File

@@ -1,5 +1,7 @@
package com.tencent.supersonic.headless.server.service.impl; package com.tencent.supersonic.headless.server.service.impl;
import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.common.cache.Cache; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
@@ -47,13 +49,6 @@ import com.tencent.supersonic.headless.server.utils.DataSetSchemaBuilder;
import com.tencent.supersonic.headless.server.utils.DimensionConverter; import com.tencent.supersonic.headless.server.utils.DimensionConverter;
import com.tencent.supersonic.headless.server.utils.MetricConverter; import com.tencent.supersonic.headless.server.utils.MetricConverter;
import com.tencent.supersonic.headless.server.utils.StatUtils; import com.tencent.supersonic.headless.server.utils.StatUtils;
import com.tencent.supersonic.headless.server.utils.TagConverter;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@@ -62,8 +57,11 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.SneakyThrows;
import static com.tencent.supersonic.common.pojo.Constants.AT_SYMBOL; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@Slf4j @Slf4j
@Service @Service
@@ -181,7 +179,6 @@ public class SchemaServiceImpl implements SchemaService {
TagFilter tagFilter = new TagFilter(); TagFilter tagFilter = new TagFilter();
tagFilter.setModelIds(modelIds); tagFilter.setModelIds(modelIds);
List<TagResp> tagRespList = tagService.getTags(tagFilter);
List<DataSetSchemaResp> dataSetSchemaResps = new ArrayList<>(); List<DataSetSchemaResp> dataSetSchemaResps = new ArrayList<>();
for (Long dataSetId : dataSetRespMap.keySet()) { for (Long dataSetId : dataSetRespMap.keySet()) {
@@ -200,8 +197,6 @@ public class SchemaServiceImpl implements SchemaService {
dataSetSchemaResp.setModelResps(modelResps.stream().filter(modelResp -> dataSetSchemaResp.setModelResps(modelResps.stream().filter(modelResp ->
dataSetResp.getAllModels().contains(modelResp.getId())).collect(Collectors.toList())); dataSetResp.getAllModels().contains(modelResp.getId())).collect(Collectors.toList()));
List<TagResp> tagResps = TagConverter.filterByDataSet(tagRespList, dataSetResp);
dataSetSchemaResp.setTags(tagResps);
dataSetSchemaResps.add(dataSetSchemaResp); dataSetSchemaResps.add(dataSetSchemaResp);
} }
fillStaticInfo(dataSetSchemaResps); fillStaticInfo(dataSetSchemaResps);

View File

@@ -1,140 +0,0 @@
package com.tencent.supersonic.headless.server.utils;
import com.tencent.supersonic.common.pojo.enums.QueryType;
import com.tencent.supersonic.common.util.jsqlparser.SqlSelectHelper;
import com.tencent.supersonic.headless.api.pojo.MetricTable;
import com.tencent.supersonic.headless.api.pojo.QueryParam;
import com.tencent.supersonic.headless.api.pojo.enums.AggOption;
import com.tencent.supersonic.headless.api.pojo.enums.EngineType;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryTagReq;
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticSchemaResp;
import com.tencent.supersonic.headless.api.pojo.response.TagResp;
import com.tencent.supersonic.headless.core.pojo.DataSetQueryParam;
import com.tencent.supersonic.headless.core.pojo.QueryStatement;
import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TagConverter {
@Value("${query.sql.limitWrapper:true}")
private Boolean limitWrapper;
@Autowired
private QueryStructUtils queryStructUtils;
@Autowired
private SqlGenerateUtils sqlGenerateUtils;
public QueryStatement convert(QueryStructReq queryStructReq,
SemanticSchemaResp semanticSchemaResp) throws Exception {
QueryStatement queryStatement = new QueryStatement();
// covert to QueryReqConverter
BeanUtils.copyProperties(queryStructReq.convert(), queryStructReq);
QuerySqlReq querySqlReq = queryStructReq.convert();
convert(querySqlReq, semanticSchemaResp, queryStatement, queryStructReq);
QueryParam queryParam = new QueryParam();
convert(queryStructReq, queryParam);
queryStatement.setQueryParam(queryParam);
queryStatement.setDataSetId(queryStructReq.getDataSetId());
return queryStatement;
}
public void convert(QuerySqlReq querySqlReq,
SemanticSchemaResp semanticSchemaResp, QueryStatement queryStatement, QueryStructReq queryStructReq)
throws Exception {
if (Objects.nonNull(querySqlReq)) {
log.info("convert to QuerySqlReq {}", querySqlReq);
String tableName = SqlSelectHelper.getTableName(querySqlReq.getSql());
MetricTable metricTable = new MetricTable();
metricTable.setMetrics(new ArrayList<>());
metricTable.getMetrics().add(sqlGenerateUtils.generateInternalMetricName(
semanticSchemaResp.getModelResps().get(0).getBizName()));
metricTable.setAggOption(AggOption.NATIVE);
List<String> allFields = SqlSelectHelper.getAllFields(querySqlReq.getSql());
metricTable.setDimensions(allFields);
metricTable.setAlias(tableName.toLowerCase());
List<MetricTable> tables = new ArrayList<>();
tables.add(metricTable);
//.build ParseSqlReq
DataSetQueryParam result = new DataSetQueryParam();
BeanUtils.copyProperties(querySqlReq, result);
result.setTables(tables);
DatabaseResp database = semanticSchemaResp.getDatabaseResp();
if (!sqlGenerateUtils.isSupportWith(EngineType.fromString(database.getType().toUpperCase()),
database.getVersion())) {
result.setSupportWith(false);
result.setWithAlias(false);
}
//.physicalSql by ParseSqlReq
queryStructReq.setDateInfo(queryStructUtils.getDateConfBySql(querySqlReq.getSql()));
queryStructReq.setDataSetId(querySqlReq.getDataSetId());
queryStructReq.setQueryType(QueryType.TAG);
queryStatement.setDataSetQueryParam(result);
queryStatement.setIsS2SQL(true);
queryStatement.setMinMaxTime(queryStructUtils.getBeginEndTime(queryStructReq));
queryStatement.setEnableLimitWrapper(limitWrapper);
}
}
public QueryStatement convert(QueryTagReq queryTagReq,
SemanticSchemaResp semanticSchemaResp) throws Exception {
QueryStatement queryStatement = new QueryStatement();
// covert to QueryReqConverter
QueryStructReq queryStructReq = new QueryStructReq();
BeanUtils.copyProperties(queryTagReq, queryStructReq);
queryStructReq.setModelIds(queryTagReq.getModelIdSet());
if (!CollectionUtils.isEmpty(queryTagReq.getTagFilters())) {
queryStructReq.setDimensionFilters(queryTagReq.getTagFilters());
}
queryStructReq.setQueryType(QueryType.TAG);
QuerySqlReq querySqlReq = queryStructReq.convert();
convert(querySqlReq, semanticSchemaResp, queryStatement, queryStructReq);
QueryParam queryParam = new QueryParam();
convert(queryTagReq, queryParam);
queryStatement.setQueryParam(queryParam);
queryStatement.setDataSetId(queryTagReq.getDataSetId());
return queryStatement;
}
public void convert(QueryTagReq queryTagReq, QueryParam queryParam) {
BeanUtils.copyProperties(queryTagReq, queryParam);
queryParam.setOrders(queryTagReq.getOrders());
queryParam.setMetrics(queryTagReq.getMetrics());
queryParam.setGroups(queryTagReq.getGroups());
queryParam.setDimensionFilters(queryTagReq.getTagFilters());
queryParam.setQueryType(QueryType.TAG);
}
public void convert(QueryStructReq queryTagReq, QueryParam queryParam) {
BeanUtils.copyProperties(queryTagReq, queryParam);
queryParam.setOrders(queryTagReq.getOrders());
queryParam.setMetrics(queryTagReq.getMetrics());
queryParam.setGroups(queryTagReq.getGroups());
queryParam.setDimensionFilters(queryTagReq.getDimensionFilters());
queryParam.setQueryType(QueryType.TAG);
}
public static List<TagResp> filterByDataSet(List<TagResp> tagResps, DataSetResp dataSetResp) {
return tagResps.stream().filter(tagResp -> dataSetResp.getAllTags().contains(tagResp.getId())
|| dataSetResp.getAllIncludeAllModels().contains(tagResp.getModelId())).collect(Collectors.toList());
}
}

View File

@@ -221,11 +221,10 @@ public class BenchMarkDemoDataLoader {
viewReq.setDescription("包含cspider数据集相关标签和指标信息"); viewReq.setDescription("包含cspider数据集相关标签和指标信息");
viewReq.setAdmins(Lists.newArrayList("admin")); viewReq.setAdmins(Lists.newArrayList("admin"));
List<DataSetModelConfig> viewModelConfigs = Lists.newArrayList( List<DataSetModelConfig> viewModelConfigs = Lists.newArrayList(
new DataSetModelConfig(5L, Lists.newArrayList(8L), Lists.newArrayList(), Lists.newArrayList()), new DataSetModelConfig(5L, Lists.newArrayList(8L), Lists.newArrayList()),
new DataSetModelConfig(6L, Lists.newArrayList(9L, 10L), Lists.newArrayList(), Lists.newArrayList()), new DataSetModelConfig(6L, Lists.newArrayList(9L, 10L), Lists.newArrayList()),
new DataSetModelConfig(7L, Lists.newArrayList(11L, 12L), Lists.newArrayList(), Lists.newArrayList()), new DataSetModelConfig(7L, Lists.newArrayList(11L, 12L), Lists.newArrayList()),
new DataSetModelConfig(8L, Lists.newArrayList(13L, 14L), Lists.newArrayList(8L, 9L), new DataSetModelConfig(8L, Lists.newArrayList(13L, 14L), Lists.newArrayList(8L, 9L))
Lists.newArrayList())
); );
DataSetDetail viewDetail = new DataSetDetail(); DataSetDetail viewDetail = new DataSetDetail();
viewDetail.setDataSetModelConfigs(viewModelConfigs); viewDetail.setDataSetModelConfigs(viewModelConfigs);

View File

@@ -262,14 +262,10 @@ public class DuSQLDemoDataLoader {
viewReq.setDescription("DuSQL互联网企业数据源相关的指标和维度等"); viewReq.setDescription("DuSQL互联网企业数据源相关的指标和维度等");
viewReq.setAdmins(Lists.newArrayList("admin")); viewReq.setAdmins(Lists.newArrayList("admin"));
List<DataSetModelConfig> viewModelConfigs = Lists.newArrayList( List<DataSetModelConfig> viewModelConfigs = Lists.newArrayList(
new DataSetModelConfig(9L, Lists.newArrayList(16L, 17L, 18L, 19L, 20L), Lists.newArrayList(10L, 11L), new DataSetModelConfig(9L, Lists.newArrayList(16L, 17L, 18L, 19L, 20L), Lists.newArrayList(10L, 11L)),
Lists.newArrayList()), new DataSetModelConfig(10L, Lists.newArrayList(21L, 22L, 23L), Lists.newArrayList(12L)),
new DataSetModelConfig(10L, Lists.newArrayList(21L, 22L, 23L), Lists.newArrayList(12L), new DataSetModelConfig(11L, Lists.newArrayList(), Lists.newArrayList(13L, 14L, 15L)),
Lists.newArrayList()), new DataSetModelConfig(12L, Lists.newArrayList(24L), Lists.newArrayList(16L, 17L, 18L, 19L)));
new DataSetModelConfig(11L, Lists.newArrayList(), Lists.newArrayList(13L, 14L, 15L),
Lists.newArrayList()),
new DataSetModelConfig(12L, Lists.newArrayList(24L), Lists.newArrayList(16L, 17L, 18L, 19L),
Lists.newArrayList()));
DataSetDetail viewDetail = new DataSetDetail(); DataSetDetail viewDetail = new DataSetDetail();
viewDetail.setDataSetModelConfigs(viewModelConfigs); viewDetail.setDataSetModelConfigs(viewModelConfigs);

View File

@@ -513,9 +513,9 @@ public class ModelDemoDataLoader {
dataSetReq.setDescription("包含超音数访问统计相关的指标和维度等"); dataSetReq.setDescription("包含超音数访问统计相关的指标和维度等");
dataSetReq.setAdmins(Lists.newArrayList("admin")); dataSetReq.setAdmins(Lists.newArrayList("admin"));
List<DataSetModelConfig> dataSetModelConfigs = Lists.newArrayList( List<DataSetModelConfig> dataSetModelConfigs = Lists.newArrayList(
new DataSetModelConfig(1L, Lists.newArrayList(1L, 2L), Lists.newArrayList(), Lists.newArrayList()), new DataSetModelConfig(1L, Lists.newArrayList(1L, 2L), Lists.newArrayList()),
new DataSetModelConfig(2L, Lists.newArrayList(), Lists.newArrayList(1L, 2L, 3L), Lists.newArrayList()), new DataSetModelConfig(2L, Lists.newArrayList(), Lists.newArrayList(1L, 2L, 3L)),
new DataSetModelConfig(3L, Lists.newArrayList(3L), Lists.newArrayList(4L), Lists.newArrayList())); new DataSetModelConfig(3L, Lists.newArrayList(3L), Lists.newArrayList(4L)));
DataSetDetail dataSetDetail = new DataSetDetail(); DataSetDetail dataSetDetail = new DataSetDetail();
dataSetDetail.setDataSetModelConfigs(dataSetModelConfigs); dataSetDetail.setDataSetModelConfigs(dataSetModelConfigs);
@@ -540,8 +540,7 @@ public class ModelDemoDataLoader {
dataSetReq.setDescription("包含艺人相关标签和指标信息"); dataSetReq.setDescription("包含艺人相关标签和指标信息");
dataSetReq.setAdmins(Lists.newArrayList("admin", "jack")); dataSetReq.setAdmins(Lists.newArrayList("admin", "jack"));
List<DataSetModelConfig> dataSetModelConfigs = Lists.newArrayList( List<DataSetModelConfig> dataSetModelConfigs = Lists.newArrayList(
new DataSetModelConfig(4L, Lists.newArrayList(4L, 5L, 6L, 7L), new DataSetModelConfig(4L, Lists.newArrayList(4L, 5L, 6L, 7L), Lists.newArrayList(5L, 6L, 7L))
Lists.newArrayList(5L, 6L, 7L), Lists.newArrayList(1L, 2L, 3L, 4L))
); );
DataSetDetail dataSetDetail = new DataSetDetail(); DataSetDetail dataSetDetail = new DataSetDetail();
dataSetDetail.setDataSetModelConfigs(dataSetModelConfigs); dataSetDetail.setDataSetModelConfigs(dataSetModelConfigs);