15 Commits

Author SHA1 Message Date
QJ_wonder
2f4f2027a5 Merge fa65b6eff7 into 47c2595fb8 2025-07-10 10:13:55 +08:00
Willy-J
47c2595fb8 (fix)(headless) preserve model join order by using LinkedHashSet in probeRelatedModels (#2299)
Some checks failed
supersonic CentOS CI / build (21) (push) Has been cancelled
supersonic mac CI / build (21) (push) Has been cancelled
supersonic ubuntu CI / build (21) (push) Has been cancelled
supersonic windows CI / build (21) (push) Has been cancelled
2025-07-09 17:22:44 +08:00
wangyong
9bddd4457e fixed bug 2281 (#2309) 2025-07-09 17:22:04 +08:00
wangyong
55ac3d1aa5 (fix)(headless-server)sqlExecuteReq.getSql() 兼容sql前后有换行符CASE,导致sql语句结尾";"无法被正确删除 (#2327) 2025-07-09 17:21:33 +08:00
andybj0228
0427917624 (fix)(headless) DictUtils.constructQuerySqlReq针对sql query增加别名 (#2320) 2025-07-09 17:21:16 +08:00
木鱼和尚
d8fe2ed2b3 Dimension and metric retrieval and percentage display issue fixes (#2301) 2025-07-09 17:20:49 +08:00
FredTsang
11d1264d38 (fix)(chat-sdk): Export data based on queryColumns (#2297) 2025-07-09 17:19:16 +08:00
FredTsang
32675387d7 (fix)(chat-sdk) rm table defaultSortOrder (#2295) 2025-07-09 17:18:45 +08:00
mroldx
e408204690 Update sql-update-mysql.sql (#2293) 2025-07-09 17:18:08 +08:00
QJ_wonder
fa65b6eff7 Update NL2PluginParser.java 去除多数据集条件判断 2025-05-28 15:47:58 +08:00
QJ_wonder
0ab44c0866 Merge branch 'tencentmusic:master' into master_fixplugin 2025-05-27 14:54:49 +08:00
QJ_wonder
449fdf180f (fix)(chat)多个数据集也只保留召回的第一个结果
这里的多数据集其实对召回的结果没有影响,取第一个就好了
2025-05-27 14:42:34 +08:00
QJ_wonder
d275a145d5 Update WebServiceQuery.java 2025-05-27 14:07:32 +08:00
QJ_wonder
c8f690c1c2 (fix)(chat) 修改判断是否需要NL2SQL的条件判断
修改判断是否需要NL2SQL的条件判断,如果respone里已经有返回体,则不需要NL2SQL的执行,直接返回。避免插件返回体被NL2SQL返回体覆盖的问题
2025-05-27 13:39:48 +08:00
QJ_wonder
38af6e3a28 (fix)(chat) 修复插件调用问题
修复插件调用问题,将原有的Json解析替换成fastjson的json解析,并按String解析返回体,否则会报:Error while extracting response for type [class java.lang.Object] and content type [application/xml;charset=UTF-8]
2025-05-27 13:34:34 +08:00
13 changed files with 47 additions and 26 deletions

View File

@@ -88,10 +88,10 @@ public class WebServiceQuery extends PluginSemanticQuery {
restTemplate = ContextUtils.getBean(RestTemplate.class);
try {
responseEntity =
restTemplate.exchange(requestUrl, HttpMethod.POST, entity, Object.class);
restTemplate.exchange(requestUrl, HttpMethod.POST, entity, String.class);
objectResponse = responseEntity.getBody();
log.info("objectResponse:{}", objectResponse);
Map<String, Object> response = JsonUtil.objectToMap(objectResponse);
Map<String, Object> response = JSON.parseObject(objectResponse.toString());
webServiceResponse.setResult(response);
} catch (Exception e) {
log.info("Exception:{}", e.getMessage());

View File

@@ -19,7 +19,7 @@ public class ParseContext {
}
public boolean enableNL2SQL() {
return Objects.nonNull(agent) && agent.containsDatasetTool();
return Objects.nonNull(agent) && agent.containsDatasetTool()&&response.getSelectedParses().size() == 0;
}
public boolean enableLLM() {

View File

@@ -23,9 +23,11 @@ public class SqlExecuteReq {
private Integer limit = 1000;
public String getSql() {
if (StringUtils.isNotBlank(sql) && sql.endsWith(";")) {
sql = sql.substring(0, sql.length() - 1);
if(StringUtils.isNotBlank(sql)){
sql=sql.replaceAll("^[\\n]+|[\\n]+$", "");
sql=StringUtils.removeEnd(sql,";");
}
return String.format(LIMIT_WRAPPER, sql, limit);
}
}

View File

@@ -129,7 +129,7 @@ public abstract class BaseMapper implements SchemaMapper {
Map<MatchText, List<T>> matchResult = matchStrategy.match(chatQueryContext, terms,
chatQueryContext.getRequest().getDataSetIds());
List<T> matches = new ArrayList<>();
if (Objects.isNull(matchResult)) {
if (Objects.isNull(matchResult) || matchResult.isEmpty()) {
return matches;
}
Optional<List<T>> first = matchResult.entrySet().stream()

View File

@@ -88,7 +88,7 @@ public class SqlBuilder {
GraphPath<String, DefaultEdge> selectedGraphPath = null;
for (String fromModel : queryModels) {
for (String toModel : queryModels) {
if (fromModel != toModel) {
if (!fromModel.equals(toModel)) {
GraphPath<String, DefaultEdge> path = dijkstraAlg.getPath(fromModel, toModel);
if (isGraphPathContainsAll(path, queryModels)) {
selectedGraphPath = path;
@@ -100,13 +100,13 @@ public class SqlBuilder {
if (selectedGraphPath == null) {
return dataModels;
}
Set<String> modelNames = Sets.newHashSet();
Set<String> modelNames = Sets.newLinkedHashSet();
for (DefaultEdge edge : selectedGraphPath.getEdgeList()) {
modelNames.add(selectedGraphPath.getGraph().getEdgeSource(edge));
modelNames.add(selectedGraphPath.getGraph().getEdgeTarget(edge));
}
return modelNames.stream().map(m -> ontology.getModelMap().get(m))
.collect(Collectors.toSet());
.collect(Collectors.toCollection(LinkedHashSet::new));
}
private boolean isGraphPathContainsAll(GraphPath<String, DefaultEdge> graphPath,

View File

@@ -109,9 +109,14 @@ public class MetricRepositoryImpl implements MetricRepository {
}
if (StringUtils.isNotBlank(metricFilter.getKey())) {
String key = metricFilter.getKey();
queryWrapper.lambda().like(MetricDO::getName, key).or().like(MetricDO::getBizName, key)
.or().like(MetricDO::getDescription, key).or().like(MetricDO::getAlias, key)
.or().like(MetricDO::getCreatedBy, key);
queryWrapper.lambda()
.and(wrapper -> wrapper
.like(MetricDO::getName, key)
.or().like(MetricDO::getBizName, key)
.or().like(MetricDO::getDescription, key)
.or().like(MetricDO::getAlias, key)
.or().like(MetricDO::getCreatedBy, key)
);
}
return metricDOMapper.selectList(queryWrapper);

View File

@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
@@ -50,10 +51,8 @@ public class DataSetController {
@GetMapping("/getDataSetList")
public List<DataSetResp> getDataSetList(@RequestParam("domainId") Long domainId) {
MetaFilter metaFilter = new MetaFilter();
metaFilter.setDomainId(domainId);
metaFilter.setStatus(StatusEnum.ONLINE.getCode());
return dataSetService.getDataSetList(metaFilter);
List<Integer> statuCodeList = Arrays.asList(StatusEnum.ONLINE.getCode(),StatusEnum.OFFLINE.getCode());
return dataSetService.getDataSetList(domainId,statuCodeList);
}
@DeleteMapping("/{id}")

View File

@@ -20,6 +20,8 @@ public interface DataSetService {
List<DataSetResp> getDataSetList(MetaFilter metaFilter);
List<DataSetResp> getDataSetList(Long domainId ,List<Integer> statuCodesList);
void delete(Long id, User user);
Map<Long, List<Long>> getModelIdToDataSetIds(List<Long> dataSetIds, User user);

View File

@@ -102,6 +102,20 @@ public class DataSetServiceImpl extends ServiceImpl<DataSetDOMapper, DataSetDO>
return list(wrapper).stream().map(this::convert).collect(Collectors.toList());
}
@Override
public List<DataSetResp> getDataSetList(Long domainId, List<Integer> statuCodesList) {
if(domainId==null || CollectionUtils.isEmpty(statuCodesList)){
return List.of();
}
QueryWrapper<DataSetDO> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(DataSetDO::getDomainId, domainId);
wrapper.lambda().in(DataSetDO::getStatus, statuCodesList);
wrapper.lambda().ne(DataSetDO::getStatus, StatusEnum.DELETED.getCode());
return list(wrapper).stream().map(this::convert).collect(Collectors.toList());
}
@Override
public void delete(Long id, User user) {
DataSetDO dataSetDO = getById(id);

View File

@@ -277,7 +277,7 @@ public class DictUtils {
ModelResp model = modelService.getModel(dictItemResp.getModelId());
String tableStr = StringUtils.isNotBlank(model.getModelDetail().getTableQuery())
? model.getModelDetail().getTableQuery()
: "(" + model.getModelDetail().getSqlQuery() + ")";
: "(" + model.getModelDetail().getSqlQuery() + ") AS t";
String sqlPattern =
"select %s,count(1) from %s %s group by %s order by count(1) desc limit %d";
String dimBizName = dictItemResp.getBizName();

View File

@@ -420,4 +420,4 @@ ALTER TABLE s2_chat_model add column is_open tinyint DEFAULT NULL COMMENT '是
ALTER TABLE s2_database add column is_open tinyint DEFAULT NULL COMMENT '是否公开';
--20250321
ALTER TABLE s2_user add column last_loin datetime DEFAULT NULL;
ALTER TABLE s2_user add column last_login datetime DEFAULT NULL;

View File

@@ -416,11 +416,10 @@ const ChatItem: React.FC<Props> = ({
const onExportData = () => {
const { queryColumns, queryResults } = data || {};
if (!!queryResults) {
if (!!queryResults && !!queryColumns) {
const exportData = queryResults.map(item => {
return Object.keys(item).reduce((result, key) => {
const columnName = queryColumns?.find(column => column.nameEn === key)?.name || key;
result[columnName] = item[key];
return queryColumns.reduce((result, column) => {
result[column.name || column.nameEn] = item[column.nameEn];
return result;
}, {});
});

View File

@@ -24,7 +24,6 @@ const Table: React.FC<Props> = ({ data, size, loading, question, onApplyAuth })
dataIndex: bizName,
key: bizName,
title: name || bizName,
defaultSortOrder: 'descend',
sorter:
showType === 'NUMBER'
? (a, b) => {
@@ -43,8 +42,8 @@ const Table: React.FC<Props> = ({ data, size, loading, question, onApplyAuth })
{`${
value
? formatByDataFormatType(value, dataFormatType, dataFormat)
: 0
}%`}
: '0%'
}`}
</div>
);
}
@@ -73,10 +72,11 @@ const Table: React.FC<Props> = ({ data, size, loading, question, onApplyAuth })
return index % 2 !== 0 ? `${prefixCls}-even-row` : '';
};
const dateColumn = queryColumns.find(column => column.type === 'DATE');
const dateColumn = queryColumns.find(column => column.type === 'DATE' || column.showType === 'DATE');
const dataSource = dateColumn
? queryResults.sort((a, b) => moment(a[dateColumn.bizName]).diff(moment(b[dateColumn.bizName])))
: queryResults;
return (
<div className={prefixCls}>
{question && (