diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java index 98f29e069..58b496521 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/utils/SqlGenerateUtils.java @@ -184,7 +184,7 @@ public class SqlGenerateUtils { return whereClauseFromFilter; } - private String getDateWhereClause(DateConf dateInfo, ItemDateResp dateDate) { + public String getDateWhereClause(DateConf dateInfo, ItemDateResp dateDate) { if (Objects.isNull(dateDate) || Strings.isEmpty(dateDate.getStartDate()) && Strings.isEmpty(dateDate.getEndDate())) { diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java index 8354c0626..cbaa4e4da 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/TagQueryServiceImpl.java @@ -1,23 +1,19 @@ package com.tencent.supersonic.headless.server.service.impl; -import static com.tencent.supersonic.common.pojo.Constants.DESC_UPPER; - import com.tencent.supersonic.auth.api.authentication.pojo.User; -import com.tencent.supersonic.common.pojo.Aggregator; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.pojo.Order; -import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum; +import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum; import com.tencent.supersonic.headless.api.pojo.Dim; import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.ValueDistribution; import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType; import com.tencent.supersonic.headless.api.pojo.request.ItemValueReq; import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq; -import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; import com.tencent.supersonic.headless.api.pojo.response.ItemValueResp; import com.tencent.supersonic.headless.api.pojo.response.ModelResp; import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp; import com.tencent.supersonic.headless.api.pojo.response.TagResp; +import com.tencent.supersonic.headless.core.utils.SqlGenerateUtils; import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.service.QueryService; import com.tencent.supersonic.headless.server.service.TagMetaService; @@ -25,7 +21,6 @@ import com.tencent.supersonic.headless.server.service.TagQueryService; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -48,12 +43,14 @@ public class TagQueryServiceImpl implements TagQueryService { private final TagMetaService tagMetaService; private final QueryService queryService; private final ModelService modelService; + private final SqlGenerateUtils sqlGenerateUtils; public TagQueryServiceImpl(TagMetaService tagMetaService, QueryService queryService, - ModelService modelService) { + ModelService modelService, SqlGenerateUtils sqlGenerateUtils) { this.tagMetaService = tagMetaService; this.queryService = queryService; this.modelService = modelService; + this.sqlGenerateUtils = sqlGenerateUtils; } @Override @@ -72,8 +69,8 @@ public class TagQueryServiceImpl implements TagQueryService { // tag total count Long totalCount = queryTagTotalCount(tag, itemValueReq, user); // tag value - QueryStructReq queryStructReq = generateReq(tag, itemValueReq); - SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryStructReq, user); + QuerySqlReq querySqlReq = generateReq(tag, itemValueReq); + SemanticQueryResp semanticQueryResp = queryService.queryByReq(querySqlReq, user); fillTagValueInfo(itemValueResp, semanticQueryResp, totalCount); return itemValueResp; } @@ -111,7 +108,7 @@ public class TagQueryServiceImpl implements TagQueryService { private String queryTagDateFromDbBySql(Dim dim, TagResp tag, User user) throws Exception { String sqlPattern = "select max(%s) as %s from tbl where %s is not null"; - String sql = String.format(sqlPattern, dim.getBizName(), maxDateAlias, tag.getBizName()); + String sql = String.format(sqlPattern, TimeDimensionEnum.DAY.getName(), maxDateAlias, tag.getBizName()); Set modelIds = new HashSet<>(); modelIds.add(tag.getModelId()); QuerySqlReq querySqlReq = new QuerySqlReq(); @@ -137,17 +134,17 @@ public class TagQueryServiceImpl implements TagQueryService { } private Long queryTagTotalCount(TagResp tag, ItemValueReq itemValueReq, User user) throws Exception { + String sqlPattern = "select count(1) as %s from tbl where %s is not null %s"; + String dateFilter = getDateFilter(itemValueReq); + String sql = String.format(sqlPattern, tagValueAlias, tag.getBizName(), dateFilter); + Set modelIds = new HashSet<>(); + modelIds.add(tag.getModelId()); + QuerySqlReq querySqlReq = new QuerySqlReq(); + querySqlReq.setSql(sql); + querySqlReq.setNeedAuth(false); + querySqlReq.setModelIds(modelIds); - QueryStructReq queryStructReq = new QueryStructReq(); - queryStructReq.addModelId(tag.getModelId()); - queryStructReq.setLimit(1L); - List aggregators = new ArrayList<>(); - aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias)); - queryStructReq.setAggregators(aggregators); - DateConf dateConf = generateDateConf(itemValueReq); - queryStructReq.setDateInfo(dateConf); - - SemanticQueryResp semanticQueryResp = queryService.queryByReq(queryStructReq, user); + SemanticQueryResp semanticQueryResp = queryService.queryByReq(querySqlReq, user); if (!CollectionUtils.isEmpty(semanticQueryResp.getResultList())) { Object total = semanticQueryResp.getResultList().get(0).get(tagValueAlias); if (Objects.nonNull(total)) { @@ -159,6 +156,14 @@ public class TagQueryServiceImpl implements TagQueryService { throw new RuntimeException("queryTagTotalCount error"); } + private String getDateFilter(ItemValueReq itemValueReq) { + if (Objects.isNull(itemValueReq.getDateConf())) { + return ""; + } + String dateWhereClause = sqlGenerateUtils.getDateWhereClause(itemValueReq.getDateConf(), null); + return " and " + dateWhereClause; + } + private void fillTagValueInfo(ItemValueResp itemValueResp, SemanticQueryResp semanticQueryResp, Long totalCount) { List valueDistributionList = new ArrayList<>(); List> resultList = semanticQueryResp.getResultList(); @@ -176,24 +181,19 @@ public class TagQueryServiceImpl implements TagQueryService { itemValueResp.setValueDistributionList(valueDistributionList); } - private QueryStructReq generateReq(TagResp tag, ItemValueReq itemValueReq) { - QueryStructReq queryStructReq = new QueryStructReq(); - queryStructReq.addModelId(tag.getModelId()); - queryStructReq.setGroups(new ArrayList<>(Arrays.asList(tag.getBizName()))); - queryStructReq.setLimit(itemValueReq.getLimit()); + private QuerySqlReq generateReq(TagResp tag, ItemValueReq itemValueReq) { + String sqlPattern = "select %s, count(1) as %s from tbl where %s is not null %s " + + "group by %s order by %s desc"; + String sql = String.format(sqlPattern, tag.getBizName(), tagValueAlias, tag.getBizName(), + getDateFilter(itemValueReq), tag.getBizName(), tag.getBizName()); - List aggregators = new ArrayList<>(); - aggregators.add(new Aggregator(tag.getBizName(), AggOperatorEnum.COUNT, tagValueAlias)); - queryStructReq.setAggregators(aggregators); - - List orders = new ArrayList<>(); - orders.add(new Order(String.format("count(%s)", tag.getBizName()), DESC_UPPER)); - queryStructReq.setOrders(orders); - - DateConf dateConf = generateDateConf(itemValueReq); - queryStructReq.setDateInfo(dateConf); - - return queryStructReq; + Set modelIds = new HashSet<>(); + modelIds.add(tag.getModelId()); + QuerySqlReq querySqlReq = new QuerySqlReq(); + querySqlReq.setSql(sql); + querySqlReq.setNeedAuth(false); + querySqlReq.setModelIds(modelIds); + return querySqlReq; } private DateConf generateDateConf(ItemValueReq itemValueReq) {