|
@@ -20,20 +20,32 @@ package org.apache.dolphinscheduler.api.service.impl;
|
|
|
import org.apache.dolphinscheduler.api.enums.Status;
|
|
|
import org.apache.dolphinscheduler.api.service.WorkFlowLineageService;
|
|
|
import org.apache.dolphinscheduler.common.Constants;
|
|
|
+import org.apache.dolphinscheduler.common.enums.TaskType;
|
|
|
+import org.apache.dolphinscheduler.common.model.DependentItem;
|
|
|
+import org.apache.dolphinscheduler.common.model.DependentTaskModel;
|
|
|
+import org.apache.dolphinscheduler.common.task.dependent.DependentParameters;
|
|
|
+import org.apache.dolphinscheduler.common.utils.JSONUtils;
|
|
|
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.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.WorkFlowLineageMapper;
|
|
|
+import org.apache.dolphinscheduler.spi.utils.StringUtils;
|
|
|
|
|
|
-import org.apache.commons.lang.StringUtils;
|
|
|
+import org.apache.curator.shaded.com.google.common.collect.Sets;
|
|
|
|
|
|
+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.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -50,6 +62,9 @@ public class WorkFlowLineageServiceImpl extends BaseServiceImpl implements WorkF
|
|
|
@Autowired
|
|
|
private ProjectMapper projectMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private TaskDefinitionLogMapper taskDefinitionLogMapper;
|
|
|
+
|
|
|
@Override
|
|
|
public Map<String, Object> queryWorkFlowLineageByName(long projectCode, String workFlowName) {
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
@@ -72,12 +87,47 @@ public class WorkFlowLineageServiceImpl extends BaseServiceImpl implements WorkF
|
|
|
putMsg(result, Status.PROJECT_NOT_FOUNT, projectCode);
|
|
|
return result;
|
|
|
}
|
|
|
- WorkFlowLineage workFlowLineage = workFlowLineageMapper.queryWorkFlowLineageByCode(projectCode, workFlowCode);
|
|
|
- result.put(Constants.DATA_LIST, workFlowLineage);
|
|
|
+ Map<Long, WorkFlowLineage> workFlowLineagesMap = new HashMap<>();
|
|
|
+ Set<WorkFlowRelation> workFlowRelations = new HashSet<>();
|
|
|
+ Set<Long> sourceWorkFlowCodes = Sets.newHashSet(workFlowCode);
|
|
|
+ recursiveWorkFlow(projectCode, workFlowLineagesMap, workFlowRelations, sourceWorkFlowCodes);
|
|
|
+ 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 void recursiveWorkFlow(long projectCode,
|
|
|
+ Map<Long, WorkFlowLineage> workFlowLineagesMap,
|
|
|
+ Set<WorkFlowRelation> workFlowRelations,
|
|
|
+ Set<Long> sourceWorkFlowCodes) {
|
|
|
+ for (Long workFlowCode : sourceWorkFlowCodes) {
|
|
|
+ WorkFlowLineage workFlowLineage = workFlowLineageMapper.queryWorkFlowLineageByCode(projectCode, workFlowCode);
|
|
|
+ workFlowLineagesMap.put(workFlowCode, workFlowLineage);
|
|
|
+ List<ProcessLineage> processLineages = workFlowLineageMapper.queryProcessLineageByCode(projectCode, workFlowCode);
|
|
|
+ List<TaskDefinition> taskDefinitionList = new ArrayList<>();
|
|
|
+ for (ProcessLineage processLineage : processLineages) {
|
|
|
+ if (processLineage.getPreTaskCode() > 0) {
|
|
|
+ taskDefinitionList.add(new TaskDefinition(processLineage.getPreTaskCode(), processLineage.getPreTaskVersion()));
|
|
|
+ }
|
|
|
+ if (processLineage.getPostTaskCode() > 0) {
|
|
|
+ taskDefinitionList.add(new TaskDefinition(processLineage.getPostTaskCode(), processLineage.getPostTaskVersion()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sourceWorkFlowCodes = querySourceWorkFlowCodes(projectCode, workFlowCode, taskDefinitionList);
|
|
|
+ if (sourceWorkFlowCodes.isEmpty()) {
|
|
|
+ workFlowRelations.add(new WorkFlowRelation(0L, workFlowCode));
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ workFlowLineagesMap.get(workFlowCode).setSourceWorkFlowCode(StringUtils.join(sourceWorkFlowCodes, Constants.COMMA));
|
|
|
+ sourceWorkFlowCodes.forEach(code -> workFlowRelations.add(new WorkFlowRelation(code, workFlowCode)));
|
|
|
+ recursiveWorkFlow(projectCode, workFlowLineagesMap, workFlowRelations, sourceWorkFlowCodes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Map<String, Object> queryWorkFlowLineage(long projectCode) {
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
@@ -87,58 +137,65 @@ public class WorkFlowLineageServiceImpl extends BaseServiceImpl implements WorkF
|
|
|
return result;
|
|
|
}
|
|
|
List<ProcessLineage> processLineages = workFlowLineageMapper.queryProcessLineage(projectCode);
|
|
|
-
|
|
|
- Map<Long, WorkFlowLineage> workFlowLineages = new HashMap<>();
|
|
|
+ Map<Long, WorkFlowLineage> workFlowLineagesMap = new HashMap<>();
|
|
|
Set<WorkFlowRelation> workFlowRelations = new HashSet<>();
|
|
|
-
|
|
|
- for (ProcessLineage processLineage : processLineages) {
|
|
|
- getRelation(workFlowLineages, workFlowRelations, processLineage);
|
|
|
+ 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, workFlowLineages.values());
|
|
|
+ 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 void getRelation(Map<Long, WorkFlowLineage> workFlowLineageMap,
|
|
|
- Set<WorkFlowRelation> workFlowRelations,
|
|
|
- ProcessLineage processLineage) {
|
|
|
- List<ProcessLineage> relations = workFlowLineageMapper.queryCodeRelation(processLineage.getProjectCode(),
|
|
|
- processLineage.getProcessDefinitionCode(), processLineage.getPostTaskCode(), processLineage.getPostTaskVersion());
|
|
|
- if (!relations.isEmpty()) {
|
|
|
- Set<Long> preWorkFlowCodes = new HashSet<>();
|
|
|
- List<ProcessLineage> preRelations = workFlowLineageMapper.queryCodeRelation(processLineage.getProjectCode(),
|
|
|
- processLineage.getProcessDefinitionCode(), processLineage.getPreTaskCode(), processLineage.getPreTaskVersion());
|
|
|
- for (ProcessLineage preRelation : preRelations) {
|
|
|
- preWorkFlowCodes.add(preRelation.getProcessDefinitionCode());
|
|
|
- }
|
|
|
- ProcessLineage postRelation = relations.get(0);
|
|
|
- WorkFlowLineage post = workFlowLineageMapper.queryWorkFlowLineageByCode(postRelation.getProjectCode(), postRelation.getProcessDefinitionCode());
|
|
|
- preWorkFlowCodes.remove(post.getWorkFlowCode());
|
|
|
- if (!workFlowLineageMap.containsKey(post.getWorkFlowCode())) {
|
|
|
- post.setSourceWorkFlowCode(StringUtils.join(preWorkFlowCodes, ","));
|
|
|
- workFlowLineageMap.put(post.getWorkFlowCode(), post);
|
|
|
- } else {
|
|
|
- WorkFlowLineage workFlowLineage = workFlowLineageMap.get(post.getWorkFlowCode());
|
|
|
- String sourceWorkFlowCode = workFlowLineage.getSourceWorkFlowCode();
|
|
|
- if (StringUtils.isBlank(sourceWorkFlowCode)) {
|
|
|
- post.setSourceWorkFlowCode(StringUtils.join(preWorkFlowCodes, ","));
|
|
|
- } else {
|
|
|
- if (!preWorkFlowCodes.isEmpty()) {
|
|
|
- workFlowLineage.setSourceWorkFlowCode(sourceWorkFlowCode + "," + StringUtils.join(preWorkFlowCodes, ","));
|
|
|
+ private Set<Long> querySourceWorkFlowCodes(long projectCode, long workFlowCode, List<TaskDefinition> taskDefinitionList) {
|
|
|
+ Set<Long> sourceWorkFlowCodes = new HashSet<>();
|
|
|
+ List<TaskDefinitionLog> taskDefinitionLogs = taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitionList);
|
|
|
+ for (TaskDefinitionLog taskDefinitionLog : taskDefinitionLogs) {
|
|
|
+ if (taskDefinitionLog.getProjectCode() == projectCode) {
|
|
|
+ if (taskDefinitionLog.getTaskType().equals(TaskType.DEPENDENT.getDesc())) {
|
|
|
+ DependentParameters dependentParameters = JSONUtils.parseObject(taskDefinitionLog.getDependence(), DependentParameters.class);
|
|
|
+ if (dependentParameters != null) {
|
|
|
+ List<DependentTaskModel> dependTaskList = dependentParameters.getDependTaskList();
|
|
|
+ for (DependentTaskModel taskModel : dependTaskList) {
|
|
|
+ List<DependentItem> dependItemList = taskModel.getDependItemList();
|
|
|
+ for (DependentItem dependentItem : dependItemList) {
|
|
|
+ if (dependentItem.getProjectCode() == projectCode && dependentItem.getDefinitionCode() != workFlowCode) {
|
|
|
+ sourceWorkFlowCodes.add(dependentItem.getDefinitionCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (preWorkFlowCodes.isEmpty()) {
|
|
|
- workFlowRelations.add(new WorkFlowRelation(0L, post.getWorkFlowCode()));
|
|
|
- } else {
|
|
|
- for (long workFlowCode : preWorkFlowCodes) {
|
|
|
- workFlowRelations.add(new WorkFlowRelation(workFlowCode, post.getWorkFlowCode()));
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
+ return sourceWorkFlowCodes;
|
|
|
}
|
|
|
}
|