This is an automated email from the ASF dual-hosted git repository.

leonbao pushed a commit to branch json_split
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/json_split by this push:
     new 67eae43  [Feature-4417][JsonSplit] refactor process dag generate 
(#4790)
67eae43 is described below

commit 67eae43154b7638f2777bdf98d1f66a7e2afa287
Author: bao liang <[email protected]>
AuthorDate: Thu Feb 18 17:19:33 2021 +0800

    [Feature-4417][JsonSplit] refactor process dag generate (#4790)
    
    * #4417 [JsonSplit] refactor dag generate
    
    * #4417 [JsonSplit] refactor dag generate
    
    * #4417 [JsonSplit] add postNodeVersion and preNodeVersion
    
    * #4417 [JsonSplit] code style
    
    * #4417 [JsonSplit] code style
    
    * #4417 [JsonSplit] code style
---
 .../api/service/ProcessInstanceService.java        | 100 +++++++++++----------
 .../service/impl/ProcessDefinitionServiceImpl.java |  36 ++------
 .../dao/entity/ProcessTaskRelation.java            |  26 ++++++
 .../dao/entity/ProcessTaskRelationLog.java         |  26 ++++++
 .../dolphinscheduler/dao/entity/TaskInstance.java  |   6 +-
 .../dolphinscheduler/dao/utils/DagHelper.java      |  32 +++++++
 .../dao/mapper/ProcessTaskRelationLogMapper.xml    |   4 +-
 .../dao/mapper/ProcessTaskRelationMapper.xml       |   4 +-
 .../service/process/ProcessService.java            |  32 +++++++
 sql/dolphinscheduler-postgre.sql                   |   4 +
 sql/dolphinscheduler_mysql.sql                     |   4 +
 11 files changed, 194 insertions(+), 80 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
index ebc2bc5..21ba828 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
@@ -47,14 +47,18 @@ import org.apache.dolphinscheduler.common.utils.StringUtils;
 import org.apache.dolphinscheduler.common.utils.placeholder.BusinessTimeUtils;
 import org.apache.dolphinscheduler.dao.entity.ProcessData;
 import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
+import org.apache.dolphinscheduler.dao.entity.ProcessDefinitionLog;
 import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
 import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.TaskDefinitionLog;
 import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 import org.apache.dolphinscheduler.dao.entity.Tenant;
 import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
 import org.apache.dolphinscheduler.dao.utils.DagHelper;
 import org.apache.dolphinscheduler.service.process.ProcessService;
@@ -93,6 +97,9 @@ public class ProcessInstanceService extends BaseService {
 
     private static final Logger logger = 
LoggerFactory.getLogger(ProcessInstanceService.class);
 
+    public static final String TASK_TYPE = "taskType";
+    public static final String LOCAL_PARAMS_LIST = "localParamsList";
+
     @Autowired
     ProjectMapper projectMapper;
 
@@ -123,6 +130,11 @@ public class ProcessInstanceService extends BaseService {
     @Autowired
     LoggerService loggerService;
 
+    @Autowired
+    ProcessDefinitionLogMapper processDefinitionLogMapper;
+
+    @Autowired
+    TaskDefinitionLogMapper taskDefinitionLogMapper;
 
     @Autowired
     UsersService usersService;
@@ -608,34 +620,47 @@ public class ProcessInstanceService extends BaseService {
         Map<String, String> timeParams = BusinessTimeUtils
                 .getBusinessTime(processInstance.getCmdTypeIfComplement(),
                         processInstance.getScheduleTime());
-
-        String workflowInstanceJson = processInstance.getProcessInstanceJson();
-
-        ProcessData workflowData = JSONUtils.parseObject(workflowInstanceJson, 
ProcessData.class);
-
         String userDefinedParams = processInstance.getGlobalParams();
-
         // global params
         List<Property> globalParams = new ArrayList<>();
 
-        if (userDefinedParams != null && userDefinedParams.length() > 0) {
-            globalParams = JSONUtils.toList(userDefinedParams, Property.class);
-        }
-
-        List<TaskNode> taskNodeList = workflowData.getTasks();
-
         // global param string
-        String globalParamStr = JSONUtils.toJsonString(globalParams);
-        globalParamStr = 
ParameterUtils.convertParameterPlaceholders(globalParamStr, timeParams);
+        String globalParamStr = 
ParameterUtils.convertParameterPlaceholders(JSONUtils.toJsonString(globalParams),
 timeParams);
         globalParams = JSONUtils.toList(globalParamStr, Property.class);
         for (Property property : globalParams) {
             timeParams.put(property.getProp(), property.getValue());
         }
 
-        // local params
+        if (userDefinedParams != null && userDefinedParams.length() > 0) {
+            globalParams = JSONUtils.toList(userDefinedParams, Property.class);
+        }
+
+        Map<String, Map<String, Object>> localUserDefParams = 
getLocalParams(processInstance, timeParams);
+
+        Map<String, Object> resultMap = new HashMap<>();
+
+        resultMap.put(GLOBAL_PARAMS, globalParams);
+        resultMap.put(LOCAL_PARAMS, localUserDefParams);
+
+        result.put(DATA_LIST, resultMap);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * get local params
+     *
+     * @param processInstance
+     * @param timeParams
+     * @return
+     */
+    private Map<String, Map<String, Object>> getLocalParams(ProcessInstance 
processInstance, Map<String, String> timeParams) {
         Map<String, Map<String, Object>> localUserDefParams = new HashMap<>();
-        for (TaskNode taskNode : taskNodeList) {
-            String parameter = taskNode.getParams();
+        List<TaskInstance> taskInstanceList = 
taskInstanceMapper.findValidTaskListByProcessId(processInstance.getId(), 
Flag.YES);
+        for (TaskInstance taskInstance : taskInstanceList) {
+            TaskDefinitionLog taskDefinitionLog = 
taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(
+                    taskInstance.getTaskCode(), 
taskInstance.getTaskDefinitionVersion());
+            String parameter = taskDefinitionLog.getTaskParams();
             Map<String, String> map = JSONUtils.toMap(parameter);
             String localParams = map.get(LOCAL_PARAMS);
             if (localParams != null && !localParams.isEmpty()) {
@@ -643,23 +668,15 @@ public class ProcessInstanceService extends BaseService {
                 List<Property> localParamsList = JSONUtils.toList(localParams, 
Property.class);
 
                 Map<String, Object> localParamsMap = new HashMap<>();
-                localParamsMap.put("taskType", taskNode.getType());
-                localParamsMap.put("localParamsList", localParamsList);
+                localParamsMap.put(TASK_TYPE, taskDefinitionLog.getTaskType());
+                localParamsMap.put(LOCAL_PARAMS_LIST, localParamsList);
                 if (CollectionUtils.isNotEmpty(localParamsList)) {
-                    localUserDefParams.put(taskNode.getName(), localParamsMap);
+                    localUserDefParams.put(taskDefinitionLog.getName(), 
localParamsMap);
                 }
             }
 
         }
-
-        Map<String, Object> resultMap = new HashMap<>();
-
-        resultMap.put(GLOBAL_PARAMS, globalParams);
-        resultMap.put(LOCAL_PARAMS, localUserDefParams);
-
-        result.put(DATA_LIST, resultMap);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return localUserDefParams;
     }
 
     /**
@@ -678,9 +695,15 @@ public class ProcessInstanceService extends BaseService {
             throw new RuntimeException("workflow instance is null");
         }
 
-        GanttDto ganttDto = new GanttDto();
+        ProcessDefinitionLog processDefinitionLog = 
processDefinitionLogMapper.queryByDefinitionCodeAndVersion(
+                processInstance.getProcessDefinitionCode(),
+                processInstance.getProcessDefinitionVersion()
+        );
+        ProcessDefinition processDefinition = 
JSONUtils.parseObject(JSONUtils.toJsonString(processDefinitionLog),
+                ProcessDefinition.class);
 
-        DAG<String, TaskNode, TaskNodeRelation> dag = 
processInstance2DAG(processInstance);
+        GanttDto ganttDto = new GanttDto();
+        DAG<String, TaskNode, TaskNodeRelation> dag = 
processService.genDagGraph(processDefinition);
         //topological sort
         List<String> nodeList = dag.topologicalSort();
 
@@ -713,21 +736,6 @@ public class ProcessInstanceService extends BaseService {
     }
 
     /**
-     * process instance to DAG
-     *
-     * @param processInstance input process instance
-     * @return process instance dag.
-     */
-    private static DAG<String, TaskNode, TaskNodeRelation> 
processInstance2DAG(ProcessInstance processInstance) {
-
-        String processDefinitionJson = 
processInstance.getProcessInstanceJson();
-        ProcessData processData = JSONUtils.parseObject(processDefinitionJson, 
ProcessData.class);
-        List<TaskNode> taskNodeList = processData.getTasks();
-        ProcessDag processDag = DagHelper.getProcessDag(taskNodeList);
-        return DagHelper.buildDagGraph(processDag);
-    }
-
-    /**
      * query process instance by processDefinitionId and stateArray
      *
      * @param processDefinitionId processDefinitionId
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index acdaae8..9850116 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -44,7 +44,6 @@ import org.apache.dolphinscheduler.common.enums.WarningType;
 import org.apache.dolphinscheduler.common.graph.DAG;
 import org.apache.dolphinscheduler.common.model.TaskNode;
 import org.apache.dolphinscheduler.common.model.TaskNodeRelation;
-import org.apache.dolphinscheduler.common.process.ProcessDag;
 import org.apache.dolphinscheduler.common.process.ResourceInfo;
 import org.apache.dolphinscheduler.common.task.AbstractParameters;
 import org.apache.dolphinscheduler.common.thread.Stopper;
@@ -66,11 +65,12 @@ import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
+import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
-import org.apache.dolphinscheduler.dao.utils.DagHelper;
 import org.apache.dolphinscheduler.service.permission.PermissionCheck;
 import org.apache.dolphinscheduler.service.process.ProcessService;
 
@@ -150,6 +150,12 @@ public class ProcessDefinitionServiceImpl extends 
BaseService implements
     @Autowired
     private ProcessTaskRelationMapper processTaskRelationMapper;
 
+    @Autowired
+    private ProcessTaskRelationLogMapper processTaskRelationLogMapper;
+
+    @Autowired
+    TaskDefinitionLogMapper taskDefinitionLogMapper;
+
     /**
      * create process definition
      *
@@ -1275,7 +1281,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseService implements
             putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processDefinition);
             return result;
         }
-        DAG<String, TaskNode, TaskNodeRelation> dag = 
genDagGraph(processDefinition);
+        DAG<String, TaskNode, TaskNodeRelation> dag = 
processService.genDagGraph(processDefinition);
         /**
          * nodes that is running
          */
@@ -1385,30 +1391,6 @@ public class ProcessDefinitionServiceImpl extends 
BaseService implements
         return result;
     }
 
-    /**
-     * Generate the DAG Graph based on the process definition id
-     *
-     * @param processDefinition process definition
-     * @return dag graph
-     */
-    private DAG<String, TaskNode, TaskNodeRelation> 
genDagGraph(ProcessDefinition processDefinition) {
-
-        String processDefinitionJson = 
processDefinition.getProcessDefinitionJson();
-
-        ProcessData processData = JSONUtils.parseObject(processDefinitionJson, 
ProcessData.class);
-
-        //check process data
-        if (null != processData) {
-            List<TaskNode> taskNodeList = processData.getTasks();
-            
processDefinition.setGlobalParamList(processData.getGlobalParams());
-            ProcessDag processDag = DagHelper.getProcessDag(taskNodeList);
-
-            // Generate concrete Dag to be executed
-            return DagHelper.buildDagGraph(processDag);
-        }
-
-        return new DAG<>();
-    }
 
     /**
      * whether the graph has a ring
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelation.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelation.java
index 13a804d..9633abe 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelation.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelation.java
@@ -71,11 +71,21 @@ public class ProcessTaskRelation {
     private long preTaskCode;
 
     /**
+     * pre node version
+     */
+    private int preNodeVersion;
+
+    /**
      * post task code
      */
     private long postTaskCode;
 
     /**
+     * post node version
+     */
+    private int postNodeVersion;
+
+    /**
      * condition type
      */
     private ConditionType conditionType;
@@ -248,4 +258,20 @@ public class ProcessTaskRelation {
     public void setConditionType(ConditionType conditionType) {
         this.conditionType = conditionType;
     }
+
+    public int getPreNodeVersion() {
+        return preNodeVersion;
+    }
+
+    public void setPreNodeVersion(int preNodeVersion) {
+        this.preNodeVersion = preNodeVersion;
+    }
+
+    public int getPostNodeVersion() {
+        return postNodeVersion;
+    }
+
+    public void setPostNodeVersion(int postNodeVersion) {
+        this.postNodeVersion = postNodeVersion;
+    }
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelationLog.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelationLog.java
index 523bf4e..f858d98 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelationLog.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskRelationLog.java
@@ -72,11 +72,21 @@ public class ProcessTaskRelationLog {
     private long preTaskCode;
 
     /**
+     * pre node version
+     */
+    private int preNodeVersion;
+
+    /**
      * post task code
      */
     private long postTaskCode;
 
     /**
+     * post node version
+     */
+    private int postNodeVersion;
+
+    /**
      * condition type
      */
     private ConditionType conditionType;
@@ -262,4 +272,20 @@ public class ProcessTaskRelationLog {
         this.conditionType = processTaskRelation.getConditionType();
         this.conditionParams = processTaskRelation.getConditionParams();
     }
+
+    public int getPostNodeVersion() {
+        return postNodeVersion;
+    }
+
+    public void setPostNodeVersion(int postNodeVersion) {
+        this.postNodeVersion = postNodeVersion;
+    }
+
+    public int getPreNodeVersion() {
+        return preNodeVersion;
+    }
+
+    public void setPreNodeVersion(int preNodeVersion) {
+        this.preNodeVersion = preNodeVersion;
+    }
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
index ba9ebaa..73d4bca 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
@@ -82,7 +82,7 @@ public class TaskInstance implements Serializable {
     /**
      * task defintion version
      */
-    private String taskDefinitionVersion;
+    private int taskDefinitionVersion;
 
     /**
      * process instance name
@@ -637,11 +637,11 @@ public class TaskInstance implements Serializable {
         this.processDefinitionCode = processDefinitionCode;
     }
 
-    public String getTaskDefinitionVersion() {
+    public int getTaskDefinitionVersion() {
         return taskDefinitionVersion;
     }
 
-    public void setTaskDefinitionVersion(String taskDefinitionVersion) {
+    public void setTaskDefinitionVersion(int taskDefinitionVersion) {
         this.taskDefinitionVersion = taskDefinitionVersion;
     }
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/DagHelper.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/DagHelper.java
index 6ee1c19..f7eaabc 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/DagHelper.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/utils/DagHelper.java
@@ -27,6 +27,8 @@ import 
org.apache.dolphinscheduler.common.utils.CollectionUtils;
 import org.apache.dolphinscheduler.common.utils.*;
 import org.apache.dolphinscheduler.common.utils.StringUtils;
 import org.apache.dolphinscheduler.dao.entity.ProcessData;
+import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation;
+import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
 import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 
 import org.slf4j.Logger;
@@ -466,6 +468,36 @@ public class DagHelper {
     }
 
     /**
+     * get process dag
+     *
+     * @param taskDefinitions task definition
+     * @return Process dag
+     */
+    public static ProcessDag getProcessDag(List<TaskDefinition> 
taskDefinitions,
+                                           List<ProcessTaskRelation> 
processTaskRelations) {
+        Map<Long, TaskNode> taskNodeMap = new HashMap<>();
+        List<TaskNode> taskNodeList = new ArrayList<>();
+        for (TaskDefinition taskDefinition : taskDefinitions) {
+            TaskNode taskNode = 
JSONUtils.parseObject(JSONUtils.toJsonString(taskDefinition), TaskNode.class);
+            taskNodeMap.put(taskDefinition.getCode(), taskNode);
+            taskNodeList.add(taskNode);
+        }
+
+        List<TaskNodeRelation> taskNodeRelations = new ArrayList<>();
+        for (ProcessTaskRelation processTaskRelation : processTaskRelations) {
+            if (processTaskRelation.getPreTaskCode() != 0) {
+                TaskNode preNode = 
taskNodeMap.get(processTaskRelation.getPreTaskCode());
+                TaskNode postNode = 
taskNodeMap.get(processTaskRelation.getPostTaskCode());
+                taskNodeRelations.add(new TaskNodeRelation(preNode.getName(), 
postNode.getName()));
+            }
+        }
+        ProcessDag processDag = new ProcessDag();
+        processDag.setEdges(taskNodeRelations);
+        processDag.setNodes(taskNodeList);
+        return processDag;
+    }
+
+    /**
      * is there have conditions after the parent node
      *
      * @param parentNodeName
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationLogMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationLogMapper.xml
index e719af6..b604a1d 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationLogMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationLogMapper.xml
@@ -19,8 +19,8 @@
 <!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.ProcessTaskRelationLogMapper">
     <sql id="baseSql">
-        id, `name`, process_definition_version, project_code, 
process_definition_code, pre_task_code, post_task_code,
-        condition_type, condition_params, operator, operate_time, create_time, 
update_time
+        id, `name`, process_definition_version, project_code, 
process_definition_code, pre_task_code, pre_task_version,
+        post_task_code, post_task_version, condition_type, condition_params, 
operator, operate_time, create_time, update_time
     </sql>
     <select id="queryByProcessCodeAndVersion" 
resultType="org.apache.dolphinscheduler.dao.entity.ProcessTaskRelationLog">
         select
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
index 8249db5..2e4ff4c 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
@@ -19,8 +19,8 @@
 <!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.ProcessTaskRelationMapper">
     <sql id="baseSql">
-        id, `name`, process_definition_version, project_code, 
process_definition_code, pre_task_code, post_task_code,
-        condition_type, condition_params, create_time, update_time
+        id, `name`, process_definition_version, project_code, 
process_definition_code, pre_task_code, pre_task_version,
+        post_task_code, post_task_version, condition_type, condition_params, 
create_time, update_time
     </sql>
     <select id="queryByProcessCode" 
resultType="org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation">
         select
diff --git 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
index e47a5ac..31b2d14 100644
--- 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
+++ 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
@@ -42,8 +42,11 @@ import 
org.apache.dolphinscheduler.common.enums.TaskDependType;
 import org.apache.dolphinscheduler.common.enums.TaskType;
 import org.apache.dolphinscheduler.common.enums.TimeoutFlag;
 import org.apache.dolphinscheduler.common.enums.WarningType;
+import org.apache.dolphinscheduler.common.graph.DAG;
 import org.apache.dolphinscheduler.common.model.DateInterval;
 import org.apache.dolphinscheduler.common.model.TaskNode;
+import org.apache.dolphinscheduler.common.model.TaskNodeRelation;
+import org.apache.dolphinscheduler.common.process.ProcessDag;
 import org.apache.dolphinscheduler.common.process.Property;
 import org.apache.dolphinscheduler.common.process.ResourceInfo;
 import org.apache.dolphinscheduler.common.task.AbstractParameters;
@@ -96,6 +99,7 @@ import 
org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
 import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
 import org.apache.dolphinscheduler.dao.mapper.UdfFuncMapper;
 import org.apache.dolphinscheduler.dao.mapper.UserMapper;
+import org.apache.dolphinscheduler.dao.utils.DagHelper;
 import org.apache.dolphinscheduler.remote.utils.Host;
 import org.apache.dolphinscheduler.service.exceptions.ServiceException;
 import org.apache.dolphinscheduler.service.log.LogClientService;
@@ -2384,4 +2388,32 @@ public class ProcessService {
         }
         return false;
     }
+
+    /**
+     * Generate the DAG Graph based on the process definition id
+     *
+     * @param processDefinition process definition
+     * @return dag graph
+     */
+    public DAG<String, TaskNode, TaskNodeRelation> 
genDagGraph(ProcessDefinition processDefinition) {
+
+        List<ProcessTaskRelationLog> taskRelationLogs = 
processTaskRelationLogMapper.queryByProcessCodeAndVersion(
+                processDefinition.getCode(),
+                processDefinition.getVersion());
+        List<ProcessTaskRelation> processTaskRelations = new ArrayList<>();
+        List<TaskDefinition> taskDefinitions = new ArrayList<>();
+        for (ProcessTaskRelationLog processTaskRelationLog : taskRelationLogs) 
{
+            
processTaskRelations.add(JSONUtils.parseObject(JSONUtils.toJsonString(processTaskRelationLog),
 ProcessTaskRelation.class));
+
+            TaskDefinitionLog taskDefinitionLog = 
taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(
+                    processTaskRelationLog.getPostTaskCode(),
+                    processTaskRelationLog.getPostNodeVersion());
+            
taskDefinitions.add(JSONUtils.parseObject(JSONUtils.toJsonString(taskDefinitionLog),
 TaskDefinition.class));
+        }
+
+        ProcessDag processDag = DagHelper.getProcessDag(taskDefinitions, 
processTaskRelations);
+        // Generate concrete Dag to be executed
+        return DagHelper.buildDagGraph(processDag);
+    }
+
 }
diff --git a/sql/dolphinscheduler-postgre.sql b/sql/dolphinscheduler-postgre.sql
index 0420789..6ffd638 100644
--- a/sql/dolphinscheduler-postgre.sql
+++ b/sql/dolphinscheduler-postgre.sql
@@ -398,7 +398,9 @@ CREATE TABLE t_ds_process_task_relation (
   project_code bigint DEFAULT NULL ,
   process_definition_code bigint DEFAULT NULL ,
   pre_task_code bigint DEFAULT NULL ,
+  pre_task_version int DEFAULT 0 ,
   post_task_code bigint DEFAULT NULL ,
+  post_task_version int DEFAULT 0 ,
   condition_type int DEFAULT NULL ,
   condition_params text ,
   create_time timestamp DEFAULT NULL ,
@@ -414,7 +416,9 @@ CREATE TABLE t_ds_process_task_relation_log (
   project_code bigint DEFAULT NULL ,
   process_definition_code bigint DEFAULT NULL ,
   pre_task_code bigint DEFAULT NULL ,
+  pre_task_version int DEFAULT 0 ,
   post_task_code bigint DEFAULT NULL ,
+  post_task_version int DEFAULT 0 ,
   condition_type int DEFAULT NULL ,
   condition_params text ,
   operator int DEFAULT NULL ,
diff --git a/sql/dolphinscheduler_mysql.sql b/sql/dolphinscheduler_mysql.sql
index f5d2124..f77d61f 100644
--- a/sql/dolphinscheduler_mysql.sql
+++ b/sql/dolphinscheduler_mysql.sql
@@ -513,7 +513,9 @@ CREATE TABLE `t_ds_process_task_relation` (
   `project_code` bigint(20) NOT NULL COMMENT 'project code',
   `process_definition_code` bigint(20) NOT NULL COMMENT 'process code',
   `pre_task_code` bigint(20) NOT NULL COMMENT 'pre task code',
+  `pre_task_version` int(11) NOT NULL COMMENT 'pre task version',
   `post_task_code` bigint(20) NOT NULL COMMENT 'post task code',
+  `post_task_version` int(11) NOT NULL COMMENT 'post task version',
   `condition_type` tinyint(2) DEFAULT NULL COMMENT 'condition type : 0 none, 1 
judge 2 delay',
   `condition_params` text COMMENT 'condition params(json)',
   `create_time` datetime NOT NULL COMMENT 'create time',
@@ -532,7 +534,9 @@ CREATE TABLE `t_ds_process_task_relation_log` (
   `project_code` bigint(20) NOT NULL COMMENT 'project code',
   `process_definition_code` bigint(20) NOT NULL COMMENT 'process code',
   `pre_task_code` bigint(20) NOT NULL COMMENT 'pre task code',
+  `pre_task_version` int(11) NOT NULL COMMENT 'pre task version',
   `post_task_code` bigint(20) NOT NULL COMMENT 'post task code',
+  `post_task_version` int(11) NOT NULL COMMENT 'post task version',
   `condition_type` tinyint(2) DEFAULT NULL COMMENT 'condition type : 0 none, 1 
judge 2 delay',
   `condition_params` text COMMENT 'condition params(json)',
   `operator` int(11) DEFAULT NULL COMMENT 'operator user id',

Reply via email to