xiangzihao
5 months ago
committed by
GitHub
52 changed files with 1524 additions and 1151 deletions
@ -0,0 +1,29 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.api.dto; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
|
@Data |
||||||
|
@NoArgsConstructor |
||||||
|
public class TaskCodeVersionDto { |
||||||
|
|
||||||
|
private long code; |
||||||
|
private int version; |
||||||
|
} |
@ -0,0 +1,307 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.api.service.impl; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.enums.Status; |
||||||
|
import org.apache.dolphinscheduler.api.exceptions.ServiceException; |
||||||
|
import org.apache.dolphinscheduler.api.service.ProcessLineageService; |
||||||
|
import org.apache.dolphinscheduler.common.constants.Constants; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.DependentLineageTask; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.Project; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.TaskDefinition; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionLogMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.repository.ProcessTaskLineageDao; |
||||||
|
|
||||||
|
import java.text.MessageFormat; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Optional; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
import java.util.stream.Stream; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.CollectionUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* work flow lineage service impl |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Service |
||||||
|
public class ProcessLineageServiceImpl extends BaseServiceImpl implements ProcessLineageService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProjectMapper projectMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TaskDefinitionLogMapper taskDefinitionLogMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TaskDefinitionMapper taskDefinitionMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProcessTaskLineageDao processTaskLineageDao; |
||||||
|
@Autowired |
||||||
|
private ProcessDefinitionMapper processDefinitionMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode, String processDefinitionName) { |
||||||
|
Project project = projectMapper.queryByCode(projectCode); |
||||||
|
if (project == null) { |
||||||
|
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
||||||
|
} |
||||||
|
return processTaskLineageDao.queryWorkFlowLineageByName(projectCode, processDefinitionName); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long processDefinitionCode) { |
||||||
|
Project project = projectMapper.queryByCode(projectCode); |
||||||
|
if (project == null) { |
||||||
|
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
||||||
|
} |
||||||
|
List<ProcessTaskLineage> upstreamProcessTaskLineageList = |
||||||
|
processTaskLineageDao.queryByProcessDefinitionCode(processDefinitionCode); |
||||||
|
List<ProcessTaskLineage> downstreamProcessTaskLineageList = |
||||||
|
processTaskLineageDao.queryWorkFlowLineageByDept(projectCode, processDefinitionCode, |
||||||
|
Constants.DEPENDENT_ALL_TASK); |
||||||
|
List<ProcessTaskLineage> totalProcessTaskLineageList = |
||||||
|
Stream.of(upstreamProcessTaskLineageList, downstreamProcessTaskLineageList) |
||||||
|
.flatMap(List::stream) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
|
||||||
|
List<WorkFlowRelation> workFlowRelationList = getWorkFlowRelations(totalProcessTaskLineageList); |
||||||
|
List<WorkFlowRelationDetail> workFlowRelationDetailList = |
||||||
|
getWorkflowRelationDetails(totalProcessTaskLineageList.stream() |
||||||
|
.flatMap(pl -> { |
||||||
|
List<Long> processDefinitionCodes = new ArrayList<>(); |
||||||
|
processDefinitionCodes.add(pl.getProcessDefinitionCode()); |
||||||
|
processDefinitionCodes.add(pl.getDeptProcessDefinitionCode()); |
||||||
|
return processDefinitionCodes.stream(); |
||||||
|
}).distinct().collect(Collectors.toList())); |
||||||
|
|
||||||
|
WorkFlowLineage workFlowLineage = new WorkFlowLineage(); |
||||||
|
workFlowLineage.setWorkFlowRelationDetailList(workFlowRelationDetailList); |
||||||
|
workFlowLineage.setWorkFlowRelationList(workFlowRelationList); |
||||||
|
return workFlowLineage; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public WorkFlowLineage queryWorkFlowLineage(long projectCode) { |
||||||
|
Project project = projectMapper.queryByCode(projectCode); |
||||||
|
if (project == null) { |
||||||
|
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
||||||
|
} |
||||||
|
List<ProcessTaskLineage> processTaskLineageList = processTaskLineageDao.queryByProjectCode(projectCode); |
||||||
|
List<WorkFlowRelation> workFlowRelationList = getWorkFlowRelations(processTaskLineageList); |
||||||
|
List<WorkFlowRelationDetail> workFlowRelationDetailList = |
||||||
|
getWorkflowRelationDetails(processTaskLineageList.stream() |
||||||
|
.flatMap(pl -> { |
||||||
|
List<Long> processDefinitionCodes = new ArrayList<>(); |
||||||
|
processDefinitionCodes.add(pl.getProcessDefinitionCode()); |
||||||
|
processDefinitionCodes.add(pl.getDeptProcessDefinitionCode()); |
||||||
|
return processDefinitionCodes.stream(); |
||||||
|
}).distinct().collect(Collectors.toList())); |
||||||
|
|
||||||
|
WorkFlowLineage workFlowLineage = new WorkFlowLineage(); |
||||||
|
workFlowLineage.setWorkFlowRelationList(workFlowRelationList); |
||||||
|
workFlowLineage.setWorkFlowRelationDetailList(workFlowRelationDetailList); |
||||||
|
return workFlowLineage; |
||||||
|
} |
||||||
|
|
||||||
|
private List<WorkFlowRelation> getWorkFlowRelations(List<ProcessTaskLineage> processTaskLineageList) { |
||||||
|
List<WorkFlowRelation> workFlowRelations = new ArrayList<>(); |
||||||
|
List<Long> processDefinitionCodes = processTaskLineageList.stream() |
||||||
|
.map(ProcessTaskLineage::getProcessDefinitionCode).distinct().collect(Collectors.toList()); |
||||||
|
for (ProcessTaskLineage processTaskLineage : processTaskLineageList) { |
||||||
|
workFlowRelations.add(new WorkFlowRelation(processTaskLineage.getDeptProcessDefinitionCode(), |
||||||
|
processTaskLineage.getProcessDefinitionCode())); |
||||||
|
|
||||||
|
if (!processDefinitionCodes.contains(processTaskLineage.getDeptProcessDefinitionCode())) { |
||||||
|
workFlowRelations.add(new WorkFlowRelation(0, processTaskLineage.getProcessDefinitionCode())); |
||||||
|
} |
||||||
|
} |
||||||
|
return workFlowRelations; |
||||||
|
} |
||||||
|
|
||||||
|
private List<WorkFlowRelationDetail> getWorkflowRelationDetails(List<Long> processDefinitionCodes) { |
||||||
|
List<WorkFlowRelationDetail> workFlowRelationDetails = new ArrayList<>(); |
||||||
|
for (Long processDefinitionCode : processDefinitionCodes) { |
||||||
|
List<WorkFlowRelationDetail> workFlowRelationDetailList = |
||||||
|
processTaskLineageDao.queryWorkFlowLineageByCode(processDefinitionCode); |
||||||
|
workFlowRelationDetails.addAll(workFlowRelationDetailList); |
||||||
|
} |
||||||
|
return workFlowRelationDetails; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Query tasks depend on process definition, include upstream or downstream |
||||||
|
* and return tasks dependence with string format. |
||||||
|
* |
||||||
|
* @param projectCode Project code want to query tasks dependence |
||||||
|
* @param processDefinitionCode Process definition code want to query tasks dependence |
||||||
|
* @param taskCode Task code want to query tasks dependence |
||||||
|
* @return Optional of formatter message |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Optional<String> taskDependentMsg(long projectCode, long processDefinitionCode, long taskCode) { |
||||||
|
long queryTaskCode = 0; |
||||||
|
if (taskCode != 0) { |
||||||
|
queryTaskCode = taskCode; |
||||||
|
} |
||||||
|
List<ProcessTaskLineage> dependentProcessList = |
||||||
|
processTaskLineageDao.queryWorkFlowLineageByDept(projectCode, processDefinitionCode, queryTaskCode); |
||||||
|
if (CollectionUtils.isEmpty(dependentProcessList)) { |
||||||
|
return Optional.empty(); |
||||||
|
} |
||||||
|
|
||||||
|
List<String> taskDepStrList = new ArrayList<>(); |
||||||
|
|
||||||
|
for (ProcessTaskLineage processTaskLineage : dependentProcessList) { |
||||||
|
ProcessDefinition processDefinition = |
||||||
|
processDefinitionMapper.queryByCode(processTaskLineage.getDeptProcessDefinitionCode()); |
||||||
|
String taskName = ""; |
||||||
|
if (processTaskLineage.getTaskDefinitionCode() != 0) { |
||||||
|
TaskDefinition taskDefinition = |
||||||
|
taskDefinitionMapper.queryByCode(processTaskLineage.getTaskDefinitionCode()); |
||||||
|
taskName = taskDefinition.getName(); |
||||||
|
} |
||||||
|
taskDepStrList.add(String.format(Constants.FORMAT_S_S_COLON, processDefinition.getName(), taskName)); |
||||||
|
} |
||||||
|
|
||||||
|
String taskDepStr = String.join(Constants.COMMA, taskDepStrList); |
||||||
|
if (taskCode != 0) { |
||||||
|
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode); |
||||||
|
return Optional |
||||||
|
.of(MessageFormat.format(Status.DELETE_TASK_USE_BY_OTHER_FAIL.getMsg(), taskDefinition.getName(), |
||||||
|
taskDepStr)); |
||||||
|
} else { |
||||||
|
return Optional.of(MessageFormat.format(Status.DELETE_TASK_USE_BY_OTHER_FAIL.getMsg(), "", |
||||||
|
taskDepStr)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Query downstream tasks depend on a process definition or a task |
||||||
|
* |
||||||
|
* @param processDefinitionCode Process definition code want to query tasks dependence |
||||||
|
* @return downstream dependent process definition list |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public List<DependentProcessDefinition> queryDownstreamDependentProcessDefinitions(Long processDefinitionCode) { |
||||||
|
List<DependentProcessDefinition> dependentProcessDefinitionList = new ArrayList<>(); |
||||||
|
List<ProcessTaskLineage> processTaskLineageList = |
||||||
|
processTaskLineageDao.queryWorkFlowLineageByDept(Constants.DEFAULT_PROJECT_CODE, processDefinitionCode, |
||||||
|
Constants.DEPENDENT_ALL_TASK); |
||||||
|
if (processTaskLineageList.isEmpty()) { |
||||||
|
return dependentProcessDefinitionList; |
||||||
|
} |
||||||
|
|
||||||
|
List<ProcessDefinition> processDefinitionList = |
||||||
|
processDefinitionMapper.queryByCodes(processTaskLineageList.stream() |
||||||
|
.map(ProcessTaskLineage::getDeptProcessDefinitionCode).distinct().collect(Collectors.toList())); |
||||||
|
List<TaskDefinition> taskDefinitionList = taskDefinitionMapper.queryByCodeList(processTaskLineageList.stream() |
||||||
|
.map(ProcessTaskLineage::getDeptTaskDefinitionCode).distinct().collect(Collectors.toList())); |
||||||
|
for (TaskDefinition taskDefinition : taskDefinitionList) { |
||||||
|
DependentProcessDefinition dependentProcessDefinition = new DependentProcessDefinition(); |
||||||
|
processTaskLineageList.stream() |
||||||
|
.filter(processLineage -> processLineage.getDeptTaskDefinitionCode() == taskDefinition.getCode()) |
||||||
|
.findFirst() |
||||||
|
.ifPresent(processLineage -> { |
||||||
|
dependentProcessDefinition |
||||||
|
.setProcessDefinitionCode(processLineage.getDeptProcessDefinitionCode()); |
||||||
|
dependentProcessDefinition.setTaskDefinitionCode(taskDefinition.getCode()); |
||||||
|
dependentProcessDefinition.setTaskParams(taskDefinition.getTaskParams()); |
||||||
|
dependentProcessDefinition.setWorkerGroup(taskDefinition.getWorkerGroup()); |
||||||
|
}); |
||||||
|
processDefinitionList.stream() |
||||||
|
.filter(processDefinition -> processDefinition.getCode() == dependentProcessDefinition |
||||||
|
.getProcessDefinitionCode()) |
||||||
|
.findFirst() |
||||||
|
.ifPresent(processDefinition -> { |
||||||
|
dependentProcessDefinition.setProcessDefinitionVersion(processDefinition.getVersion()); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
return dependentProcessDefinitionList; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<DependentLineageTask> queryDependentProcessDefinitions(long projectCode, long processDefinitionCode, |
||||||
|
Long taskCode) { |
||||||
|
Project project = projectMapper.queryByCode(projectCode); |
||||||
|
if (project == null) { |
||||||
|
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
||||||
|
} |
||||||
|
List<ProcessTaskLineage> processTaskLineageList = processTaskLineageDao.queryWorkFlowLineageByDept(projectCode, |
||||||
|
processDefinitionCode, taskCode == null ? 0 : taskCode); |
||||||
|
List<ProcessDefinition> processDefinitionList = |
||||||
|
processDefinitionMapper.queryByCodes(processTaskLineageList.stream() |
||||||
|
.map(ProcessTaskLineage::getProcessDefinitionCode).distinct().collect(Collectors.toList())); |
||||||
|
List<TaskDefinition> taskDefinitionList = taskDefinitionMapper.queryByCodeList(processTaskLineageList.stream() |
||||||
|
.map(ProcessTaskLineage::getTaskDefinitionCode).filter(code -> code != 0).distinct() |
||||||
|
.collect(Collectors.toList())); |
||||||
|
List<DependentLineageTask> dependentLineageTaskList = new ArrayList<>(); |
||||||
|
for (ProcessTaskLineage processTaskLineage : processTaskLineageList) { |
||||||
|
DependentLineageTask dependentLineageTask = new DependentLineageTask(); |
||||||
|
taskDefinitionList.stream() |
||||||
|
.filter(taskDefinition -> taskDefinition.getCode() == processTaskLineage.getTaskDefinitionCode()) |
||||||
|
.findFirst() |
||||||
|
.ifPresent(taskDefinition -> { |
||||||
|
dependentLineageTask.setTaskDefinitionCode(taskDefinition.getCode()); |
||||||
|
dependentLineageTask.setTaskDefinitionName(taskDefinition.getName()); |
||||||
|
}); |
||||||
|
processDefinitionList.stream() |
||||||
|
.filter(processDefinition -> processDefinition.getCode() == processTaskLineage |
||||||
|
.getProcessDefinitionCode()) |
||||||
|
.findFirst() |
||||||
|
.ifPresent(processDefinition -> { |
||||||
|
dependentLineageTask.setProcessDefinitionCode(processDefinition.getCode()); |
||||||
|
dependentLineageTask.setProcessDefinitionName(processDefinition.getName()); |
||||||
|
dependentLineageTask.setProjectCode(processDefinition.getProjectCode()); |
||||||
|
}); |
||||||
|
dependentLineageTaskList.add(dependentLineageTask); |
||||||
|
} |
||||||
|
return dependentLineageTaskList; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int createProcessLineage(List<ProcessTaskLineage> processTaskLineages) { |
||||||
|
return processTaskLineageDao.batchInsert(processTaskLineages); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int updateProcessLineage(List<ProcessTaskLineage> processTaskLineages) { |
||||||
|
return processTaskLineageDao.updateProcessTaskLineage(processTaskLineages); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int deleteProcessLineage(List<Long> processDefinitionCodes) { |
||||||
|
return processTaskLineageDao.batchDeleteByProcessDefinitionCode(processDefinitionCodes); |
||||||
|
} |
||||||
|
} |
@ -1,306 +0,0 @@ |
|||||||
/* |
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
||||||
* contributor license agreements. See the NOTICE file distributed with |
|
||||||
* this work for additional information regarding copyright ownership. |
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
||||||
* (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.apache.dolphinscheduler.api.service.impl; |
|
||||||
|
|
||||||
import org.apache.dolphinscheduler.api.enums.Status; |
|
||||||
import org.apache.dolphinscheduler.api.exceptions.ServiceException; |
|
||||||
import org.apache.dolphinscheduler.api.service.WorkFlowLineageService; |
|
||||||
import org.apache.dolphinscheduler.common.constants.Constants; |
|
||||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.ProcessLineage; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.Project; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinition; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinitionLog; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.TaskMainInfo; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionLogMapper; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper; |
|
||||||
import org.apache.dolphinscheduler.dao.mapper.WorkFlowLineageMapper; |
|
||||||
import org.apache.dolphinscheduler.plugin.task.api.model.DependentItem; |
|
||||||
import org.apache.dolphinscheduler.plugin.task.api.model.DependentTaskModel; |
|
||||||
import org.apache.dolphinscheduler.plugin.task.api.parameters.DependentParameters; |
|
||||||
import org.apache.dolphinscheduler.plugin.task.api.utils.TaskTypeUtils; |
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils; |
|
||||||
|
|
||||||
import java.text.MessageFormat; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Map.Entry; |
|
||||||
import java.util.Objects; |
|
||||||
import java.util.Optional; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.stream.Collectors; |
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j; |
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
import org.springframework.stereotype.Service; |
|
||||||
import org.springframework.util.CollectionUtils; |
|
||||||
|
|
||||||
/** |
|
||||||
* work flow lineage service impl |
|
||||||
*/ |
|
||||||
@Slf4j |
|
||||||
@Service |
|
||||||
public class WorkFlowLineageServiceImpl extends BaseServiceImpl implements WorkFlowLineageService { |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private WorkFlowLineageMapper workFlowLineageMapper; |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private ProjectMapper projectMapper; |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private TaskDefinitionLogMapper taskDefinitionLogMapper; |
|
||||||
|
|
||||||
@Autowired |
|
||||||
private TaskDefinitionMapper taskDefinitionMapper; |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<WorkFlowLineage> queryWorkFlowLineageByName(long projectCode, String workFlowName) { |
|
||||||
Project project = projectMapper.queryByCode(projectCode); |
|
||||||
if (project == null) { |
|
||||||
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
|
||||||
} |
|
||||||
return workFlowLineageMapper.queryWorkFlowLineageByName(projectCode, workFlowName); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Map<String, Object> queryWorkFlowLineageByCode(long projectCode, long sourceWorkFlowCode) { |
|
||||||
Project project = projectMapper.queryByCode(projectCode); |
|
||||||
if (project == null) { |
|
||||||
throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); |
|
||||||
} |
|
||||||
List<WorkFlowLineage> workFlowLineages = new ArrayList<>(); |
|
||||||
Set<WorkFlowRelation> workFlowRelations = new HashSet<>(); |
|
||||||
recursiveWorkFlow(projectCode, sourceWorkFlowCode, workFlowLineages, workFlowRelations); |
|
||||||
Map<String, Object> workFlowLists = new HashMap<>(); |
|
||||||
// todo: use vo
|
|
||||||
workFlowLists.put(Constants.WORKFLOW_LIST, workFlowLineages); |
|
||||||
workFlowLists.put(Constants.WORKFLOW_RELATION_LIST, workFlowRelations); |
|
||||||
return workFlowLists; |
|
||||||
} |
|
||||||
|
|
||||||
private void recursiveWorkFlow(long projectCode, |
|
||||||
long sourceWorkFlowCode, |
|
||||||
List<WorkFlowLineage> workFlowLineages, |
|
||||||
Set<WorkFlowRelation> workFlowRelations) { |
|
||||||
workFlowLineages.add(workFlowLineageMapper.queryWorkFlowLineageByCode(projectCode, sourceWorkFlowCode)); |
|
||||||
|
|
||||||
List<WorkFlowLineage> downStreamWorkFlowLineages = |
|
||||||
workFlowLineageMapper.queryDownstreamLineageByProcessDefinitionCode(sourceWorkFlowCode, "DEPENDENT"); |
|
||||||
workFlowLineages.addAll(downStreamWorkFlowLineages); |
|
||||||
downStreamWorkFlowLineages.forEach(workFlowLineage -> workFlowRelations |
|
||||||
.add(new WorkFlowRelation(sourceWorkFlowCode, workFlowLineage.getWorkFlowCode()))); |
|
||||||
|
|
||||||
List<WorkFlowLineage> upstreamWorkFlowLineages = new ArrayList<>(); |
|
||||||
getUpstreamLineages(sourceWorkFlowCode, upstreamWorkFlowLineages); |
|
||||||
workFlowLineages.addAll(upstreamWorkFlowLineages); |
|
||||||
upstreamWorkFlowLineages.forEach(workFlowLineage -> workFlowRelations |
|
||||||
.add(new WorkFlowRelation(workFlowLineage.getWorkFlowCode(), sourceWorkFlowCode))); |
|
||||||
} |
|
||||||
|
|
||||||
private void getUpstreamLineages(long sourceWorkFlowCode, |
|
||||||
List<WorkFlowLineage> upstreamWorkFlowLineages) { |
|
||||||
List<DependentProcessDefinition> workFlowDependentDefinitionList = |
|
||||||
workFlowLineageMapper.queryUpstreamDependentParamsByProcessDefinitionCode(sourceWorkFlowCode, |
|
||||||
"DEPENDENT"); |
|
||||||
|
|
||||||
List<Long> upstreamProcessDefinitionCodes = new ArrayList<>(); |
|
||||||
|
|
||||||
getProcessDefinitionCodeByDependentDefinitionList(workFlowDependentDefinitionList, |
|
||||||
upstreamProcessDefinitionCodes); |
|
||||||
|
|
||||||
if (!upstreamProcessDefinitionCodes.isEmpty()) { |
|
||||||
upstreamWorkFlowLineages.addAll( |
|
||||||
workFlowLineageMapper.queryWorkFlowLineageByProcessDefinitionCodes(upstreamProcessDefinitionCodes)); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* get dependent process definition code by dependent process definition list |
|
||||||
*/ |
|
||||||
private void getProcessDefinitionCodeByDependentDefinitionList(List<DependentProcessDefinition> dependentDefinitionList, |
|
||||||
List<Long> processDefinitionCodes) { |
|
||||||
for (DependentProcessDefinition dependentProcessDefinition : dependentDefinitionList) { |
|
||||||
for (DependentTaskModel dependentTaskModel : dependentProcessDefinition.getDependentParameters() |
|
||||||
.getDependence().getDependTaskList()) { |
|
||||||
for (DependentItem dependentItem : dependentTaskModel.getDependItemList()) { |
|
||||||
if (!processDefinitionCodes.contains(dependentItem.getDefinitionCode())) { |
|
||||||
processDefinitionCodes.add(dependentItem.getDefinitionCode()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Map<String, Object> queryWorkFlowLineage(long projectCode) { |
|
||||||
Map<String, Object> result = new HashMap<>(); |
|
||||||
Project project = projectMapper.queryByCode(projectCode); |
|
||||||
if (project == null) { |
|
||||||
log.error("Project does not exist, projectCode:{}.", projectCode); |
|
||||||
putMsg(result, Status.PROJECT_NOT_FOUND, projectCode); |
|
||||||
return result; |
|
||||||
} |
|
||||||
List<ProcessLineage> processLineages = workFlowLineageMapper.queryProcessLineage(projectCode); |
|
||||||
Map<Long, WorkFlowLineage> workFlowLineagesMap = new HashMap<>(); |
|
||||||
Set<WorkFlowRelation> workFlowRelations = new HashSet<>(); |
|
||||||
if (!processLineages.isEmpty()) { |
|
||||||
List<WorkFlowLineage> workFlowLineages = |
|
||||||
workFlowLineageMapper.queryWorkFlowLineageByLineage(processLineages); |
|
||||||
workFlowLineagesMap = workFlowLineages.stream() |
|
||||||
.collect(Collectors.toMap(WorkFlowLineage::getWorkFlowCode, workFlowLineage -> workFlowLineage)); |
|
||||||
Map<Long, List<TaskDefinition>> workFlowMap = new HashMap<>(); |
|
||||||
for (ProcessLineage processLineage : processLineages) { |
|
||||||
workFlowMap.compute(processLineage.getProcessDefinitionCode(), (k, v) -> { |
|
||||||
if (v == null) { |
|
||||||
v = new ArrayList<>(); |
|
||||||
} |
|
||||||
if (processLineage.getPreTaskCode() > 0) { |
|
||||||
v.add(new TaskDefinition(processLineage.getPreTaskCode(), processLineage.getPreTaskVersion())); |
|
||||||
} |
|
||||||
if (processLineage.getPostTaskCode() > 0) { |
|
||||||
v.add(new TaskDefinition(processLineage.getPostTaskCode(), |
|
||||||
processLineage.getPostTaskVersion())); |
|
||||||
} |
|
||||||
return v; |
|
||||||
}); |
|
||||||
} |
|
||||||
for (Entry<Long, List<TaskDefinition>> workFlow : workFlowMap.entrySet()) { |
|
||||||
Set<Long> sourceWorkFlowCodes = |
|
||||||
querySourceWorkFlowCodes(projectCode, workFlow.getKey(), workFlow.getValue()); |
|
||||||
if (sourceWorkFlowCodes.isEmpty()) { |
|
||||||
workFlowRelations.add(new WorkFlowRelation(0L, workFlow.getKey())); |
|
||||||
} else { |
|
||||||
workFlowLineagesMap.get(workFlow.getKey()) |
|
||||||
.setSourceWorkFlowCode(StringUtils.join(sourceWorkFlowCodes, Constants.COMMA)); |
|
||||||
sourceWorkFlowCodes |
|
||||||
.forEach(code -> workFlowRelations.add(new WorkFlowRelation(code, workFlow.getKey()))); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
Map<String, Object> workFlowLists = new HashMap<>(); |
|
||||||
workFlowLists.put(Constants.WORKFLOW_LIST, workFlowLineagesMap.values()); |
|
||||||
workFlowLists.put(Constants.WORKFLOW_RELATION_LIST, workFlowRelations); |
|
||||||
result.put(Constants.DATA_LIST, workFlowLists); |
|
||||||
putMsg(result, Status.SUCCESS); |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
private Set<Long> querySourceWorkFlowCodes(long projectCode, long workFlowCode, |
|
||||||
List<TaskDefinition> taskDefinitionList) { |
|
||||||
Set<Long> sourceWorkFlowCodes = new HashSet<>(); |
|
||||||
if (taskDefinitionList == null || taskDefinitionList.isEmpty()) { |
|
||||||
return sourceWorkFlowCodes; |
|
||||||
} |
|
||||||
List<TaskDefinitionLog> taskDefinitionLogs = taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitionList); |
|
||||||
for (TaskDefinitionLog taskDefinitionLog : taskDefinitionLogs) { |
|
||||||
if (taskDefinitionLog.getProjectCode() == projectCode) { |
|
||||||
if (TaskTypeUtils.isDependentTask(taskDefinitionLog.getTaskType())) { |
|
||||||
DependentParameters dependentParameters = |
|
||||||
JSONUtils.parseObject(taskDefinitionLog.getDependence(), DependentParameters.class); |
|
||||||
if (dependentParameters != null) { |
|
||||||
List<DependentTaskModel> dependTaskList = |
|
||||||
dependentParameters.getDependence().getDependTaskList(); |
|
||||||
if (!CollectionUtils.isEmpty(dependTaskList)) { |
|
||||||
for (DependentTaskModel taskModel : dependTaskList) { |
|
||||||
List<DependentItem> dependItemList = taskModel.getDependItemList(); |
|
||||||
for (DependentItem dependentItem : dependItemList) { |
|
||||||
if (dependentItem.getProjectCode() == projectCode |
|
||||||
&& dependentItem.getDefinitionCode() != workFlowCode) { |
|
||||||
sourceWorkFlowCodes.add(dependentItem.getDefinitionCode()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
return sourceWorkFlowCodes; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Query and return tasks dependence with string format, is a wrapper of queryTaskDepOnTask and task query method. |
|
||||||
* |
|
||||||
* @param projectCode Project code want to query tasks dependence |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @param taskCode Task code want to query tasks dependence |
|
||||||
* @return Optional of formatter message |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public Optional<String> taskDepOnTaskMsg(long projectCode, long processDefinitionCode, long taskCode) { |
|
||||||
List<TaskMainInfo> tasksDep = |
|
||||||
workFlowLineageMapper.queryTaskDepOnTask(projectCode, processDefinitionCode, taskCode); |
|
||||||
if (CollectionUtils.isEmpty(tasksDep)) { |
|
||||||
return Optional.empty(); |
|
||||||
} |
|
||||||
|
|
||||||
String taskDepStr = tasksDep.stream().map( |
|
||||||
task -> String.format(Constants.FORMAT_S_S_COLON, task.getProcessDefinitionName(), task.getTaskName())) |
|
||||||
.collect(Collectors.joining(Constants.COMMA)); |
|
||||||
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode); |
|
||||||
return Optional.of(MessageFormat.format(Status.DELETE_TASK_USE_BY_OTHER_FAIL.getMsg(), taskDefinition.getName(), |
|
||||||
taskDepStr)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Query tasks depend on process definition, include upstream or downstream |
|
||||||
* |
|
||||||
* @param projectCode Project code want to query tasks dependence |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @return Set of TaskMainInfo |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public Set<TaskMainInfo> queryTaskDepOnProcess(long projectCode, long processDefinitionCode) { |
|
||||||
Set<TaskMainInfo> taskMainInfos = new HashSet<>(); |
|
||||||
List<TaskMainInfo> taskDependents = |
|
||||||
workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, 0); |
|
||||||
List<TaskMainInfo> taskSubProcess = |
|
||||||
workFlowLineageMapper.queryTaskSubProcessDepOnProcess(projectCode, processDefinitionCode); |
|
||||||
taskMainInfos.addAll(taskDependents); |
|
||||||
taskMainInfos.addAll(taskSubProcess); |
|
||||||
return taskMainInfos; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Query downstream tasks depend on a process definition or a task |
|
||||||
* |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @param taskCode Task code want to query tasks dependence |
|
||||||
* @return downstream dependent tasks |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public Map<String, Object> queryDownstreamDependentTasks(Long processDefinitionCode, Long taskCode) { |
|
||||||
Map<String, Object> result = new HashMap<>(); |
|
||||||
List<TaskMainInfo> taskDependents = |
|
||||||
workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, |
|
||||||
Objects.isNull(taskCode) ? 0 : taskCode.longValue()); |
|
||||||
result.put(Constants.DATA_LIST, taskDependents); |
|
||||||
putMsg(result, Status.SUCCESS); |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.entity; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
|
@Data |
||||||
|
@NoArgsConstructor |
||||||
|
@AllArgsConstructor |
||||||
|
public class DependentLineageTask { |
||||||
|
|
||||||
|
private long projectCode; |
||||||
|
private long processDefinitionCode; |
||||||
|
private String processDefinitionName; |
||||||
|
private long taskDefinitionCode; |
||||||
|
private String taskDefinitionName; |
||||||
|
} |
@ -1,115 +0,0 @@ |
|||||||
/* |
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
||||||
* contributor license agreements. See the NOTICE file distributed with |
|
||||||
* this work for additional information regarding copyright ownership. |
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
||||||
* (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.apache.dolphinscheduler.dao.entity; |
|
||||||
|
|
||||||
/** |
|
||||||
* Process lineage |
|
||||||
*/ |
|
||||||
public class ProcessLineage { |
|
||||||
|
|
||||||
/** |
|
||||||
* project code |
|
||||||
*/ |
|
||||||
private long projectCode; |
|
||||||
|
|
||||||
/** |
|
||||||
* post task code |
|
||||||
*/ |
|
||||||
private long postTaskCode; |
|
||||||
|
|
||||||
/** |
|
||||||
* post task version |
|
||||||
*/ |
|
||||||
private int postTaskVersion; |
|
||||||
|
|
||||||
/** |
|
||||||
* pre task code |
|
||||||
*/ |
|
||||||
private long preTaskCode; |
|
||||||
|
|
||||||
/** |
|
||||||
* pre task version |
|
||||||
*/ |
|
||||||
private int preTaskVersion; |
|
||||||
|
|
||||||
/** |
|
||||||
* process definition code |
|
||||||
*/ |
|
||||||
private long processDefinitionCode; |
|
||||||
|
|
||||||
/** |
|
||||||
* process definition version |
|
||||||
*/ |
|
||||||
private int processDefinitionVersion; |
|
||||||
|
|
||||||
public long getProjectCode() { |
|
||||||
return projectCode; |
|
||||||
} |
|
||||||
|
|
||||||
public void setProjectCode(long projectCode) { |
|
||||||
this.projectCode = projectCode; |
|
||||||
} |
|
||||||
|
|
||||||
public long getPostTaskCode() { |
|
||||||
return postTaskCode; |
|
||||||
} |
|
||||||
|
|
||||||
public void setPostTaskCode(long postTaskCode) { |
|
||||||
this.postTaskCode = postTaskCode; |
|
||||||
} |
|
||||||
|
|
||||||
public int getPostTaskVersion() { |
|
||||||
return postTaskVersion; |
|
||||||
} |
|
||||||
|
|
||||||
public void setPostTaskVersion(int postTaskVersion) { |
|
||||||
this.postTaskVersion = postTaskVersion; |
|
||||||
} |
|
||||||
|
|
||||||
public long getPreTaskCode() { |
|
||||||
return preTaskCode; |
|
||||||
} |
|
||||||
|
|
||||||
public void setPreTaskCode(long preTaskCode) { |
|
||||||
this.preTaskCode = preTaskCode; |
|
||||||
} |
|
||||||
|
|
||||||
public int getPreTaskVersion() { |
|
||||||
return preTaskVersion; |
|
||||||
} |
|
||||||
|
|
||||||
public void setPreTaskVersion(int preTaskVersion) { |
|
||||||
this.preTaskVersion = preTaskVersion; |
|
||||||
} |
|
||||||
|
|
||||||
public long getProcessDefinitionCode() { |
|
||||||
return processDefinitionCode; |
|
||||||
} |
|
||||||
|
|
||||||
public void setProcessDefinitionCode(long processDefinitionCode) { |
|
||||||
this.processDefinitionCode = processDefinitionCode; |
|
||||||
} |
|
||||||
|
|
||||||
public int getProcessDefinitionVersion() { |
|
||||||
return processDefinitionVersion; |
|
||||||
} |
|
||||||
|
|
||||||
public void setProcessDefinitionVersion(int processDefinitionVersion) { |
|
||||||
this.processDefinitionVersion = processDefinitionVersion; |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,48 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.entity; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
|
||||||
|
@Data |
||||||
|
@NoArgsConstructor |
||||||
|
@AllArgsConstructor |
||||||
|
@TableName("t_ds_process_task_lineage") |
||||||
|
public class ProcessTaskLineage { |
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
|
private Integer id; |
||||||
|
|
||||||
|
private long processDefinitionCode; |
||||||
|
private int processDefinitionVersion; |
||||||
|
private long taskDefinitionCode; |
||||||
|
private int taskDefinitionVersion; |
||||||
|
private long deptProjectCode; |
||||||
|
private long deptProcessDefinitionCode; |
||||||
|
private long deptTaskDefinitionCode; |
||||||
|
private Date createTime; |
||||||
|
private Date updateTime; |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.entity; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class WorkFlowRelationDetail { |
||||||
|
|
||||||
|
private long workFlowCode; |
||||||
|
private String workFlowName; |
||||||
|
private String workFlowPublishStatus; |
||||||
|
private Date scheduleStartTime; |
||||||
|
private Date scheduleEndTime; |
||||||
|
private String crontab; |
||||||
|
private int schedulePublishStatus; |
||||||
|
private String sourceWorkFlowCode; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.mapper; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; |
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
|
||||||
|
public interface ProcessTaskLineageMapper extends BaseMapper<ProcessTaskLineage> { |
||||||
|
|
||||||
|
int batchDeleteByProcessDefinitionCode(@Param("processDefinitionCodes") List<Long> processDefinitionCodes); |
||||||
|
|
||||||
|
int batchInsert(@Param("processLineages") List<ProcessTaskLineage> processTaskLineages); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryByProjectCode(@Param("projectCode") long projectCode); |
||||||
|
|
||||||
|
List<WorkFlowRelationDetail> queryWorkFlowLineageByCode(@Param("processDefinitionCode") long processDefinitionCode); |
||||||
|
|
||||||
|
List<WorkFlowRelationDetail> queryWorkFlowLineageByName(@Param("projectCode") long projectCode, |
||||||
|
@Param("processDefinitionName") String processDefinitionName); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryWorkFlowLineageByDept(@Param("deptProjectCode") long deptProjectCode, |
||||||
|
@Param("deptProcessDefinitionCode") long deptProcessDefinitionCode, |
||||||
|
@Param("deptTaskDefinitionCode") long deptTaskDefinitionCode); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryByProcessDefinitionCode(@Param("processDefinitionCode") long processDefinitionCode); |
||||||
|
|
||||||
|
} |
@ -1,148 +0,0 @@ |
|||||||
/* |
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
||||||
* contributor license agreements. See the NOTICE file distributed with |
|
||||||
* this work for additional information regarding copyright ownership. |
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
||||||
* (the "License"); you may not use this file except in compliance with |
|
||||||
* the License. You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.apache.dolphinscheduler.dao.mapper; |
|
||||||
|
|
||||||
import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.ProcessLineage; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.TaskMainInfo; |
|
||||||
import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; |
|
||||||
|
|
||||||
import org.apache.ibatis.annotations.Param; |
|
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
public interface WorkFlowLineageMapper { |
|
||||||
|
|
||||||
/** |
|
||||||
* queryByName |
|
||||||
* |
|
||||||
* @param projectCode projectCode |
|
||||||
* @param workFlowName workFlowName |
|
||||||
* @return WorkFlowLineage list |
|
||||||
*/ |
|
||||||
List<WorkFlowLineage> queryWorkFlowLineageByName(@Param("projectCode") long projectCode, |
|
||||||
@Param("workFlowName") String workFlowName); |
|
||||||
|
|
||||||
/** |
|
||||||
* queryWorkFlowLineageByCode |
|
||||||
* |
|
||||||
* @param projectCode projectCode |
|
||||||
* @param workFlowCode workFlowCode |
|
||||||
* @return WorkFlowLineage |
|
||||||
*/ |
|
||||||
WorkFlowLineage queryWorkFlowLineageByCode(@Param("projectCode") long projectCode, |
|
||||||
@Param("workFlowCode") long workFlowCode); |
|
||||||
|
|
||||||
/** |
|
||||||
* queryWorkFlowLineageByProcessDefinitionCodes |
|
||||||
* |
|
||||||
* @param workFlowCodes workFlowCodes |
|
||||||
* @return WorkFlowLineage |
|
||||||
*/ |
|
||||||
List<WorkFlowLineage> queryWorkFlowLineageByProcessDefinitionCodes(@Param("workFlowCodes") List<Long> workFlowCodes); |
|
||||||
|
|
||||||
/** |
|
||||||
* queryWorkFlowLineageByCode |
|
||||||
* |
|
||||||
* @param processLineages processLineages |
|
||||||
* @return WorkFlowLineage list |
|
||||||
*/ |
|
||||||
List<WorkFlowLineage> queryWorkFlowLineageByLineage(@Param("processLineages") List<ProcessLineage> processLineages); |
|
||||||
|
|
||||||
/** |
|
||||||
* queryProcessLineage |
|
||||||
* |
|
||||||
* @param projectCode projectCode |
|
||||||
* @return ProcessLineage list |
|
||||||
*/ |
|
||||||
List<ProcessLineage> queryProcessLineage(@Param("projectCode") long projectCode); |
|
||||||
|
|
||||||
/** |
|
||||||
* queryCodeRelation |
|
||||||
* |
|
||||||
* @param projectCode projectCode |
|
||||||
* @param processDefinitionCode processDefinitionCode |
|
||||||
* @return ProcessLineage list |
|
||||||
*/ |
|
||||||
List<ProcessLineage> queryProcessLineageByCode(@Param("projectCode") long projectCode, |
|
||||||
@Param("processDefinitionCode") long processDefinitionCode); |
|
||||||
|
|
||||||
/** |
|
||||||
* query process definition by name |
|
||||||
* |
|
||||||
* @return dependent process definition |
|
||||||
*/ |
|
||||||
List<DependentProcessDefinition> queryDependentProcessDefinitionByProcessDefinitionCode(@Param("code") long code); |
|
||||||
|
|
||||||
/** |
|
||||||
* query downstream work flow lineage by process definition code |
|
||||||
* |
|
||||||
* @return dependent process definition |
|
||||||
*/ |
|
||||||
List<WorkFlowLineage> queryDownstreamLineageByProcessDefinitionCode(@Param("code") long code, |
|
||||||
@Param("taskType") String taskType); |
|
||||||
|
|
||||||
/** |
|
||||||
* query upstream work flow dependent task params by process definition code |
|
||||||
* |
|
||||||
* @return task_params |
|
||||||
*/ |
|
||||||
List<DependentProcessDefinition> queryUpstreamDependentParamsByProcessDefinitionCode(@Param("code") long code, |
|
||||||
@Param("taskType") String taskType); |
|
||||||
|
|
||||||
/** |
|
||||||
* Query all tasks type sub process depend on process definition. |
|
||||||
* |
|
||||||
* Query all upstream tasks from task type sub process. |
|
||||||
* |
|
||||||
* @param projectCode Project code want to query tasks dependence |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @return List of TaskMainInfo |
|
||||||
*/ |
|
||||||
List<TaskMainInfo> queryTaskSubProcessDepOnProcess(@Param("projectCode") long projectCode, |
|
||||||
@Param("processDefinitionCode") long processDefinitionCode); |
|
||||||
|
|
||||||
/** |
|
||||||
* Query all tasks type dependent depend on process definition. |
|
||||||
* |
|
||||||
* Query all downstream tasks from task type dependent, method `queryTaskDepOnTask` is a proper subset of |
|
||||||
* current method `queryTaskDepOnProcess`. Which mean with the same parameter processDefinitionCode, all tasks in |
|
||||||
* `queryTaskDepOnTask` are in the result of method `queryTaskDepOnProcess`. |
|
||||||
* |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @param taskCode Task code want to query tasks dependence |
|
||||||
* @return List of TaskMainInfo |
|
||||||
*/ |
|
||||||
List<TaskMainInfo> queryTaskDependentOnProcess(@Param("processDefinitionCode") long processDefinitionCode, |
|
||||||
@Param("taskCode") long taskCode); |
|
||||||
|
|
||||||
/** |
|
||||||
* Query all tasks depend on task, only downstream task support currently(from dependent task type). |
|
||||||
* |
|
||||||
* In case of dependent task type, method `queryTaskDepOnTask` is a proper subset of `queryTaskDepOnProcess`. Which |
|
||||||
* mean with the same processDefinitionCode, all tasks in `queryTaskDepOnTask` are in method `queryTaskDepOnProcess`. |
|
||||||
* |
|
||||||
* @param projectCode Project code want to query tasks dependence |
|
||||||
* @param processDefinitionCode Process definition code want to query tasks dependence |
|
||||||
* @param taskCode Task code want to query tasks dependence |
|
||||||
* @return dependent process definition |
|
||||||
*/ |
|
||||||
List<TaskMainInfo> queryTaskDepOnTask(@Param("projectCode") long projectCode, |
|
||||||
@Param("processDefinitionCode") long processDefinitionCode, |
|
||||||
@Param("taskCode") long taskCode); |
|
||||||
} |
|
@ -0,0 +1,45 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.repository; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public interface ProcessTaskLineageDao extends IDao<ProcessTaskLineage> { |
||||||
|
|
||||||
|
int batchDeleteByProcessDefinitionCode(List<Long> processDefinitionCodes); |
||||||
|
|
||||||
|
int batchInsert(List<ProcessTaskLineage> processTaskLineages); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryByProjectCode(long projectCode); |
||||||
|
|
||||||
|
List<WorkFlowRelationDetail> queryWorkFlowLineageByCode(long processDefinitionCode); |
||||||
|
|
||||||
|
List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode, |
||||||
|
String processDefinitionName); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryWorkFlowLineageByDept(long deptProjectCode, |
||||||
|
long deptProcessDefinitionCode, |
||||||
|
long deptTaskDefinitionCode); |
||||||
|
|
||||||
|
List<ProcessTaskLineage> queryByProcessDefinitionCode(long processDefinitionCode); |
||||||
|
|
||||||
|
int updateProcessTaskLineage(List<ProcessTaskLineage> processTaskLineages); |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.dao.repository.impl; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProcessTaskLineageMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.repository.BaseDao; |
||||||
|
import org.apache.dolphinscheduler.dao.repository.ProcessTaskLineageDao; |
||||||
|
|
||||||
|
import org.apache.commons.collections4.CollectionUtils; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
import lombok.NonNull; |
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository; |
||||||
|
|
||||||
|
@Repository |
||||||
|
public class ProcessTaskLineageDaoImpl extends BaseDao<ProcessTaskLineage, ProcessTaskLineageMapper> |
||||||
|
implements |
||||||
|
ProcessTaskLineageDao { |
||||||
|
|
||||||
|
public ProcessTaskLineageDaoImpl(@NonNull ProcessTaskLineageMapper processTaskLineageMapper) { |
||||||
|
super(processTaskLineageMapper); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int batchDeleteByProcessDefinitionCode(List<Long> processDefinitionCodes) { |
||||||
|
if (CollectionUtils.isEmpty(processDefinitionCodes)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return mybatisMapper.batchDeleteByProcessDefinitionCode(processDefinitionCodes); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int batchInsert(List<ProcessTaskLineage> processTaskLineages) { |
||||||
|
if (CollectionUtils.isEmpty(processTaskLineages)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
return mybatisMapper.batchInsert(processTaskLineages); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ProcessTaskLineage> queryByProjectCode(long projectCode) { |
||||||
|
return mybatisMapper.queryByProjectCode(projectCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<WorkFlowRelationDetail> queryWorkFlowLineageByCode(long processDefinitionCode) { |
||||||
|
return mybatisMapper.queryWorkFlowLineageByCode(processDefinitionCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode, String processDefinitionName) { |
||||||
|
return mybatisMapper.queryWorkFlowLineageByName(projectCode, processDefinitionName); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ProcessTaskLineage> queryWorkFlowLineageByDept(long deptProjectCode, long deptProcessDefinitionCode, |
||||||
|
long deptTaskDefinitionCode) { |
||||||
|
return mybatisMapper.queryWorkFlowLineageByDept(deptProjectCode, deptProcessDefinitionCode, |
||||||
|
deptTaskDefinitionCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<ProcessTaskLineage> queryByProcessDefinitionCode(long processDefinitionCode) { |
||||||
|
return mybatisMapper.queryByProcessDefinitionCode(processDefinitionCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int updateProcessTaskLineage(List<ProcessTaskLineage> processTaskLineages) { |
||||||
|
if (CollectionUtils.isEmpty(processTaskLineages)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
this.batchDeleteByProcessDefinitionCode( |
||||||
|
processTaskLineages.stream().map(ProcessTaskLineage::getProcessDefinitionCode) |
||||||
|
.distinct().collect(Collectors.toList())); |
||||||
|
return mybatisMapper.batchInsert(processTaskLineages); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,133 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||||
|
<!-- |
||||||
|
~ Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
~ contributor license agreements. See the NOTICE file distributed with |
||||||
|
~ this work for additional information regarding copyright ownership. |
||||||
|
~ The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
~ (the "License"); you may not use this file except in compliance with |
||||||
|
~ the License. You may obtain a copy of the License at |
||||||
|
~ |
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
~ |
||||||
|
~ Unless required by applicable law or agreed to in writing, software |
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
~ See the License for the specific language governing permissions and |
||||||
|
~ limitations under the License. |
||||||
|
--> |
||||||
|
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
||||||
|
<mapper namespace="org.apache.dolphinscheduler.dao.mapper.ProcessTaskLineageMapper"> |
||||||
|
<sql id="baseSql"> |
||||||
|
id |
||||||
|
, process_definition_code |
||||||
|
, process_definition_version |
||||||
|
, task_definition_code |
||||||
|
, task_definition_version |
||||||
|
, dept_project_code |
||||||
|
, dept_process_definition_code |
||||||
|
, dept_task_definition_code |
||||||
|
, create_time |
||||||
|
, update_time |
||||||
|
</sql> |
||||||
|
|
||||||
|
<delete id="batchDeleteByProcessDefinitionCode"> |
||||||
|
delete from t_ds_process_task_lineage |
||||||
|
where process_definition_code in |
||||||
|
<foreach collection="processDefinitionCodes" index="index" item="i" open="(" separator="," close=")"> |
||||||
|
#{i} |
||||||
|
</foreach> |
||||||
|
</delete> |
||||||
|
|
||||||
|
<insert id="batchInsert"> |
||||||
|
insert into t_ds_process_task_lineage (process_definition_code, process_definition_version, task_definition_code, |
||||||
|
task_definition_version, dept_project_code, dept_process_definition_code, dept_task_definition_code) |
||||||
|
values |
||||||
|
<foreach collection="processTaskLineages" item="processTaskLineage" separator=","> |
||||||
|
(#{processTaskLineage.processDefinitionCode},#{processTaskLineage.processDefinitionVersion}, |
||||||
|
#{processTaskLineage.taskDefinitionCode},#{processTaskLineage.taskDefinitionVersion}, |
||||||
|
#{processTaskLineage.deptProjectCode},#{processTaskLineage.deptProcessDefinitionCode}, |
||||||
|
#{processTaskLineage.deptTaskDefinitionCode}) |
||||||
|
</foreach> |
||||||
|
</insert> |
||||||
|
|
||||||
|
<select id="queryByProjectCode" resultType="org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage"> |
||||||
|
select |
||||||
|
<include refid="baseSql"/> |
||||||
|
from |
||||||
|
t_ds_process_task_lineage |
||||||
|
where process_definition_code in (select code from t_ds_process_definition where project_code = #{projectCode}) |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryWorkFlowLineageByCode" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail"> |
||||||
|
select |
||||||
|
pd.code as work_flow_code |
||||||
|
,pd.name as work_flow_name |
||||||
|
,pd.release_state as work_flow_publish_status |
||||||
|
,schd.start_time as schedule_start_time |
||||||
|
,schd.end_time as schedule_end_time |
||||||
|
,schd.crontab as crontab |
||||||
|
,schd.release_state as schedule_publish_status |
||||||
|
from t_ds_process_definition pd |
||||||
|
left join t_ds_schedules schd on pd.code = schd.process_definition_code |
||||||
|
where pd.code = #{processDefinitionCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryWorkFlowLineageByName" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail"> |
||||||
|
select |
||||||
|
pd.code as work_flow_code |
||||||
|
,pd.name as work_flow_name |
||||||
|
,pd.release_state as work_flow_publish_status |
||||||
|
,schd.start_time as schedule_start_time |
||||||
|
,schd.end_time as schedule_end_time |
||||||
|
,schd.crontab as crontab |
||||||
|
,schd.release_state as schedule_publish_status |
||||||
|
from t_ds_process_definition pd |
||||||
|
left join t_ds_schedules schd on pd.code = schd.process_definition_code |
||||||
|
where 1=1 |
||||||
|
<if test="processDefinitionName != null and processDefinitionName != ''"> |
||||||
|
and pd.name = #{processDefinitionName} |
||||||
|
</if> |
||||||
|
and pd.project_code = #{projectCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryWorkFlowLineageByCode" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail"> |
||||||
|
select |
||||||
|
pd.code as work_flow_code |
||||||
|
,pd.name as work_flow_name |
||||||
|
,pd.release_state as work_flow_publish_status |
||||||
|
,schd.start_time as schedule_start_time |
||||||
|
,schd.end_time as schedule_end_time |
||||||
|
,schd.crontab as crontab |
||||||
|
,schd.release_state as schedule_publish_status |
||||||
|
from t_ds_process_definition pd |
||||||
|
left join t_ds_schedules schd on pd.code = schd.process_definition_code |
||||||
|
where 1=1 |
||||||
|
and pd.code = #{processDefinitionCode} |
||||||
|
and pd.project_code = #{projectCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryWorkFlowLineageByDept" resultType="org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage"> |
||||||
|
select |
||||||
|
<include refid="baseSql"/> |
||||||
|
from |
||||||
|
t_ds_process_task_lineage |
||||||
|
where 1=1 |
||||||
|
<if test="deptProjectCode != null and deptProjectCode != 0"> |
||||||
|
and dept_project_code = #{deptProjectCode} |
||||||
|
</if> |
||||||
|
and dept_process_definition_code = #{deptProcessDefinitionCode} |
||||||
|
<if test="deptTaskDefinitionCode != null and deptTaskDefinitionCode != 0"> |
||||||
|
and dept_task_definition_code = #{deptTaskDefinitionCode} |
||||||
|
</if> |
||||||
|
</select> |
||||||
|
|
||||||
|
<select id="queryByProcessDefinitionCode" resultType="org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage"> |
||||||
|
select |
||||||
|
<include refid="baseSql"/> |
||||||
|
from |
||||||
|
t_ds_process_task_lineage |
||||||
|
where process_definition_code = #{processDefinitionCode} |
||||||
|
</select> |
||||||
|
|
||||||
|
</mapper> |
@ -1,249 +0,0 @@ |
|||||||
<?xml version="1.0" encoding="UTF-8" ?> |
|
||||||
<!-- |
|
||||||
~ Licensed to the Apache Software Foundation (ASF) under one or more |
|
||||||
~ contributor license agreements. See the NOTICE file distributed with |
|
||||||
~ this work for additional information regarding copyright ownership. |
|
||||||
~ The ASF licenses this file to You under the Apache License, Version 2.0 |
|
||||||
~ (the "License"); you may not use this file except in compliance with |
|
||||||
~ the License. You may obtain a copy of the License at |
|
||||||
~ |
|
||||||
~ http://www.apache.org/licenses/LICENSE-2.0 |
|
||||||
~ |
|
||||||
~ Unless required by applicable law or agreed to in writing, software |
|
||||||
~ distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
~ See the License for the specific language governing permissions and |
|
||||||
~ limitations under the License. |
|
||||||
--> |
|
||||||
|
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
|
||||||
<mapper namespace="org.apache.dolphinscheduler.dao.mapper.WorkFlowLineageMapper"> |
|
||||||
|
|
||||||
<select id="queryWorkFlowLineageByName" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowLineage"> |
|
||||||
select tepd.code as work_flow_code,tepd.name as work_flow_name |
|
||||||
from t_ds_process_definition tepd |
|
||||||
left join t_ds_schedules tes on tepd.code = tes.process_definition_code |
|
||||||
where tepd.project_code = #{projectCode} |
|
||||||
<if test="workFlowName != null and workFlowName != ''"> |
|
||||||
and tepd.name like concat('%', #{workFlowName}, '%') |
|
||||||
</if> |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryWorkFlowLineageByCode" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowLineage"> |
|
||||||
select tepd.code as work_flow_code,tepd.name as work_flow_name, |
|
||||||
'' as source_work_flow_code, |
|
||||||
tepd.release_state as work_flow_publish_status, |
|
||||||
tes.start_time as schedule_start_time, |
|
||||||
tes.end_time as schedule_end_time, |
|
||||||
tes.crontab as crontab, |
|
||||||
tes.release_state as schedule_publish_status |
|
||||||
from t_ds_process_definition tepd |
|
||||||
left join t_ds_schedules tes on tepd.code = tes.process_definition_code |
|
||||||
where tepd.project_code = #{projectCode} and tepd.code = #{workFlowCode} |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryWorkFlowLineageByProcessDefinitionCodes" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowLineage"> |
|
||||||
select tepd.code as work_flow_code, |
|
||||||
tepd.name as work_flow_name, |
|
||||||
tepd.release_state as work_flow_publish_status, |
|
||||||
tes.start_time as schedule_start_time, |
|
||||||
tes.end_time as schedule_end_time, |
|
||||||
tes.crontab as crontab, |
|
||||||
tes.release_state as schedule_publish_status |
|
||||||
from t_ds_process_definition tepd |
|
||||||
left join t_ds_schedules tes on tepd.code = tes.process_definition_code |
|
||||||
where 1=1 |
|
||||||
<if test="workFlowCodes != null and workFlowCodes.size() != 0 "> |
|
||||||
and tepd.code in |
|
||||||
<foreach collection="workFlowCodes" item="code" index="index" open="(" close=")" separator=","> |
|
||||||
#{code} |
|
||||||
</foreach> |
|
||||||
</if> |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryWorkFlowLineageByLineage" resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowLineage"> |
|
||||||
select tepd.code as work_flow_code,tepd.name as work_flow_name, |
|
||||||
'' as source_work_flow_code, |
|
||||||
tepd.release_state as work_flow_publish_status, |
|
||||||
tes.start_time as schedule_start_time, |
|
||||||
tes.end_time as schedule_end_time, |
|
||||||
tes.crontab as crontab, |
|
||||||
tes.release_state as schedule_publish_status |
|
||||||
from t_ds_process_definition tepd |
|
||||||
left join t_ds_schedules tes on tepd.code = tes.process_definition_code |
|
||||||
where 1=1 |
|
||||||
<if test="processLineages != null and processLineages.size != 0"> |
|
||||||
and |
|
||||||
<foreach collection="processLineages" index="index" item="item" open="(" separator=" or " close=")"> |
|
||||||
(tepd.project_code = #{item.projectCode} |
|
||||||
and tepd.code = #{item.processDefinitionCode}) |
|
||||||
</foreach> |
|
||||||
</if> |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryProcessLineage" resultType="org.apache.dolphinscheduler.dao.entity.ProcessLineage"> |
|
||||||
select ptr.project_code, |
|
||||||
ptr.post_task_code, |
|
||||||
ptr.post_task_version, |
|
||||||
ptr.pre_task_code, |
|
||||||
ptr.pre_task_version, |
|
||||||
ptr.process_definition_code, |
|
||||||
ptr.process_definition_version |
|
||||||
from t_ds_process_definition pd |
|
||||||
join t_ds_process_task_relation ptr on pd.code = ptr.process_definition_code |
|
||||||
and pd.version = ptr.process_definition_version |
|
||||||
where pd.project_code = #{projectCode} |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryProcessLineageByCode" resultType="org.apache.dolphinscheduler.dao.entity.ProcessLineage"> |
|
||||||
select project_code, |
|
||||||
post_task_code, |
|
||||||
post_task_version, |
|
||||||
pre_task_code, |
|
||||||
pre_task_version, |
|
||||||
process_definition_code, |
|
||||||
process_definition_version |
|
||||||
from t_ds_process_task_relation |
|
||||||
where project_code = #{projectCode} |
|
||||||
and process_definition_code = #{processDefinitionCode} |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryUpstreamDependentParamsByProcessDefinitionCode" |
|
||||||
resultType="org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition"> |
|
||||||
SELECT |
|
||||||
DISTINCT c.task_params |
|
||||||
FROM |
|
||||||
t_ds_process_definition a |
|
||||||
JOIN t_ds_process_task_relation b ON a.code = b.process_definition_code AND a.version = b.process_definition_version AND a.project_code = b.project_code |
|
||||||
JOIN t_ds_task_definition c ON c.code = b.pre_task_code and c.version = b.pre_task_version |
|
||||||
WHERE 1=1 |
|
||||||
AND a.code = #{code} |
|
||||||
AND c.task_type = #{taskType} |
|
||||||
; |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryDownstreamLineageByProcessDefinitionCode" |
|
||||||
resultType="org.apache.dolphinscheduler.dao.entity.WorkFlowLineage"> |
|
||||||
SELECT |
|
||||||
c.code AS work_flow_code |
|
||||||
,c.name AS work_flow_name |
|
||||||
,c.release_state AS work_flow_publish_status |
|
||||||
,d.start_time AS schedule_start_time |
|
||||||
,d.end_time AS schedule_end_time |
|
||||||
,d.crontab AS crontab |
|
||||||
,d.release_state AS schedule_publish_status |
|
||||||
,'' AS source_work_flow_code |
|
||||||
FROM |
|
||||||
t_ds_task_definition a |
|
||||||
JOIN t_ds_process_task_relation b ON a.code = b.pre_task_code and a.version = b.pre_task_version |
|
||||||
JOIN t_ds_process_definition c ON c.code = b.process_definition_code AND c.version = b.process_definition_version AND c.project_code = b.project_code |
|
||||||
LEFT JOIN t_ds_schedules d ON d.process_definition_code = c.code |
|
||||||
WHERE 1=1 |
|
||||||
<if test="code != null and code != ''"> |
|
||||||
AND a.task_params LIKE concat('%', #{code}, '%') |
|
||||||
</if> |
|
||||||
AND a.task_type = #{taskType} |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryDependentProcessDefinitionByProcessDefinitionCode" resultType="org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition"> |
|
||||||
SELECT |
|
||||||
c.code AS process_definition_code |
|
||||||
,c.name AS process_definition_name |
|
||||||
,c.version as process_definition_version |
|
||||||
,a.code AS task_definition_code |
|
||||||
,a.task_params |
|
||||||
FROM |
|
||||||
t_ds_task_definition a |
|
||||||
JOIN t_ds_process_task_relation b ON a.code = b.pre_task_code and a.version = b.pre_task_version |
|
||||||
JOIN t_ds_process_definition c ON c.code = b.process_definition_code AND c.version = b.process_definition_version AND c.project_code = b.project_code |
|
||||||
WHERE 1=1 |
|
||||||
<if test="code != null and code != ''"> |
|
||||||
AND a.task_params LIKE concat('%', #{code}, '%') |
|
||||||
</if> |
|
||||||
AND a.task_type = 'DEPENDENT' |
|
||||||
AND c.release_state = 1 |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryTaskSubProcessDepOnProcess" resultType="org.apache.dolphinscheduler.dao.entity.TaskMainInfo"> |
|
||||||
select td.id |
|
||||||
, td.name as taskName |
|
||||||
, td.code as taskCode |
|
||||||
, td.version as taskVersion |
|
||||||
, td.task_type as taskType |
|
||||||
, ptr.process_definition_code as processDefinitionCode |
|
||||||
, pd.name as processDefinitionName |
|
||||||
, pd.version as processDefinitionVersion |
|
||||||
, pd.release_state as processReleaseState |
|
||||||
from t_ds_task_definition td |
|
||||||
join t_ds_process_task_relation ptr on ptr.post_task_code = td.code and td.version = ptr.post_task_version |
|
||||||
join t_ds_process_definition pd on pd.code = ptr.process_definition_code and pd.version = ptr.process_definition_version |
|
||||||
<where> |
|
||||||
<if test="projectCode != 0"> |
|
||||||
and ptr.project_code = #{projectCode} |
|
||||||
</if> |
|
||||||
<!-- ptr.process_definition_code != #{processDefinitionCode} query task not in current workflow --> |
|
||||||
<!-- For subprocess task type, using `concat('%"processDefinitionCode":', #{processDefinitionCode}, '%')` --> |
|
||||||
<if test="processDefinitionCode != 0"> |
|
||||||
and td.task_type = 'SUB_PROCESS' |
|
||||||
and ptr.process_definition_code != #{processDefinitionCode} |
|
||||||
and td.task_params like concat('%"processDefinitionCode":', #{processDefinitionCode}, '%') |
|
||||||
</if> |
|
||||||
</where> |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryTaskDependentOnProcess" resultType="org.apache.dolphinscheduler.dao.entity.TaskMainInfo"> |
|
||||||
select td.id |
|
||||||
, td.name as taskName |
|
||||||
, td.code as taskCode |
|
||||||
, td.version as taskVersion |
|
||||||
, td.task_type as taskType |
|
||||||
, pd.project_code as projectCode |
|
||||||
, ptr.process_definition_code as processDefinitionCode |
|
||||||
, pd.name as processDefinitionName |
|
||||||
, pd.version as processDefinitionVersion |
|
||||||
, pd.release_state as processReleaseState |
|
||||||
from t_ds_task_definition td |
|
||||||
join t_ds_process_task_relation ptr on ptr.post_task_code = td.code and td.version = ptr.post_task_version |
|
||||||
join t_ds_process_definition pd on pd.code = ptr.process_definition_code and pd.version = ptr.process_definition_version |
|
||||||
<where> |
|
||||||
<!-- ptr.process_definition_code != #{processDefinitionCode} query task not in current workflow --> |
|
||||||
<!-- For dependnet task type, using `like concat('%"definitionCode":', #{processDefinitionCode}, '%')` --> |
|
||||||
<if test="processDefinitionCode != 0"> |
|
||||||
and td.task_type = 'DEPENDENT' |
|
||||||
and ptr.process_definition_code != #{processDefinitionCode} |
|
||||||
and td.task_params like concat('%"definitionCode":', #{processDefinitionCode}, '%') |
|
||||||
</if> |
|
||||||
<if test="taskCode != 0"> |
|
||||||
and (td.task_params like concat('%"depTaskCode":', #{taskCode}, '%') or td.task_params like concat('%"depTaskCode":-1%')) |
|
||||||
</if> |
|
||||||
</where> |
|
||||||
</select> |
|
||||||
|
|
||||||
<select id="queryTaskDepOnTask" resultType="org.apache.dolphinscheduler.dao.entity.TaskMainInfo"> |
|
||||||
select td.id |
|
||||||
, td.name as taskName |
|
||||||
, td.code as taskCode |
|
||||||
, td.version as taskVersion |
|
||||||
, td.task_type as taskType |
|
||||||
, ptr.process_definition_code as processDefinitionCode |
|
||||||
, pd.name as processDefinitionName |
|
||||||
, pd.version as processDefinitionVersion |
|
||||||
, pd.release_state as processReleaseState |
|
||||||
from t_ds_task_definition td |
|
||||||
join t_ds_process_task_relation ptr on ptr.post_task_code = td.code and td.version = ptr.post_task_version |
|
||||||
join t_ds_process_definition pd on pd.code = ptr.process_definition_code and pd.version = ptr.process_definition_version |
|
||||||
<where> |
|
||||||
<if test="projectCode != 0"> |
|
||||||
and ptr.project_code = #{projectCode} |
|
||||||
</if> |
|
||||||
<!-- ptr.process_definition_code != #{processDefinitionCode} query task not in current workflow --> |
|
||||||
<if test="processDefinitionCode != 0"> |
|
||||||
and ptr.process_definition_code != #{processDefinitionCode} |
|
||||||
and td.task_params like concat('%"definitionCode":', #{processDefinitionCode}, '%') |
|
||||||
</if> |
|
||||||
<if test="taskCode != 0"> |
|
||||||
and td.task_params like concat('%"depTaskCode":', #{taskCode}, '%') |
|
||||||
</if> |
|
||||||
</where> |
|
||||||
</select> |
|
||||||
</mapper> |
|
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `t_ds_process_task_lineage`; |
||||||
|
CREATE TABLE `t_ds_process_task_lineage` |
||||||
|
( |
||||||
|
`id` int NOT NULL AUTO_INCREMENT, |
||||||
|
`process_definition_code` bigint NOT NULL DEFAULT 0, |
||||||
|
`process_definition_version` int NOT NULL DEFAULT 0, |
||||||
|
`task_definition_code` bigint NOT NULL DEFAULT 0, |
||||||
|
`task_definition_version` int NOT NULL DEFAULT 0, |
||||||
|
`dept_project_code` bigint NOT NULL DEFAULT 0 COMMENT 'dependent project code', |
||||||
|
`dept_process_definition_code` bigint NOT NULL DEFAULT 0 COMMENT 'dependent process definition code', |
||||||
|
`dept_task_definition_code` bigint NOT NULL DEFAULT 0 COMMENT 'dependent task definition code', |
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create time', |
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'update time', |
||||||
|
PRIMARY KEY (`id`), |
||||||
|
KEY `idx_process_code_version` (`process_definition_code`,`process_definition_version`), |
||||||
|
KEY `idx_task_code_version` (`task_definition_code`,`task_definition_version`), |
||||||
|
KEY `idx_dept_code` (`dept_project_code`,`dept_process_definition_code`,`dept_task_definition_code`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
@ -0,0 +1,16 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t_ds_process_task_lineage; |
||||||
|
CREATE TABLE t_ds_process_task_lineage ( |
||||||
|
id int NOT NULL, |
||||||
|
process_definition_code bigint NOT NULL DEFAULT 0, |
||||||
|
process_definition_version int NOT NULL DEFAULT 0, |
||||||
|
task_definition_code bigint NOT NULL DEFAULT 0, |
||||||
|
task_definition_version int NOT NULL DEFAULT 0, |
||||||
|
dept_project_code bigint NOT NULL DEFAULT 0, |
||||||
|
dept_process_definition_code bigint NOT NULL DEFAULT 0, |
||||||
|
dept_task_definition_code bigint NOT NULL DEFAULT 0, |
||||||
|
create_time timestamp NOT NULL DEFAULT current_timestamp, |
||||||
|
update_time timestamp NOT NULL DEFAULT current_timestamp, |
||||||
|
PRIMARY KEY (id) |
||||||
|
); |
||||||
|
|
||||||
|
create index idx_process_code_version on t_ds_process_task_lineage (process_definition_code,process_definition_version); |
||||||
|
create index idx_task_code_version on t_ds_process_task_lineage (task_definition_code,task_definition_version); |
||||||
|
create index idx_dept_code on t_ds_process_task_lineage (dept_project_code,dept_process_definition_code,dept_task_definition_code); |
@ -0,0 +1,16 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
@ -0,0 +1,31 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# |
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
# contributor license agreements. See the NOTICE file distributed with |
||||||
|
# this work for additional information regarding copyright ownership. |
||||||
|
# The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
# (the "License"); you may not use this file except in compliance with |
||||||
|
# the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
# |
||||||
|
|
||||||
|
BIN_DIR=$(dirname $0) |
||||||
|
DOLPHINSCHEDULER_HOME=${DOLPHINSCHEDULER_HOME:-$(cd $BIN_DIR/../..; pwd)} |
||||||
|
|
||||||
|
if [ "$DOCKER" != "true" ]; then |
||||||
|
source "$DOLPHINSCHEDULER_HOME/bin/env/dolphinscheduler_env.sh" |
||||||
|
fi |
||||||
|
|
||||||
|
JAVA_OPTS=${JAVA_OPTS:-"-server -Duser.timezone=${SPRING_JACKSON_TIME_ZONE} -Xms4g -Xmx4g -Xmn512m -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof"} |
||||||
|
|
||||||
|
$JAVA_HOME/bin/java $JAVA_OPTS \ |
||||||
|
-cp "$DOLPHINSCHEDULER_HOME/tools/conf":"$DOLPHINSCHEDULER_HOME/tools/libs/*":"$DOLPHINSCHEDULER_HOME/tools/sql" \ |
||||||
|
-Dspring.profiles.active=lineage,${DATABASE} \ |
||||||
|
org.apache.dolphinscheduler.tools.lineage.MigrateLineage |
@ -0,0 +1,56 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.tools.lineage; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.tools.resource.MigrateResource; |
||||||
|
|
||||||
|
import java.sql.SQLException; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.boot.CommandLineRunner; |
||||||
|
import org.springframework.boot.SpringApplication; |
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||||
|
import org.springframework.context.annotation.ComponentScan; |
||||||
|
import org.springframework.context.annotation.Profile; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
@SpringBootApplication |
||||||
|
@ComponentScan("org.apache.dolphinscheduler") |
||||||
|
@Slf4j |
||||||
|
public class MigrateLineage { |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
SpringApplication.run(MigrateResource.class, args); |
||||||
|
} |
||||||
|
|
||||||
|
@Component |
||||||
|
@Profile("lineage") |
||||||
|
static class MigrateLineageRunner implements CommandLineRunner { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private MigrateLineageService migrateLineageService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run(String... args) throws SQLException { |
||||||
|
log.info("Starting Migrate lineage data..."); |
||||||
|
migrateLineageService.migrateLineageOnce(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,120 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.apache.dolphinscheduler.tools.lineage; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.TaskDefinition; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.repository.ProcessTaskLineageDao; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.model.DependentItem; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.model.DependentTaskModel; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.parameters.DependentParameters; |
||||||
|
import org.apache.dolphinscheduler.plugin.task.api.task.DependentLogicTaskChannelFactory; |
||||||
|
|
||||||
|
import org.apache.commons.collections.CollectionUtils; |
||||||
|
|
||||||
|
import java.sql.SQLException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
public class MigrateLineageService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TaskDefinitionMapper taskDefinitionMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProcessTaskLineageDao processTaskLineageDao; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProcessTaskRelationMapper processTaskRelationMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProcessDefinitionMapper processDefinitionMapper; |
||||||
|
|
||||||
|
public void migrateLineageOnce() { |
||||||
|
try { |
||||||
|
List<ProcessTaskLineage> processTaskLineageList = getAllProcessLineages(); |
||||||
|
int insertResult = processTaskLineageDao.batchInsert(processTaskLineageList); |
||||||
|
if (insertResult > 0) { |
||||||
|
log.info("Migrate lineage successfully, insert count: {}", insertResult); |
||||||
|
} else { |
||||||
|
log.info("No lineage to migrate."); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
log.error("Failed to migrate lineage:", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private List<ProcessTaskLineage> getAllProcessLineages() throws SQLException { |
||||||
|
List<TaskDefinition> taskDefinitionList = |
||||||
|
taskDefinitionMapper.queryDefinitionsByTaskType(DependentLogicTaskChannelFactory.NAME); |
||||||
|
List<ProcessTaskRelation> processTaskRelationList = |
||||||
|
processTaskRelationMapper.queryByTaskCodes(taskDefinitionList.stream() |
||||||
|
.map(TaskDefinition::getCode).toArray(Long[]::new)); |
||||||
|
List<ProcessTaskLineage> processTaskLineageList = new ArrayList<>(); |
||||||
|
|
||||||
|
for (TaskDefinition taskDefinition : taskDefinitionList) { |
||||||
|
parseDependentTaskParams(taskDefinition, processTaskLineageList); |
||||||
|
|
||||||
|
for (ProcessTaskLineage processTaskLineage : processTaskLineageList) { |
||||||
|
processTaskLineage.setProcessDefinitionCode(processTaskRelationList.stream() |
||||||
|
.filter(processTaskRelation -> processTaskRelation.getPreTaskCode() == taskDefinition.getCode() |
||||||
|
|| processTaskRelation.getPostTaskCode() == taskDefinition.getCode()) |
||||||
|
.findFirst().get().getProcessDefinitionCode()); |
||||||
|
processTaskLineage.setProcessDefinitionVersion(processTaskRelationList.stream() |
||||||
|
.filter(processTaskRelation -> processTaskRelation.getPreTaskCode() == taskDefinition.getCode() |
||||||
|
|| processTaskRelation.getPostTaskCode() == taskDefinition.getCode()) |
||||||
|
.findFirst().get().getProcessDefinitionVersion()); |
||||||
|
} |
||||||
|
} |
||||||
|
return processTaskLineageList; |
||||||
|
} |
||||||
|
|
||||||
|
private void parseDependentTaskParams(TaskDefinition taskDefinition, List<ProcessTaskLineage> taskLineageList) { |
||||||
|
DependentParameters dependentParameters = |
||||||
|
JSONUtils.parseObject(taskDefinition.getTaskParams(), DependentParameters.class); |
||||||
|
if (dependentParameters != null) { |
||||||
|
List<DependentTaskModel> dependTaskList = |
||||||
|
dependentParameters.getDependence().getDependTaskList(); |
||||||
|
if (!CollectionUtils.isEmpty(dependTaskList)) { |
||||||
|
for (DependentTaskModel taskModel : dependTaskList) { |
||||||
|
List<DependentItem> dependItemList = taskModel.getDependItemList(); |
||||||
|
for (DependentItem dependentItem : dependItemList) { |
||||||
|
ProcessTaskLineage processTaskLineage = new ProcessTaskLineage(); |
||||||
|
processTaskLineage.setDeptProjectCode(dependentItem.getProjectCode()); |
||||||
|
processTaskLineage.setDeptProcessDefinitionCode(dependentItem.getDefinitionCode()); |
||||||
|
processTaskLineage.setDeptTaskDefinitionCode(dependentItem.getDepTaskCode()); |
||||||
|
taskLineageList.add(processTaskLineage); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue