1 Commits

Author SHA1 Message Date
beat4ocean
52a8cf8506 Merge 82c188c17a into 1c85bcecc5 2025-03-17 00:53:45 +00:00
8 changed files with 52 additions and 62 deletions

View File

@@ -195,14 +195,12 @@ public class MemoryServiceImpl implements MemoryService, CommandLineRunner {
public void run(String... args) { // 优化,启动时检查,向量数据,将记忆放到向量数据库 public void run(String... args) { // 优化,启动时检查,向量数据,将记忆放到向量数据库
loadSysExemplars(); loadSysExemplars();
} }
public void loadSysExemplars() { public void loadSysExemplars() {
try { try {
List<ChatMemory> memories = this List<ChatMemory> memories =
.getMemories(ChatMemoryFilter.builder().status(MemoryStatus.ENABLED).build()); this.getMemories(ChatMemoryFilter.builder().status(MemoryStatus.ENABLED).build());
for(ChatMemory memory:memories){ for(ChatMemory memory:memories){
exemplarService.storeExemplar( exemplarService.storeExemplar(embeddingConfig.getMemoryCollectionName(memory.getAgentId()),
embeddingConfig.getMemoryCollectionName(memory.getAgentId()),
Text2SQLExemplar.builder().question(memory.getQuestion()) Text2SQLExemplar.builder().question(memory.getQuestion())
.sideInfo(memory.getSideInfo()).dbSchema(memory.getDbSchema()) .sideInfo(memory.getSideInfo()).dbSchema(memory.getDbSchema())
.sql(memory.getS2sql()).build()); .sql(memory.getS2sql()).build());

View File

@@ -3,12 +3,10 @@ package com.tencent.supersonic.headless.api.pojo;
import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.headless.api.pojo.enums.DimensionType; import com.tencent.supersonic.headless.api.pojo.enums.DimensionType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class Dimension { public class Dimension {

View File

@@ -75,9 +75,7 @@ public class KeywordMapper extends BaseMapper {
continue; continue;
} }
Long elementID = NatureHelper.getElementID(nature); Long elementID = NatureHelper.getElementID(nature);
if (elementID == null) { if (elementID == null)continue; // 判空优化
continue;
}
SchemaElement element = getSchemaElement(dataSetId, elementType, elementID, SchemaElement element = getSchemaElement(dataSetId, elementType, elementID,
chatQueryContext.getSemanticSchema()); chatQueryContext.getSemanticSchema());
if (Objects.isNull(element)) { if (Objects.isNull(element)) {

View File

@@ -3,11 +3,13 @@ package com.tencent.supersonic.headless.server.service;
import com.tencent.supersonic.common.pojo.ItemDateResp; import com.tencent.supersonic.common.pojo.ItemDateResp;
import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.headless.api.pojo.Dimension;
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter; import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
import com.tencent.supersonic.headless.api.pojo.MetaFilter; import com.tencent.supersonic.headless.api.pojo.MetaFilter;
import com.tencent.supersonic.headless.api.pojo.ModelSchema; import com.tencent.supersonic.headless.api.pojo.ModelSchema;
import com.tencent.supersonic.headless.api.pojo.request.*; import com.tencent.supersonic.headless.api.pojo.request.FieldRemovedReq;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelReq;
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp; import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp; import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
import com.tencent.supersonic.headless.api.pojo.response.UnAvailableItemResp; import com.tencent.supersonic.headless.api.pojo.response.UnAvailableItemResp;
@@ -52,6 +54,4 @@ public interface ModelService {
DatabaseResp getDatabaseByModelId(Long modelId); DatabaseResp getDatabaseByModelId(Long modelId);
void batchUpdateStatus(MetaBatchReq metaBatchReq, User user); void batchUpdateStatus(MetaBatchReq metaBatchReq, User user);
Dimension updateDimension(DimensionReq dimensionReq, User user);
} }

View File

@@ -84,10 +84,6 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
DimensionDO dimensionDO = DimensionConverter.convert2DimensionDO(dimensionReq); DimensionDO dimensionDO = DimensionConverter.convert2DimensionDO(dimensionReq);
dimensionRepository.createDimension(dimensionDO); dimensionRepository.createDimension(dimensionDO);
sendEventBatch(Lists.newArrayList(dimensionDO), EventType.ADD); sendEventBatch(Lists.newArrayList(dimensionDO), EventType.ADD);
// should update modelDetail
modelService.updateDimension(dimensionReq, user);
return DimensionConverter.convert2DimensionResp(dimensionDO); return DimensionConverter.convert2DimensionResp(dimensionDO);
} }
@@ -140,9 +136,6 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
String oldName = dimensionDO.getName(); String oldName = dimensionDO.getName();
DimensionConverter.convert(dimensionDO, dimensionReq); DimensionConverter.convert(dimensionDO, dimensionReq);
dimensionRepository.updateDimension(dimensionDO); dimensionRepository.updateDimension(dimensionDO);
// should update modelDetail as well
modelService.updateDimension(dimensionReq, user);
if (!oldName.equals(dimensionDO.getName())) { if (!oldName.equals(dimensionDO.getName())) {
sendEvent(getDataItem(dimensionDO), EventType.UPDATE); sendEvent(getDataItem(dimensionDO), EventType.UPDATE);
} }

View File

@@ -2,24 +2,52 @@ package com.tencent.supersonic.headless.server.service.impl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.auth.api.authentication.service.UserService;
import com.tencent.supersonic.common.pojo.*; import com.tencent.supersonic.common.pojo.DataEvent;
import com.tencent.supersonic.common.pojo.DataItem;
import com.tencent.supersonic.common.pojo.ItemDateResp;
import com.tencent.supersonic.common.pojo.ModelRela;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AuthType; import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.common.pojo.enums.EventType; import com.tencent.supersonic.common.pojo.enums.EventType;
import com.tencent.supersonic.common.pojo.enums.StatusEnum; import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.pojo.enums.TypeEnums; import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException; import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.*; import com.tencent.supersonic.headless.api.pojo.DBColumn;
import com.tencent.supersonic.headless.api.pojo.enums.DimensionType; import com.tencent.supersonic.headless.api.pojo.DbSchema;
import com.tencent.supersonic.headless.api.pojo.request.*; import com.tencent.supersonic.headless.api.pojo.Dimension;
import com.tencent.supersonic.headless.api.pojo.response.*; import com.tencent.supersonic.headless.api.pojo.Identify;
import com.tencent.supersonic.headless.api.pojo.ItemDateFilter;
import com.tencent.supersonic.headless.api.pojo.Measure;
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
import com.tencent.supersonic.headless.api.pojo.ModelSchema;
import com.tencent.supersonic.headless.api.pojo.request.DateInfoReq;
import com.tencent.supersonic.headless.api.pojo.request.DimensionReq;
import com.tencent.supersonic.headless.api.pojo.request.FieldRemovedReq;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
import com.tencent.supersonic.headless.api.pojo.request.MetricReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelBuildReq;
import com.tencent.supersonic.headless.api.pojo.request.ModelReq;
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
import com.tencent.supersonic.headless.api.pojo.response.DimensionResp;
import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
import com.tencent.supersonic.headless.api.pojo.response.UnAvailableItemResp;
import com.tencent.supersonic.headless.server.modeller.SemanticModeller; import com.tencent.supersonic.headless.server.modeller.SemanticModeller;
import com.tencent.supersonic.headless.server.persistence.dataobject.DateInfoDO; import com.tencent.supersonic.headless.server.persistence.dataobject.DateInfoDO;
import com.tencent.supersonic.headless.server.persistence.dataobject.ModelDO; import com.tencent.supersonic.headless.server.persistence.dataobject.ModelDO;
import com.tencent.supersonic.headless.server.persistence.repository.DateInfoRepository; import com.tencent.supersonic.headless.server.persistence.repository.DateInfoRepository;
import com.tencent.supersonic.headless.server.persistence.repository.ModelRepository; import com.tencent.supersonic.headless.server.persistence.repository.ModelRepository;
import com.tencent.supersonic.headless.server.pojo.ModelFilter; import com.tencent.supersonic.headless.server.pojo.ModelFilter;
import com.tencent.supersonic.headless.server.service.*; import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.DatabaseService;
import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.DomainService;
import com.tencent.supersonic.headless.server.service.MetricService;
import com.tencent.supersonic.headless.server.service.ModelRelaService;
import com.tencent.supersonic.headless.server.service.ModelService;
import com.tencent.supersonic.headless.server.utils.CoreComponentFactory; import com.tencent.supersonic.headless.server.utils.CoreComponentFactory;
import com.tencent.supersonic.headless.server.utils.ModelConverter; import com.tencent.supersonic.headless.server.utils.ModelConverter;
import com.tencent.supersonic.headless.server.utils.NameCheckUtils; import com.tencent.supersonic.headless.server.utils.NameCheckUtils;
@@ -34,7 +62,12 @@ import org.springframework.util.CollectionUtils;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@@ -520,35 +553,6 @@ public class ModelServiceImpl implements ModelService {
modelRepository.batchUpdate(modelDOS); modelRepository.batchUpdate(modelDOS);
} }
@Override
public Dimension updateDimension(DimensionReq dimensionReq, User user) {
ModelDO modelDO = getModelDO(dimensionReq.getModelId());
ModelDetail modelDetail = JsonUtil.toObject(modelDO.getModelDetail(), ModelDetail.class);
Optional<Dimension> dimOptional = modelDetail.getDimensions().stream()
.filter(dimension -> dimension.getBizName().equals(dimensionReq.getBizName()))
.findFirst();
Dimension result;
if (dimOptional.isPresent()) {
Dimension dimension = dimOptional.get();
dimension.setExpr(dimensionReq.getExpr());
dimension.setName(dimensionReq.getName());
dimension.setType(DimensionType.valueOf(dimensionReq.getType()));
dimension.setDescription(dimensionReq.getDescription());
result = dimension;
} else {
Dimension dimension = Dimension.builder().name(dimensionReq.getName())
.bizName(dimensionReq.getBizName()).expr(dimensionReq.getExpr())
.type(DimensionType.valueOf(dimensionReq.getType()))
.description(dimensionReq.getDescription()).build();
modelDetail.getDimensions().add(dimension);
result = dimension;
}
modelDO.setModelDetail(JsonUtil.toString(modelDetail));
modelRepository.updateModel(modelDO);
return result;
}
protected ModelDO getModelDO(Long id) { protected ModelDO getModelDO(Long id) {
return modelRepository.getModelById(id); return modelRepository.getModelById(id);
} }

View File

@@ -36,8 +36,7 @@ public class SqlVariableParseUtilsTest {
@Test @Test
void testParseSql_if() { void testParseSql_if() {
String sql = String sql = "select * from t_$interval$ where id = $id$ $if(name)$and name = $name$$endif$";
"select * from t_$interval$ where id = $id$ $if(name)$and name = $name$$endif$";
List<SqlVariable> variables = Lists.newArrayList(mockNumSqlVariable(), List<SqlVariable> variables = Lists.newArrayList(mockNumSqlVariable(),
mockExprSqlVariable(), mockStrSqlVariable()); mockExprSqlVariable(), mockStrSqlVariable());
List<Param> params = List<Param> params =