mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:51:00 +00:00
This commit is contained in:
@@ -4,6 +4,7 @@ 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.config.ChatModel;
|
import com.tencent.supersonic.common.config.ChatModel;
|
||||||
import com.tencent.supersonic.common.pojo.ItemDateResp;
|
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.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;
|
||||||
@@ -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.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.DataSetService;
|
import com.tencent.supersonic.headless.server.service.*;
|
||||||
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.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;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -57,14 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
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.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -91,11 +80,13 @@ public class ModelServiceImpl implements ModelService {
|
|||||||
|
|
||||||
private ChatModelService chatModelService;
|
private ChatModelService chatModelService;
|
||||||
|
|
||||||
|
private ModelRelaService modelRelaService;
|
||||||
|
|
||||||
public ModelServiceImpl(ModelRepository modelRepository, DatabaseService databaseService,
|
public ModelServiceImpl(ModelRepository modelRepository, DatabaseService databaseService,
|
||||||
@Lazy DimensionService dimensionService, @Lazy MetricService metricService,
|
@Lazy DimensionService dimensionService, @Lazy MetricService metricService,
|
||||||
DomainService domainService, UserService userService, DataSetService dataSetService,
|
DomainService domainService, UserService userService, DataSetService dataSetService,
|
||||||
DateInfoRepository dateInfoRepository, ModelIntelligentBuilder modelIntelligentBuilder,
|
DateInfoRepository dateInfoRepository, ModelIntelligentBuilder modelIntelligentBuilder,
|
||||||
ChatModelService chatModelService) {
|
ChatModelService chatModelService, ModelRelaService modelRelaService) {
|
||||||
this.modelRepository = modelRepository;
|
this.modelRepository = modelRepository;
|
||||||
this.databaseService = databaseService;
|
this.databaseService = databaseService;
|
||||||
this.dimensionService = dimensionService;
|
this.dimensionService = dimensionService;
|
||||||
@@ -106,6 +97,7 @@ public class ModelServiceImpl implements ModelService {
|
|||||||
this.dateInfoRepository = dateInfoRepository;
|
this.dateInfoRepository = dateInfoRepository;
|
||||||
this.modelIntelligentBuilder = modelIntelligentBuilder;
|
this.modelIntelligentBuilder = modelIntelligentBuilder;
|
||||||
this.chatModelService = chatModelService;
|
this.chatModelService = chatModelService;
|
||||||
|
this.modelRelaService = modelRelaService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -123,6 +115,7 @@ public class ModelServiceImpl implements ModelService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public ModelResp updateModel(ModelReq modelReq, User user) throws Exception {
|
public ModelResp updateModel(ModelReq modelReq, User user) throws Exception {
|
||||||
checkParams(modelReq);
|
checkParams(modelReq);
|
||||||
|
checkRelations(modelReq);
|
||||||
ModelDO modelDO = modelRepository.getModelById(modelReq.getId());
|
ModelDO modelDO = modelRepository.getModelById(modelReq.getId());
|
||||||
ModelConverter.convert(modelDO, modelReq, user);
|
ModelConverter.convert(modelDO, modelReq, user);
|
||||||
modelRepository.updateModel(modelDO);
|
modelRepository.updateModel(modelDO);
|
||||||
@@ -311,6 +304,39 @@ public class ModelServiceImpl implements ModelService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkRelations(ModelReq modelReq) {
|
||||||
|
List<ModelRela> modelRelas = modelRelaService.getModelRela(Arrays.asList(modelReq.getId()));
|
||||||
|
if (CollectionUtils.isEmpty(modelRelas)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Set<String> 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<String> 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) {
|
private void checkDelete(Long modelId) {
|
||||||
MetaFilter metaFilter = new MetaFilter();
|
MetaFilter metaFilter = new MetaFilter();
|
||||||
metaFilter.setModelIds(Lists.newArrayList(modelId));
|
metaFilter.setModelIds(Lists.newArrayList(modelId));
|
||||||
|
|||||||
@@ -80,9 +80,10 @@ class ModelServiceImplTest {
|
|||||||
ModelIntelligentBuilder modelIntelligentBuilder =
|
ModelIntelligentBuilder modelIntelligentBuilder =
|
||||||
Mockito.mock(ModelIntelligentBuilder.class);
|
Mockito.mock(ModelIntelligentBuilder.class);
|
||||||
ChatModelService chatModelService = Mockito.mock(ChatModelService.class);
|
ChatModelService chatModelService = Mockito.mock(ChatModelService.class);
|
||||||
|
ModelRelaService modelRelaService = Mockito.mock(ModelRelaService.class);
|
||||||
return new ModelServiceImpl(modelRepository, databaseService, dimensionService,
|
return new ModelServiceImpl(modelRepository, databaseService, dimensionService,
|
||||||
metricService, domainService, userService, viewService, dateInfoRepository,
|
metricService, domainService, userService, viewService, dateInfoRepository,
|
||||||
modelIntelligentBuilder, chatModelService);
|
modelIntelligentBuilder, chatModelService, modelRelaService);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ModelReq mockModelReq() {
|
private ModelReq mockModelReq() {
|
||||||
|
|||||||
Reference in New Issue
Block a user