diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/DataInterpretProcessor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/DataInterpretProcessor.java index ae7334985..1c3cb6f01 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/DataInterpretProcessor.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/execute/DataInterpretProcessor.java @@ -46,7 +46,8 @@ public class DataInterpretProcessor implements ExecuteResultProcessor { public boolean accept(ExecuteContext executeContext) { Agent agent = executeContext.getAgent(); ChatApp chatApp = agent.getChatAppConfig().get(APP_KEY); - return Objects.nonNull(chatApp) && chatApp.isEnable(); + return Objects.nonNull(chatApp) && chatApp.isEnable()&& + StringUtils.isNotBlank(executeContext.getResponse().getTextResult()); // 如果都没结果,则无法处理,直接跳过 } @Override diff --git a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/EngineType.java b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/EngineType.java index ac91bfac9..1ecb3ae90 100644 --- a/common/src/main/java/com/tencent/supersonic/common/pojo/enums/EngineType.java +++ b/common/src/main/java/com/tencent/supersonic/common/pojo/enums/EngineType.java @@ -13,7 +13,8 @@ public enum EngineType { STARROCKS(10, "STARROCKS"), KYUUBI(11, "KYUUBI"), PRESTO(12, "PRESTO"), - TRINO(13, "TRINO"),; + TRINO(13, "TRINO"), + ORACLE(14, "ORACLE"); private Integer code; 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/knowledge/helper/NatureHelper.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/knowledge/helper/NatureHelper.java index 3271520e3..4c276aa37 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/knowledge/helper/NatureHelper.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/knowledge/helper/NatureHelper.java @@ -179,13 +179,15 @@ public class NatureHelper { } public static Long parseIdFromNature(String nature, int index) { - try { - String[] split = nature.split(DictWordType.NATURE_SPILT); - if (split.length > index) { - return Long.valueOf(split[index]); + if(nature.startsWith("_")){ // 框架的字典都是以_开头的 + try { + String[] split = nature.split(DictWordType.NATURE_SPILT); + if (split.length > index) { + return Long.valueOf(split[index]); + } + } catch (NumberFormatException e) { + log.error("Error parsing long from nature: {}", nature, e); } - } catch (NumberFormatException e) { - log.error("Error parsing long from nature: {}", nature, e); } return null; } 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/adaptor/db/DbAdaptorFactory.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DbAdaptorFactory.java index 909c64fb1..cf6351fd8 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DbAdaptorFactory.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/DbAdaptorFactory.java @@ -22,6 +22,7 @@ public class DbAdaptorFactory { dbAdaptorMap.put(EngineType.KYUUBI.getName(), new KyuubiAdaptor()); dbAdaptorMap.put(EngineType.PRESTO.getName(), new PrestoAdaptor()); dbAdaptorMap.put(EngineType.TRINO.getName(), new TrinoAdaptor()); + dbAdaptorMap.put(EngineType.ORACLE.getName(), new OracleAdaptor()); } public static DbAdaptor getEngineAdaptor(String engineType) { diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/OracleAdaptor.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/OracleAdaptor.java new file mode 100644 index 000000000..2e0590a4e --- /dev/null +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/adaptor/db/OracleAdaptor.java @@ -0,0 +1,5 @@ +package com.tencent.supersonic.headless.core.adaptor.db; + +public class OracleAdaptor extends DefaultDbAdaptor { + +} 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) { diff --git a/webapp/packages/chat-sdk/src/components/ChatItem/index.tsx b/webapp/packages/chat-sdk/src/components/ChatItem/index.tsx index a04120940..71c407659 100644 --- a/webapp/packages/chat-sdk/src/components/ChatItem/index.tsx +++ b/webapp/packages/chat-sdk/src/components/ChatItem/index.tsx @@ -102,7 +102,6 @@ const ChatItem: React.FC = ({ {} ); const [isParserError, setIsParseError] = useState(false); - const resetState = () => { setParseLoading(false); setParseTimeCost(undefined); @@ -441,6 +440,8 @@ const ChatItem: React.FC = ({ const { register, call } = useMethodRegister(() => message.error('该条消息暂不支持该操作')); + let actualQueryText=parseInfo?.properties.CONTEXT.queryText // lance修改 结果显示多轮对话转义的内容 + actualQueryText=actualQueryText==null?msg:actualQueryText return (
@@ -509,7 +510,7 @@ const ChatItem: React.FC = ({ = ({ = ({ dateInfo: { ...chatContext.dateInfo, dateMode: dateModeValue, - unit: currentDateOption || chatContext.dateInfo.unit, + unit: currentDateOption || chatContext.dateInfo?.unit, }, dimensions: [ ...(chatContext.dimensions || []), @@ -310,7 +310,7 @@ const ChatMsg: React.FC = ({ dateInfo: { ...chatContext.dateInfo, dateMode: dateModeValue, - unit: currentDateOption || chatContext.dateInfo.unit, + unit: currentDateOption || chatContext.dateInfo?.unit, }, dimensions: drillDownDimension ? [...(chatContext.dimensions || []), drillDownDimension]