From e171bdd97fcd4d29f32f697df7f3c940ebed5764 Mon Sep 17 00:00:00 2001 From: supersonicbi <15744192+supersonicbi@user.noreply.gitee.com> Date: Sat, 24 May 2025 09:26:31 +0800 Subject: [PATCH] (fix)(headless)Fix showType determination and date field setting in metric query. (fix)(headless)Fix showType determination and date field setting in metric query. --- .../supersonic/common/util/DateModeUtils.java | 2 +- .../chat/mapper/EmbeddingMatchStrategy.java | 4 +++- .../core/translator/parser/SqlQueryParser.java | 15 +++++++++++---- .../translator/parser/calcite/DataModelNode.java | 6 ++++-- .../server/service/impl/MetricServiceImpl.java | 9 +++++++++ .../headless/server/utils/QueryUtils.java | 5 +++-- 6 files changed, 31 insertions(+), 10 deletions(-) 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 541028459..706524975 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 @@ -318,7 +318,7 @@ public class DateModeUtils { } public String getDateWhereStr(DateConf dateInfo, ItemDateResp dateDate) { - if (Objects.isNull(dateInfo)) { + if (Objects.isNull(dateInfo) || Objects.isNull(dateInfo.getDateField())) { return ""; } String dateStr = ""; diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/EmbeddingMatchStrategy.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/EmbeddingMatchStrategy.java index ee6f8c51a..da06ed831 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/EmbeddingMatchStrategy.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/EmbeddingMatchStrategy.java @@ -167,7 +167,9 @@ public class EmbeddingMatchStrategy extends BatchMatchStrategy variable.put("retrievedInfo", JSONObject.toJSONString(results)); Prompt prompt = PromptTemplate.from(LLM_FILTER_PROMPT).apply(variable); - ChatLanguageModel chatLanguageModel = ModelProvider.getChatModel(chatQueryContext.getRequest().getChatAppConfig().get("REWRITE_MULTI_TURN").getChatModelConfig()); + ChatLanguageModel chatLanguageModel = + ModelProvider.getChatModel(chatQueryContext.getRequest().getChatAppConfig() + .get("REWRITE_MULTI_TURN").getChatModelConfig()); String response = chatLanguageModel.generate(prompt.toUserMessage().singleText()); if (StringUtils.isBlank(response)) { diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java index 04b89ee5e..cd8a95c1e 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/SqlQueryParser.java @@ -48,16 +48,23 @@ public class SqlQueryParser implements QueryParser { List queryFields = SqlSelectHelper.getAllSelectFields(sqlQuery.getSql()); Set queryAliases = SqlSelectHelper.getAliasFields(sqlQuery.getSql()); Set ontologyMetricsDimensions = Collections.synchronizedSet(new HashSet()); - Set ontologyBizNameMetricsDimensions = Collections.synchronizedSet(new HashSet()); + Set ontologyBizNameMetricsDimensions = Collections.synchronizedSet(new HashSet<>()); queryFields.removeAll(queryAliases); Ontology ontology = queryStatement.getOntology(); OntologyQuery ontologyQuery = buildOntologyQuery(ontology, queryFields); Set queryFieldsSet = new HashSet<>(queryFields); - ontologyQuery.getMetrics().forEach(m -> {ontologyMetricsDimensions.add(m.getName()); ontologyBizNameMetricsDimensions.add(m.getBizName());}); - ontologyQuery.getDimensions().forEach(d -> {ontologyMetricsDimensions.add(d.getName()); ontologyBizNameMetricsDimensions.add(d.getBizName());}); + ontologyQuery.getMetrics().forEach(m -> { + ontologyMetricsDimensions.add(m.getName()); + ontologyBizNameMetricsDimensions.add(m.getBizName()); + }); + ontologyQuery.getDimensions().forEach(d -> { + ontologyMetricsDimensions.add(d.getName()); + ontologyBizNameMetricsDimensions.add(d.getBizName()); + }); // check if there are fields not matched with any metric or dimension - if (!(queryFieldsSet.containsAll(ontologyMetricsDimensions)||queryFieldsSet.containsAll(ontologyBizNameMetricsDimensions))) { + if (!(queryFieldsSet.containsAll(ontologyMetricsDimensions) + || queryFieldsSet.containsAll(ontologyBizNameMetricsDimensions))) { List semanticFields = Lists.newArrayList(); ontologyQuery.getMetrics().forEach(m -> semanticFields.add(m.getName())); ontologyQuery.getDimensions().forEach(d -> semanticFields.add(d.getName())); diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java index f08bb3bf5..ff2d73f36 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/DataModelNode.java @@ -36,8 +36,10 @@ public class DataModelNode extends SemanticNode { && !dataModel.getModelDetail().getSqlQuery().isEmpty()) { sqlTable = dataModel.getModelDetail().getSqlQuery(); // if model has sqlVariables, parse sqlVariables - if (Objects.nonNull(dataModel.getModelDetail().getSqlVariables()) || (CollectionUtils.isEmpty(dataModel.getModelDetail().getSqlVariables()))) { - sqlTable = SqlVariableParseUtils.parse(sqlTable, dataModel.getModelDetail().getSqlVariables(), Lists.newArrayList()); + if (Objects.nonNull(dataModel.getModelDetail().getSqlVariables()) + || (CollectionUtils.isEmpty(dataModel.getModelDetail().getSqlVariables()))) { + sqlTable = SqlVariableParseUtils.parse(sqlTable, + dataModel.getModelDetail().getSqlVariables(), Lists.newArrayList()); } } else if (dataModel.getModelDetail().getTableQuery() != null && !dataModel.getModelDetail().getTableQuery().isEmpty()) { 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 af95bf1d2..a754380fc 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 @@ -711,6 +711,15 @@ public class MetricServiceImpl extends ServiceImpl } if (!modelCluster.isContainsPartitionDimensions()) { queryMetricReq.setDateInfo(null); + } else { + // set date field + DimensionResp partitionDimension = dimensionResps.stream() + .filter(entry -> modelCluster.getModelIds().contains(entry.getModelId())) + .filter(entry -> entry.getStatus().equals(StatusEnum.ONLINE.getCode())) + .filter(entry -> entry.isPartitionTime()).findFirst().orElse(null); + if (partitionDimension != null) { + queryMetricReq.getDateInfo().setDateField(partitionDimension.getName()); + } } // 4. set groups List dimensionNames = dimensionResps.stream() diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java index e98fa3146..75f3ca44f 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/utils/QueryUtils.java @@ -136,9 +136,10 @@ public class QueryUtils { return false; } return type.toLowerCase().endsWith("int") || type.toLowerCase().startsWith("int") - || type.equalsIgnoreCase("float") || type.equalsIgnoreCase("double") + || type.toLowerCase().endsWith("float") || type.toLowerCase().startsWith("float") + || type.toLowerCase().endsWith("double") || type.toLowerCase().startsWith("double") || type.equalsIgnoreCase("real") || type.equalsIgnoreCase("numeric") - || type.toLowerCase().startsWith("decimal") || type.equalsIgnoreCase("decfloat"); + || type.toLowerCase().startsWith("decimal"); } private String getName(String nameEn) {