diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java index 6fdca10d0..ff8f01367 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/ModelServiceImpl.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import com.tencent.supersonic.auth.api.authentication.service.UserService; import com.tencent.supersonic.common.config.ChatModel; 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.EventType; @@ -40,12 +41,7 @@ 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.ModelRepository; import com.tencent.supersonic.headless.server.pojo.ModelFilter; -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.ModelService; +import com.tencent.supersonic.headless.server.service.*; import com.tencent.supersonic.headless.server.utils.ModelConverter; import com.tencent.supersonic.headless.server.utils.NameCheckUtils; import lombok.extern.slf4j.Slf4j; @@ -57,14 +53,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.sql.SQLException; -import java.util.ArrayList; -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.Set; +import java.util.*; import java.util.stream.Collectors; @Service @@ -91,11 +80,13 @@ public class ModelServiceImpl implements ModelService { private ChatModelService chatModelService; + private ModelRelaService modelRelaService; + public ModelServiceImpl(ModelRepository modelRepository, DatabaseService databaseService, @Lazy DimensionService dimensionService, @Lazy MetricService metricService, DomainService domainService, UserService userService, DataSetService dataSetService, DateInfoRepository dateInfoRepository, ModelIntelligentBuilder modelIntelligentBuilder, - ChatModelService chatModelService) { + ChatModelService chatModelService, ModelRelaService modelRelaService) { this.modelRepository = modelRepository; this.databaseService = databaseService; this.dimensionService = dimensionService; @@ -106,6 +97,7 @@ public class ModelServiceImpl implements ModelService { this.dateInfoRepository = dateInfoRepository; this.modelIntelligentBuilder = modelIntelligentBuilder; this.chatModelService = chatModelService; + this.modelRelaService = modelRelaService; } @Override @@ -123,6 +115,7 @@ public class ModelServiceImpl implements ModelService { @Transactional public ModelResp updateModel(ModelReq modelReq, User user) throws Exception { checkParams(modelReq); + checkRelations(modelReq); ModelDO modelDO = modelRepository.getModelById(modelReq.getId()); ModelConverter.convert(modelDO, modelReq, user); modelRepository.updateModel(modelDO); @@ -311,6 +304,39 @@ public class ModelServiceImpl implements ModelService { } } + private void checkRelations(ModelReq modelReq) { + List modelRelas = modelRelaService.getModelRela(Arrays.asList(modelReq.getId())); + if (CollectionUtils.isEmpty(modelRelas)) { + return; + } + Set relations = new HashSet<>(); + for (ModelRela modelRela : modelRelas) { + if (modelRela.getFromModelId().equals(modelReq.getId())) { + modelRela.getJoinConditions().stream() + .forEach(r -> relations.add(r.getLeftField())); + } + if (modelRela.getToModelId().equals(modelReq.getId())) { + modelRela.getJoinConditions().stream() + .forEach(r -> relations.add(r.getRightField())); + } + } + if (relations.isEmpty()) { + return; + } + // any identify in model relation should not be deleted + if (modelReq.getModelDetail() == null + || CollectionUtils.isEmpty(modelReq.getModelDetail().getIdentifiers())) { + throw new InvalidArgumentException(String.format("模型关联中主键/外键不存在, 请检查")); + } + List modelIdentifiers = modelReq.getModelDetail().getIdentifiers().stream() + .map(i -> i.getBizName()).collect(Collectors.toList()); + for (String rela : relations) { + if (!modelIdentifiers.contains(rela)) { + throw new InvalidArgumentException(String.format("模型关联中主键/外键(%s)不存在, 请检查", rela)); + } + } + } + private void checkDelete(Long modelId) { MetaFilter metaFilter = new MetaFilter(); metaFilter.setModelIds(Lists.newArrayList(modelId)); diff --git a/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java b/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java index 2258ba187..eb8157507 100644 --- a/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java +++ b/headless/server/src/test/java/com/tencent/supersonic/headless/server/service/ModelServiceImplTest.java @@ -80,9 +80,10 @@ class ModelServiceImplTest { ModelIntelligentBuilder modelIntelligentBuilder = Mockito.mock(ModelIntelligentBuilder.class); ChatModelService chatModelService = Mockito.mock(ChatModelService.class); + ModelRelaService modelRelaService = Mockito.mock(ModelRelaService.class); return new ModelServiceImpl(modelRepository, databaseService, dimensionService, metricService, domainService, userService, viewService, dateInfoRepository, - modelIntelligentBuilder, chatModelService); + modelIntelligentBuilder, chatModelService, modelRelaService); } private ModelReq mockModelReq() {