diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TimeDimensionEnum.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TimeDimensionEnum.java index fdd830559..b21071e59 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TimeDimensionEnum.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/TimeDimensionEnum.java @@ -1,7 +1,5 @@ package com.tencent.supersonic.common.pojo.enums; public enum TimeDimensionEnum { - DAY, - WEEK, - MONTH; + DAY, WEEK, MONTH; } diff --git a/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java b/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java index 447a17265..1cd84cfee 100644 --- a/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java +++ b/common/src/main/java/com/tencent/supersonic/common/util/DateModeUtils.java @@ -126,19 +126,20 @@ public class DateModeUtils { return ImmutablePair.of(start, dateDate.getEndDate()); } - public String recentMonthStr(LocalDate endData, Long unit, String dateFormatStr, DateConf dateInfo) { + public String recentMonthStr(LocalDate endData, Long unit, String dateFormatStr, + DateConf dateInfo) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormatStr); String endStr = endData.format(formatter); String start = endData.minusMonths(unit).format(formatter); - return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), start, dateInfo.getDateField(), - endStr); + return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), start, + dateInfo.getDateField(), endStr); } public String recentMonthStr(ItemDateResp dateDate, DateConf dateInfo) { List> range = recentMonth(dateDate, dateInfo); if (range.size() == 1) { - return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), range.get(0).left, - dateInfo.getDateField(), range.get(0).right); + return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), + range.get(0).left, dateInfo.getDateField(), range.get(0).right); } if (range.size() > 0) { StringJoiner joiner = new StringJoiner(","); @@ -176,8 +177,8 @@ public class DateModeUtils { public String recentWeekStr(LocalDate endData, Long unit, DateConf dataInfo) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DAY_FORMAT); String start = endData.minusDays(unit * 7).format(formatter); - return String.format("(%s >= '%s' and %s <= '%s')", dataInfo.getDateField(), start, dataInfo.getDateField(), - endData.format(formatter)); + return String.format("(%s >= '%s' and %s <= '%s')", dataInfo.getDateField(), start, + dataInfo.getDateField(), endData.format(formatter)); } public String recentWeekStr(ItemDateResp dateDate, DateConf dateInfo) { diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/LLMResponseService.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/LLMResponseService.java index 59b1d8560..c669e7139 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/LLMResponseService.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/LLMResponseService.java @@ -2,7 +2,10 @@ package com.tencent.supersonic.headless.chat.parser.llm; import com.tencent.supersonic.common.jsqlparser.SqlValidHelper; import com.tencent.supersonic.common.pojo.Constants; +import com.tencent.supersonic.common.pojo.DateConf; import com.tencent.supersonic.common.pojo.Text2SQLExemplar; +import com.tencent.supersonic.headless.api.pojo.DataSetSchema; +import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.chat.ChatQueryContext; import com.tencent.supersonic.headless.chat.query.QueryManager; @@ -50,6 +53,15 @@ public class LLMResponseService { parseInfo.setQueryMode(semanticQuery.getQueryMode()); parseInfo.getSqlInfo().setParsedS2SQL(s2SQL); parseInfo.getSqlInfo().setCorrectedS2SQL(s2SQL); + + DataSetSchema dataSetSchema = + queryCtx.getSemanticSchema().getDataSetSchemaMap().get(parseInfo.getDataSetId()); + SchemaElement partitionDimension = dataSetSchema.getPartitionDimension(); + if (Objects.nonNull(partitionDimension)) { + DateConf dateConf = new DateConf(); + dateConf.setDateField(partitionDimension.getName()); + parseInfo.setDateInfo(dateConf); + } queryCtx.getCandidateQueries().add(semanticQuery); } diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java index 750c3ba72..09ca0c58f 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/parser/llm/PromptHelper.java @@ -100,6 +100,8 @@ public class PromptHelper { } if (StringUtils.isNotEmpty(metric.getDefaultAgg())) { metricStr.append(" AGGREGATE '" + metric.getDefaultAgg().toUpperCase() + "'"); + } else { + metricStr.append(" AGGREGATE 'NONE'"); } metricStr.append(">"); metrics.add(metricStr.toString()); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/converter/DefaultDimValueConverter.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/converter/DefaultDimValueConverter.java index 04277ea11..f243def40 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/converter/DefaultDimValueConverter.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/converter/DefaultDimValueConverter.java @@ -40,8 +40,8 @@ public class DefaultDimValueConverter implements QueryConverter { return; } String sql = queryStatement.getSqlQueryParam().getSql(); - List whereFields = SqlSelectHelper.getWhereFields(sql).stream() - .collect(Collectors.toList()); + List whereFields = + SqlSelectHelper.getWhereFields(sql).stream().collect(Collectors.toList()); if (!CollectionUtils.isEmpty(whereFields)) { return; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java index bdd02d556..bf84d2577 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/MetricServiceImpl.java @@ -8,23 +8,58 @@ import com.github.pagehelper.PageInfo; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.tencent.supersonic.common.jsqlparser.SqlSelectFunctionHelper; -import com.tencent.supersonic.common.pojo.*; -import com.tencent.supersonic.common.pojo.enums.*; +import com.tencent.supersonic.common.pojo.Aggregator; +import com.tencent.supersonic.common.pojo.DataEvent; +import com.tencent.supersonic.common.pojo.DataItem; +import com.tencent.supersonic.common.pojo.DateConf; +import com.tencent.supersonic.common.pojo.Filter; +import com.tencent.supersonic.common.pojo.User; +import com.tencent.supersonic.common.pojo.enums.AuthType; +import com.tencent.supersonic.common.pojo.enums.EventType; +import com.tencent.supersonic.common.pojo.enums.QueryType; +import com.tencent.supersonic.common.pojo.enums.StatusEnum; +import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.common.util.BeanMapper; -import com.tencent.supersonic.headless.api.pojo.*; +import com.tencent.supersonic.headless.api.pojo.DrillDownDimension; +import com.tencent.supersonic.headless.api.pojo.Measure; +import com.tencent.supersonic.headless.api.pojo.MeasureParam; +import com.tencent.supersonic.headless.api.pojo.MetaFilter; +import com.tencent.supersonic.headless.api.pojo.MetricParam; +import com.tencent.supersonic.headless.api.pojo.MetricQueryDefaultConfig; +import com.tencent.supersonic.headless.api.pojo.SchemaElementMatch; +import com.tencent.supersonic.headless.api.pojo.SchemaElementType; +import com.tencent.supersonic.headless.api.pojo.SchemaItem; import com.tencent.supersonic.headless.api.pojo.enums.MapModeEnum; import com.tencent.supersonic.headless.api.pojo.enums.MetricDefineType; -import com.tencent.supersonic.headless.api.pojo.request.*; -import com.tencent.supersonic.headless.api.pojo.response.*; +import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq; +import com.tencent.supersonic.headless.api.pojo.request.MetricBaseReq; +import com.tencent.supersonic.headless.api.pojo.request.MetricReq; +import com.tencent.supersonic.headless.api.pojo.request.PageMetricReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryMetricReq; +import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq; +import com.tencent.supersonic.headless.api.pojo.response.DataSetMapInfo; +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.MapInfoResp; +import com.tencent.supersonic.headless.api.pojo.response.MetricResp; +import com.tencent.supersonic.headless.api.pojo.response.ModelResp; import com.tencent.supersonic.headless.server.facade.service.ChatLayerService; import com.tencent.supersonic.headless.server.persistence.dataobject.CollectDO; import com.tencent.supersonic.headless.server.persistence.dataobject.MetricDO; import com.tencent.supersonic.headless.server.persistence.dataobject.MetricQueryDefaultConfigDO; import com.tencent.supersonic.headless.server.persistence.mapper.MetricDOMapper; import com.tencent.supersonic.headless.server.persistence.repository.MetricRepository; -import com.tencent.supersonic.headless.server.pojo.*; -import com.tencent.supersonic.headless.server.service.*; +import com.tencent.supersonic.headless.server.pojo.DimensionsFilter; +import com.tencent.supersonic.headless.server.pojo.MetricFilter; +import com.tencent.supersonic.headless.server.pojo.MetricsFilter; +import com.tencent.supersonic.headless.server.pojo.ModelCluster; +import com.tencent.supersonic.headless.server.pojo.ModelFilter; +import com.tencent.supersonic.headless.server.service.CollectService; +import com.tencent.supersonic.headless.server.service.DataSetService; +import com.tencent.supersonic.headless.server.service.DimensionService; +import com.tencent.supersonic.headless.server.service.MetricService; +import com.tencent.supersonic.headless.server.service.ModelService; import com.tencent.supersonic.headless.server.utils.AliasGenerateHelper; import com.tencent.supersonic.headless.server.utils.MetricCheckUtils; import com.tencent.supersonic.headless.server.utils.MetricConverter; @@ -37,7 +72,18 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; @Service @@ -656,38 +702,24 @@ public class MetricServiceImpl extends ServiceImpl && !metricResp.getDefaultAgg().isEmpty())) { return metricResp.getDefaultAgg(); } - // FIELD define will get from expr - if (MetricDefineType.FIELD.equals(metricResp.getMetricDefineType())) { - return SqlSelectFunctionHelper.getFirstAggregateFunctions(metricResp.getExpr()); - } - // METRIC define will get from first metric - if (MetricDefineType.METRIC.equals(metricResp.getMetricDefineType())) { - if (!CollectionUtils.isEmpty(metricResp.getMetricDefineByMetricParams().getMetrics())) { - MetricParam metricParam = - metricResp.getMetricDefineByMetricParams().getMetrics().get(0); - MetricResp firstMetricResp = - getMetric(modelResp.getDomainId(), metricParam.getBizName()); - if (Objects.nonNull(firstMetricResp)) { - return getDefaultAgg(firstMetricResp, modelResp); - } - return ""; - } - } // Measure define will get from first measure - List measures = modelResp.getModelDetail().getMeasures(); - List measureParams = - metricResp.getMetricDefineByMeasureParams().getMeasures(); - if (CollectionUtils.isEmpty(measureParams)) { - return ""; - } - MeasureParam firstMeasure = measureParams.get(0); + if (MetricDefineType.MEASURE.equals(metricResp.getMetricDefineType())) { + List measures = modelResp.getModelDetail().getMeasures(); + List measureParams = + metricResp.getMetricDefineByMeasureParams().getMeasures(); + if (CollectionUtils.isEmpty(measureParams)) { + return null; + } + MeasureParam firstMeasure = measureParams.get(0); - for (Measure measure : measures) { - if (measure.getBizName().equalsIgnoreCase(firstMeasure.getBizName())) { - return measure.getAgg(); + for (Measure measure : measures) { + if (measure.getBizName().equalsIgnoreCase(firstMeasure.getBizName())) { + return measure.getAgg(); + } } } - return ""; + + return null; } @Override diff --git a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java index 385165245..b1fd94bbb 100644 --- a/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java +++ b/launchers/standalone/src/test/java/com/tencent/supersonic/chat/MetricTest.java @@ -39,6 +39,7 @@ public class MetricTest extends BaseTest { } @Test + @SetSystemProperty(key = "s2.test", value = "true") public void testMetricModel() throws Exception { QueryResult actualResult = submitNewChat("超音数 访问次数", agent.getId()); @@ -56,6 +57,7 @@ public class MetricTest extends BaseTest { assertQueryResult(expectedResult, actualResult); assert actualResult.getQueryResults().size() == 1; + assert actualResult.getQuerySql().contains("s2_pv_uv_statis"); } @Test