You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by zi...@apache.org on 2024/07/11 13:25:13 UTC
(dolphinscheduler) branch dev updated: [DSIP-53] Suggest add process lineage parsing for dependent task (#16288)
This is an automated email from the ASF dual-hosted git repository.
zihaoxiang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 761323f3e1 [DSIP-53] Suggest add process lineage parsing for dependent task (#16288)
761323f3e1 is described below
commit 761323f3e1ceefe2a94f7f77e5d590997c57fd80
Author: xiangzihao <46...@qq.com>
AuthorDate: Thu Jul 11 21:25:06 2024 +0800
[DSIP-53] Suggest add process lineage parsing for dependent task (#16288)
* add dsip 53
---
docs/docs/en/guide/upgrade/upgrade.md | 9 +
docs/docs/zh/guide/upgrade/upgrade.md | 9 +
.../controller/ProcessDefinitionController.java | 4 +-
.../api/controller/ProcessInstanceController.java | 1 -
...ntroller.java => ProcessLineageController.java} | 77 +++---
.../api/dto/TaskCodeVersionDto.java | 19 +-
.../apache/dolphinscheduler/api/enums/Status.java | 15 +-
.../api/service/ProcessDefinitionService.java | 5 +
...eageService.java => ProcessLineageService.java} | 44 +--
.../api/service/impl/ExecutorServiceImpl.java | 8 +-
.../service/impl/ProcessDefinitionServiceImpl.java | 131 ++++++++-
.../service/impl/ProcessInstanceServiceImpl.java | 7 +
.../service/impl/ProcessLineageServiceImpl.java | 307 +++++++++++++++++++++
.../service/impl/WorkFlowLineageServiceImpl.java | 306 --------------------
....java => ProcessTaskLineageControllerTest.java} | 31 +--
.../api/service/ExecuteFunctionServiceTest.java | 7 +-
.../api/service/ProcessDefinitionServiceTest.java | 22 +-
...est.java => ProcessTaskLineageServiceTest.java} | 88 +++---
.../common/constants/Constants.java | 8 +-
...kFlowLineage.java => DependentLineageTask.java} | 22 +-
.../dao/entity/DependentProcessDefinition.java | 56 +---
.../dao/entity/ProcessLineage.java | 115 --------
...orkFlowLineage.java => ProcessTaskLineage.java} | 30 +-
.../dao/entity/WorkFlowLineage.java | 15 +-
.../dao/entity/WorkFlowRelation.java | 31 +--
...lowLineage.java => WorkFlowRelationDetail.java} | 2 +-
.../dao/mapper/ProcessTaskLineageMapper.java | 48 ++++
.../dao/mapper/TaskDefinitionMapper.java | 2 +
.../dao/mapper/WorkFlowLineageMapper.java | 148 ----------
.../dao/repository/ProcessTaskLineageDao.java | 45 +++
.../repository/impl/ProcessTaskLineageDaoImpl.java | 97 +++++++
.../dao/mapper/ProcessDefinitionMapper.xml | 4 +-
.../dao/mapper/ProcessTaskLineageMapper.xml | 133 +++++++++
.../dao/mapper/TaskDefinitionMapper.xml | 8 +
.../dao/mapper/WorkFlowLineageMapper.xml | 249 -----------------
.../src/main/resources/sql/dolphinscheduler_h2.sql | 22 ++
.../main/resources/sql/dolphinscheduler_mysql.sql | 21 ++
.../resources/sql/dolphinscheduler_postgresql.sql | 22 ++
.../3.3.0_schema/mysql/dolphinscheduler_ddl.sql | 35 +++
.../3.3.0_schema/mysql/dolphinscheduler_dml.sql} | 22 +-
.../postgresql/dolphinscheduler_ddl.sql | 35 +++
.../postgresql/dolphinscheduler_dml.sql} | 22 +-
...Test.java => ProcessTaskLineageMapperTest.java} | 51 ++--
.../service/process/ProcessService.java | 3 -
.../service/process/ProcessServiceImpl.java | 16 --
.../plugin/task/api/utils/TaskTypeUtils.java | 3 +-
.../src/main/bin/migrate-lineage.sh | 31 +++
.../tools/lineage/MigrateLineage.java | 56 ++++
.../tools/lineage/MigrateLineageService.java | 120 ++++++++
.../src/service/modules/lineages/types.ts | 6 +-
.../components/dependencies/use-dependencies.ts | 39 +--
.../projects/workflow/relation/use-relation.ts | 6 +-
52 files changed, 1385 insertions(+), 1228 deletions(-)
diff --git a/docs/docs/en/guide/upgrade/upgrade.md b/docs/docs/en/guide/upgrade/upgrade.md
index b4935b29e5..0c8fd347df 100644
--- a/docs/docs/en/guide/upgrade/upgrade.md
+++ b/docs/docs/en/guide/upgrade/upgrade.md
@@ -54,6 +54,15 @@ Execution result:
- The original UDF resource `x/y.jar` migrates to `/dolphinscheduler/abc/udf/.migrate/x/y.jar`.
- Update UDF function's bound resource info.
+### Upgrade Lineage
+
+Execute script: `sh ./tools/bin/migrate-lineage.sh`.
+
+Execution result:
+
+- Migrate lineage data to new table `t_ds_process_task_lineage`.
+- This script only performs upsert operations, not deletes. You can delete it manually if you need to.
+
### Upgrade Service
#### Change Configuration `bin/env/install_env.sh`
diff --git a/docs/docs/zh/guide/upgrade/upgrade.md b/docs/docs/zh/guide/upgrade/upgrade.md
index 1e2301c84f..4140f11829 100644
--- a/docs/docs/zh/guide/upgrade/upgrade.md
+++ b/docs/docs/zh/guide/upgrade/upgrade.md
@@ -53,6 +53,15 @@ jar 包 并添加到 `./tools/libs` 目录下,设置以下环境变量
- 原 UDF 资源 `x/y.jar` 迁移至 `/dolphinscheduler/abc/udf/.migrate/x/y.jar`。
- 更新 UDF 函数绑定资源信息。
+### 血缘升级
+
+执行脚本:`sh ./tools/bin/migrate-lineage.sh`。
+
+执行结果:
+
+- 原血缘数据迁移至新血缘表 `t_ds_process_task_lineage`。
+- 此脚本仅执行 upsert 操作,不执行删除操作,如果需要删除,您可以手动删除。
+
### 服务升级
#### 修改 `bin/env/install_env.sh` 配置内容
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
index d7ed288ef6..1c216155f8 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
@@ -221,7 +221,6 @@ public class ProcessDefinitionController extends BaseController {
* @param timeout timeout
* @param taskRelationJson relation json for nodes
* @param taskDefinitionJson taskDefinitionJson
- * @param otherParamsJson otherParamsJson handle other params
* @return update result code
*/
@Operation(summary = "update", description = "UPDATE_PROCESS_DEFINITION_NOTES")
@@ -230,8 +229,7 @@ public class ProcessDefinitionController extends BaseController {
@Parameter(name = "code", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = long.class, example = "123456789")),
@Parameter(name = "locations", description = "PROCESS_DEFINITION_LOCATIONS", required = true, schema = @Schema(implementation = String.class)),
@Parameter(name = "description", description = "PROCESS_DEFINITION_DESC", required = false, schema = @Schema(implementation = String.class)),
- @Parameter(name = "releaseState", description = "RELEASE_PROCESS_DEFINITION_NOTES", required = false, schema = @Schema(implementation = ReleaseState.class)),
- @Parameter(name = "otherParamsJson", description = "OTHER_PARAMS_JSON", required = false, schema = @Schema(implementation = String.class))
+ @Parameter(name = "releaseState", description = "RELEASE_PROCESS_DEFINITION_NOTES", required = false, schema = @Schema(implementation = ReleaseState.class))
})
@PutMapping(value = "/{code}")
@ResponseStatus(HttpStatus.OK)
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java
index 6d7b70918f..546a3644ad 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessInstanceController.java
@@ -158,7 +158,6 @@ public class ProcessInstanceController extends BaseController {
* @param scheduleTime schedule time
* @param syncDefine sync define
* @param locations locations
- * @param tenantCode tenantCode
* @return update result code
*/
@Operation(summary = "updateProcessInstance", description = "UPDATE_PROCESS_INSTANCE_NOTES")
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessLineageController.java
similarity index 61%
rename from dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java
rename to dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessLineageController.java
index 6a6b110d6e..dc27c4a147 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessLineageController.java
@@ -24,13 +24,16 @@ import static org.apache.dolphinscheduler.common.constants.Constants.SESSION_USE
import org.apache.dolphinscheduler.api.enums.Status;
import org.apache.dolphinscheduler.api.exceptions.ApiException;
import org.apache.dolphinscheduler.api.exceptions.ServiceException;
-import org.apache.dolphinscheduler.api.service.WorkFlowLineageService;
+import org.apache.dolphinscheduler.api.service.ProcessLineageService;
import org.apache.dolphinscheduler.api.utils.Result;
import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.dao.entity.DependentLineageTask;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
+import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -61,21 +64,21 @@ import io.swagger.v3.oas.annotations.tags.Tag;
@RestController
@RequestMapping("projects/{projectCode}/lineages")
@Slf4j
-public class WorkFlowLineageController extends BaseController {
+public class ProcessLineageController extends BaseController {
@Autowired
- private WorkFlowLineageService workFlowLineageService;
+ private ProcessLineageService processLineageService;
@Operation(summary = "queryLineageByWorkFlowName", description = "QUERY_WORKFLOW_LINEAGE_BY_NAME_NOTES")
@GetMapping(value = "/query-by-name")
@ResponseStatus(HttpStatus.OK)
@ApiException(QUERY_WORKFLOW_LINEAGE_ERROR)
- public Result<List<WorkFlowLineage>> queryWorkFlowLineageByName(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser,
- @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
- @RequestParam(value = "workFlowName", required = false) String workFlowName) {
- workFlowName = ParameterUtils.handleEscapes(workFlowName);
- List<WorkFlowLineage> workFlowLineages =
- workFlowLineageService.queryWorkFlowLineageByName(projectCode, workFlowName);
+ public Result<List<WorkFlowRelationDetail>> queryWorkFlowLineageByName(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser,
+ @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+ @RequestParam(value = "processDefinitionName", required = false) String processDefinitionName) {
+ processDefinitionName = ParameterUtils.handleEscapes(processDefinitionName);
+ List<WorkFlowRelationDetail> workFlowLineages =
+ processLineageService.queryWorkFlowLineageByName(projectCode, processDefinitionName);
return Result.success(workFlowLineages);
}
@@ -85,9 +88,12 @@ public class WorkFlowLineageController extends BaseController {
@ApiException(QUERY_WORKFLOW_LINEAGE_ERROR)
public Result<Map<String, Object>> queryWorkFlowLineageByCode(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser,
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
- @PathVariable(value = "workFlowCode", required = true) long workFlowCode) {
- Map<String, Object> result = workFlowLineageService.queryWorkFlowLineageByCode(projectCode, workFlowCode);
+ @PathVariable(value = "workFlowCode") long workFlowCode) {
+ WorkFlowLineage workFlowLineage = processLineageService.queryWorkFlowLineageByCode(projectCode, workFlowCode);
+ Map<String, Object> result = new HashMap<>();
+ result.put(Constants.DATA_LIST, workFlowLineage);
return Result.success(result);
+
}
@Operation(summary = "queryWorkFlowList", description = "QUERY_WORKFLOW_LINEAGE_NOTES")
@@ -96,8 +102,10 @@ public class WorkFlowLineageController extends BaseController {
public Result<Map<String, Object>> queryWorkFlowLineage(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser,
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode) {
try {
- Map<String, Object> result = workFlowLineageService.queryWorkFlowLineage(projectCode);
- return returnDataList(result);
+ Map<String, Object> result = new HashMap<>();
+ WorkFlowLineage workFlowLineage = processLineageService.queryWorkFlowLineage(projectCode);
+ result.put(Constants.DATA_LIST, workFlowLineage);
+ return Result.success(result);
} catch (Exception e) {
log.error(QUERY_WORKFLOW_LINEAGE_ERROR.getMsg(), e);
return error(QUERY_WORKFLOW_LINEAGE_ERROR.getCode(), QUERY_WORKFLOW_LINEAGE_ERROR.getMsg());
@@ -107,10 +115,10 @@ public class WorkFlowLineageController extends BaseController {
/**
* Whether task can be deleted or not, avoiding task depend on other task of process definition delete by accident.
*
- * @param loginUser login user
- * @param projectCode project codes which taskCode belong
+ * @param loginUser login user
+ * @param projectCode project codes which taskCode belong
* @param processDefinitionCode project code which taskCode belong
- * @param taskCode task definition code
+ * @param taskCode task definition code
* @return Result of task can be deleted or not
*/
@Operation(summary = "verifyTaskCanDelete", description = "VERIFY_TASK_CAN_DELETE")
@@ -122,13 +130,13 @@ public class WorkFlowLineageController extends BaseController {
@PostMapping(value = "/tasks/verify-delete")
@ResponseStatus(HttpStatus.OK)
@ApiException(TASK_WITH_DEPENDENT_ERROR)
- public Result verifyTaskCanDelete(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
- @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
- @RequestParam(value = "processDefinitionCode", required = true) long processDefinitionCode,
- @RequestParam(value = "taskCode", required = true) long taskCode) {
- Result result = new Result();
+ public Result<Map<String, Object>> verifyTaskCanDelete(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+ @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+ @RequestParam(value = "processDefinitionCode", required = true) long processDefinitionCode,
+ @RequestParam(value = "taskCode", required = true) long taskCode) {
+ Result<Map<String, Object>> result = new Result<>();
Optional<String> taskDepMsg =
- workFlowLineageService.taskDepOnTaskMsg(projectCode, processDefinitionCode, taskCode);
+ processLineageService.taskDependentMsg(projectCode, processDefinitionCode, taskCode);
if (taskDepMsg.isPresent()) {
throw new ServiceException(taskDepMsg.get());
}
@@ -136,19 +144,26 @@ public class WorkFlowLineageController extends BaseController {
return result;
}
- @Operation(summary = "queryDownstreamDependentTaskList", description = "QUERY_DOWNSTREAM_DEPENDENT_TASK_NOTES")
+ /**
+ * Whether task can be deleted or not, avoiding task depend on other task of process definition delete by accident.
+ */
+ @Operation(summary = "verifyTaskCanDelete", description = "VERIFY_TASK_CAN_DELETE")
@Parameters({
- @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = Long.class)),
- @Parameter(name = "taskCode", description = "TASK_DEFINITION_CODE", required = false, schema = @Schema(implementation = Long.class, example = "123456789")),
+ @Parameter(name = "projectCode", description = "PROCESS_DEFINITION_NAME", required = true, schema = @Schema(implementation = long.class)),
+ @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = long.class)),
})
@GetMapping(value = "/query-dependent-tasks")
@ResponseStatus(HttpStatus.OK)
@ApiException(QUERY_WORKFLOW_LINEAGE_ERROR)
- public Result<Map<String, Object>> queryDownstreamDependentTaskList(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser,
- @RequestParam(value = "workFlowCode") Long workFlowCode,
- @RequestParam(value = "taskCode", required = false, defaultValue = "0") Long taskCode) {
- Map<String, Object> result =
- workFlowLineageService.queryDownstreamDependentTasks(workFlowCode, taskCode);
- return returnDataList(result);
+ public Result<Map<String, Object>> queryDependentTasks(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+ @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+ @RequestParam(value = "workFlowCode") long workFlowCode,
+ @RequestParam(value = "taskCode", required = false) Long taskCode) {
+ Map<String, Object> result = new HashMap<>();
+ List<DependentLineageTask> dependentLineageTaskList =
+ processLineageService.queryDependentProcessDefinitions(projectCode, workFlowCode, taskCode);
+ result.put(Constants.DATA_LIST, dependentLineageTaskList);
+ return Result.success(result);
}
+
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/TaskCodeVersionDto.java
similarity index 68%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/TaskCodeVersionDto.java
index 0f2e325da5..89a7d99381 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/TaskCodeVersionDto.java
@@ -15,22 +15,15 @@
* limitations under the License.
*/
-package org.apache.dolphinscheduler.dao.entity;
-
-import java.util.Date;
+package org.apache.dolphinscheduler.api.dto;
import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
-public class WorkFlowLineage {
-
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
+@NoArgsConstructor
+public class TaskCodeVersionDto {
+ private long code;
+ private int version;
}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index a2208b602b..5355650725 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -20,6 +20,8 @@ package org.apache.dolphinscheduler.api.enums;
import java.util.Locale;
import java.util.Optional;
+import lombok.Getter;
+
import org.springframework.context.i18n.LocaleContextHolder;
/**
@@ -238,7 +240,7 @@ public enum Status {
QUERY_EXECUTING_WORKFLOW_ERROR(10192, "query executing workflow error", "查询运行的工作流实例错误"),
DELETE_PROCESS_DEFINITION_USE_BY_OTHER_FAIL(10193, "delete process definition fail, cause used by other tasks: {0}",
"删除工作流定时失败,被其他任务引用:{0}"),
- DELETE_TASK_USE_BY_OTHER_FAIL(10194, "delete task {0} fail, cause used by other tasks: {1}",
+ DELETE_TASK_USE_BY_OTHER_FAIL(10194, "delete task {0} fail, the reason is that used by other tasks: {1}",
"删除任务 {0} 失败,被其他任务引用:{1}"),
TASK_WITH_DEPENDENT_ERROR(10195, "task used in other tasks", "删除被其他任务引用"),
TASK_SAVEPOINT_ERROR(10196, "task savepoint error", "任务实例savepoint错误"),
@@ -585,7 +587,12 @@ public enum Status {
USED_WORKER_GROUP_EXISTS(1402004,
"You can not reassign worker groups to the project, cause these worker groups {0} are already used.",
"Worker组{0}被项目中任务或定时引用,无法重新分配"),
- ;
+ CREATE_PROCESS_LINEAGE_ERROR(1403001, "create process lineage error", "创建工作流血缘错误"),
+ UPDATE_PROCESS_LINEAGE_ERROR(1403002, "update process lineage error", "更新工作流血缘错误"),
+ DELETE_PROCESS_LINEAGE_ERROR(1403003, "delete process lineage error", "删除工作流血缘错误"),
+ ;
+
+ @Getter
private final int code;
private final String enMsg;
private final String zhMsg;
@@ -596,10 +603,6 @@ public enum Status {
this.zhMsg = zhMsg;
}
- public int getCode() {
- return this.code;
- }
-
public String getMsg() {
if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(LocaleContextHolder.getLocale().getLanguage())) {
return this.zhMsg;
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
index 52a95839ba..850ac5b0c6 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
@@ -427,4 +427,9 @@ public interface ProcessDefinitionService {
* @return variables data
*/
Map<String, Object> viewVariables(User loginUser, long projectCode, long code);
+
+ void saveProcessLineage(long projectCode,
+ long processDefinitionCode,
+ int processDefinitionVersion,
+ List<TaskDefinitionLog> taskDefinitionLogList);
}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessLineageService.java
similarity index 52%
rename from dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java
rename to dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessLineageService.java
index 2e535f3307..6cab4482aa 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessLineageService.java
@@ -17,50 +17,50 @@
package org.apache.dolphinscheduler.api.service;
-import org.apache.dolphinscheduler.dao.entity.TaskMainInfo;
+import org.apache.dolphinscheduler.dao.entity.DependentLineageTask;
+import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition;
+import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage;
import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
+import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
import java.util.List;
-import java.util.Map;
import java.util.Optional;
-import java.util.Set;
/**
* work flow lineage service
*/
-public interface WorkFlowLineageService {
+public interface ProcessLineageService {
- List<WorkFlowLineage> queryWorkFlowLineageByName(long projectCode, String workFlowName);
+ List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode, String processDefinitionName);
- Map<String, Object> queryWorkFlowLineageByCode(long projectCode, long workFlowCode);
+ WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long processDefinitionCode);
- Map<String, Object> queryWorkFlowLineage(long projectCode);
-
- /**
- * 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
- */
- Set<TaskMainInfo> queryTaskDepOnProcess(long projectCode, long processDefinitionCode);
+ WorkFlowLineage queryWorkFlowLineage(long projectCode);
/**
* 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
+ * @return downstream dependent process definition list
*/
- Map<String, Object> queryDownstreamDependentTasks(Long processDefinitionCode, Long taskCode);
+ List<DependentProcessDefinition> queryDownstreamDependentProcessDefinitions(Long processDefinitionCode);
/**
* 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 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
+ * @param taskCode Task code want to query tasks dependence
* @return dependent process definition
*/
- Optional<String> taskDepOnTaskMsg(long projectCode, long processDefinitionCode, long taskCode);
+ Optional<String> taskDependentMsg(long projectCode, long processDefinitionCode, long taskCode);
+
+ List<DependentLineageTask> queryDependentProcessDefinitions(long projectCode, long processDefinitionCode,
+ Long taskCode);
+
+ int createProcessLineage(List<ProcessTaskLineage> processTaskLineages);
+
+ int updateProcessLineage(List<ProcessTaskLineage> processTaskLineages);
+
+ int deleteProcessLineage(List<Long> processDefinitionCodes);
}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
index 6bb7d228ff..64f43e5d81 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
@@ -41,6 +41,7 @@ import org.apache.dolphinscheduler.api.executor.ExecuteContext;
import org.apache.dolphinscheduler.api.service.ExecutorService;
import org.apache.dolphinscheduler.api.service.MonitorService;
import org.apache.dolphinscheduler.api.service.ProcessDefinitionService;
+import org.apache.dolphinscheduler.api.service.ProcessLineageService;
import org.apache.dolphinscheduler.api.service.ProjectService;
import org.apache.dolphinscheduler.api.service.WorkerGroupService;
import org.apache.dolphinscheduler.common.constants.Constants;
@@ -186,6 +187,9 @@ public class ExecutorServiceImpl extends BaseServiceImpl implements ExecutorServ
@Autowired
private TenantMapper tenantMapper;
+ @Autowired
+ private ProcessLineageService processLineageService;
+
/**
* execute process instance
*
@@ -999,7 +1003,7 @@ public class ExecutorServiceImpl extends BaseServiceImpl implements ExecutorServ
boolean allLevelDependent) {
List<DependentProcessDefinition> dependentProcessDefinitionList =
checkDependentProcessDefinitionValid(
- processService.queryDependentProcessDefinitionByProcessDefinitionCode(processDefinitionCode),
+ processLineageService.queryDownstreamDependentProcessDefinitions(processDefinitionCode),
processDefinitionCycle, workerGroup,
processDefinitionCode);
@@ -1013,7 +1017,7 @@ public class ExecutorServiceImpl extends BaseServiceImpl implements ExecutorServ
List<DependentProcessDefinition> childDependentList = childList
.stream()
.flatMap(dependentProcessDefinition -> checkDependentProcessDefinitionValid(
- processService.queryDependentProcessDefinitionByProcessDefinitionCode(
+ processLineageService.queryDownstreamDependentProcessDefinitions(
dependentProcessDefinition.getProcessDefinitionCode()),
processDefinitionCycle,
workerGroup,
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 820d35b3b1..fc0c273ea6 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
@@ -42,6 +42,7 @@ import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYP
import static org.apache.dolphinscheduler.plugin.task.api.TaskPluginManager.checkTaskParameters;
import org.apache.dolphinscheduler.api.dto.DagDataSchedule;
+import org.apache.dolphinscheduler.api.dto.TaskCodeVersionDto;
import org.apache.dolphinscheduler.api.dto.treeview.Instance;
import org.apache.dolphinscheduler.api.dto.treeview.TreeViewDto;
import org.apache.dolphinscheduler.api.dto.workflow.WorkflowCreateRequest;
@@ -52,11 +53,11 @@ import org.apache.dolphinscheduler.api.exceptions.ServiceException;
import org.apache.dolphinscheduler.api.service.MetricsCleanUpService;
import org.apache.dolphinscheduler.api.service.ProcessDefinitionService;
import org.apache.dolphinscheduler.api.service.ProcessInstanceService;
+import org.apache.dolphinscheduler.api.service.ProcessLineageService;
import org.apache.dolphinscheduler.api.service.ProjectService;
import org.apache.dolphinscheduler.api.service.SchedulerService;
import org.apache.dolphinscheduler.api.service.TaskDefinitionLogService;
import org.apache.dolphinscheduler.api.service.TaskDefinitionService;
-import org.apache.dolphinscheduler.api.service.WorkFlowLineageService;
import org.apache.dolphinscheduler.api.utils.CheckUtils;
import org.apache.dolphinscheduler.api.utils.FileUtils;
import org.apache.dolphinscheduler.api.utils.PageInfo;
@@ -83,6 +84,7 @@ import org.apache.dolphinscheduler.dao.entity.DependentSimplifyDefinition;
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.ProcessTaskLineage;
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation;
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelationLog;
import org.apache.dolphinscheduler.dao.entity.Project;
@@ -90,7 +92,6 @@ import org.apache.dolphinscheduler.dao.entity.Schedule;
import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
import org.apache.dolphinscheduler.dao.entity.TaskDefinitionLog;
import org.apache.dolphinscheduler.dao.entity.TaskInstance;
-import org.apache.dolphinscheduler.dao.entity.TaskMainInfo;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.entity.UserWithProcessDefinitionCode;
import org.apache.dolphinscheduler.dao.mapper.DataSourceMapper;
@@ -111,7 +112,10 @@ import org.apache.dolphinscheduler.dao.repository.TaskDefinitionLogDao;
import org.apache.dolphinscheduler.dao.utils.WorkerGroupUtils;
import org.apache.dolphinscheduler.plugin.task.api.enums.SqlType;
import org.apache.dolphinscheduler.plugin.task.api.enums.TaskTimeoutStrategy;
+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.model.Property;
+import org.apache.dolphinscheduler.plugin.task.api.parameters.DependentParameters;
import org.apache.dolphinscheduler.plugin.task.api.parameters.SqlParameters;
import org.apache.dolphinscheduler.plugin.task.api.utils.TaskTypeUtils;
import org.apache.dolphinscheduler.plugin.task.sql.SqlTaskChannelFactory;
@@ -144,6 +148,7 @@ import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -153,6 +158,7 @@ import javax.servlet.http.HttpServletResponse;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.MediaType;
@@ -239,7 +245,7 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
private DataSourceMapper dataSourceMapper;
@Autowired
- private WorkFlowLineageService workFlowLineageService;
+ private ProcessLineageService processLineageService;
@Autowired
private MetricsCleanUpService metricsCleanUpService;
@@ -407,11 +413,66 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
processDefinition.getProjectCode(), processDefinition.getCode(), insertVersion);
}
+ saveProcessLineage(processDefinition.getProjectCode(), processDefinition.getCode(),
+ insertVersion, taskDefinitionLogs);
+
putMsg(result, Status.SUCCESS);
result.put(Constants.DATA_LIST, processDefinition);
return result;
}
+ @Override
+ public void saveProcessLineage(long projectCode,
+ long processDefinitionCode,
+ int processDefinitionVersion,
+ List<TaskDefinitionLog> taskDefinitionLogList) {
+ List<ProcessTaskLineage> processTaskLineageList =
+ generateProcessLineageList(taskDefinitionLogList, processDefinitionCode, processDefinitionVersion);
+ if (processTaskLineageList.isEmpty()) {
+ return;
+ }
+
+ int insertProcessLineageResult = processLineageService.updateProcessLineage(processTaskLineageList);
+ if (insertProcessLineageResult <= 0) {
+ log.error(
+ "Save process lineage error, projectCode: {}, processDefinitionCode: {}, processDefinitionVersion: {}",
+ projectCode, processDefinitionCode, processDefinitionVersion);
+ throw new ServiceException(Status.CREATE_PROCESS_LINEAGE_ERROR);
+ } else {
+ log.info(
+ "Save process lineage complete, projectCode: {}, processDefinitionCode: {}, processDefinitionVersion: {}",
+ projectCode, processDefinitionCode, processDefinitionVersion);
+ }
+ }
+
+ private List<ProcessTaskLineage> generateProcessLineageList(List<TaskDefinitionLog> taskDefinitionLogList,
+ long processDefinitionCode,
+ int processDefinitionVersion) {
+ List<ProcessTaskLineage> processTaskLineageList = new ArrayList<>();
+ for (TaskDefinitionLog taskDefinitionLog : taskDefinitionLogList) {
+ if (!TaskTypeUtils.isDependentTask(taskDefinitionLog.getTaskType())) {
+ continue;
+ }
+
+ for (DependentTaskModel dependentTaskModel : JSONUtils
+ .parseObject(taskDefinitionLog.getTaskParams(), DependentParameters.class)
+ .getDependence().getDependTaskList()) {
+ for (DependentItem dependentItem : dependentTaskModel.getDependItemList()) {
+ ProcessTaskLineage processTaskLineage = new ProcessTaskLineage();
+ processTaskLineage.setProcessDefinitionCode(processDefinitionCode);
+ processTaskLineage.setProcessDefinitionVersion(processDefinitionVersion);
+ processTaskLineage.setTaskDefinitionCode(taskDefinitionLog.getCode());
+ processTaskLineage.setTaskDefinitionVersion(taskDefinitionLog.getVersion());
+ processTaskLineage.setDeptProjectCode(taskDefinitionLog.getProjectCode());
+ processTaskLineage.setDeptProcessDefinitionCode(dependentItem.getDefinitionCode());
+ processTaskLineage.setDeptTaskDefinitionCode(dependentItem.getDepTaskCode());
+ processTaskLineageList.add(processTaskLineage);
+ }
+ }
+ }
+ return processTaskLineageList;
+ }
+
private List<TaskDefinitionLog> generateTaskDefinitionList(String taskDefinitionJson) {
try {
List<TaskDefinitionLog> taskDefinitionLogs = JSONUtils.toList(taskDefinitionJson, TaskDefinitionLog.class);
@@ -828,7 +889,7 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
boolean oldTaskExists = taskRelationList.stream()
.anyMatch(relation -> oldProcessTaskRelation.getPostTaskCode() == relation.getPostTaskCode());
if (!oldTaskExists) {
- Optional<String> taskDepMsg = workFlowLineageService.taskDepOnTaskMsg(
+ Optional<String> taskDepMsg = processLineageService.taskDependentMsg(
processDefinition.getProjectCode(), oldProcessTaskRelation.getProcessDefinitionCode(),
oldProcessTaskRelation.getPostTaskCode());
taskDepMsg.ifPresent(sb::append);
@@ -908,6 +969,9 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
putMsg(result, Status.UPDATE_PROCESS_DEFINITION_ERROR);
throw new ServiceException(Status.UPDATE_PROCESS_DEFINITION_ERROR);
}
+
+ saveProcessLineage(processDefinition.getProjectCode(), processDefinition.getCode(),
+ insertVersion, taskDefinitionLogs);
} else {
log.info(
"Process definition does not need to be updated because there is no change, projectCode:{}, processCode:{}, processVersion:{}.",
@@ -1013,14 +1077,13 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
}
// check process used by other task, including subprocess and dependent task type
- Set<TaskMainInfo> taskDepOnProcess = workFlowLineageService
- .queryTaskDepOnProcess(processDefinition.getProjectCode(), processDefinition.getCode());
- if (CollectionUtils.isNotEmpty(taskDepOnProcess)) {
- String taskDepDetail = taskDepOnProcess.stream()
- .map(task -> String.format(Constants.FORMAT_S_S_COLON, task.getProcessDefinitionName(),
- task.getTaskName()))
- .collect(Collectors.joining(Constants.COMMA));
- throw new ServiceException(Status.DELETE_PROCESS_DEFINITION_USE_BY_OTHER_FAIL, taskDepDetail);
+ Optional<String> taskDepMsg = processLineageService.taskDependentMsg(processDefinition.getProjectCode(),
+ processDefinition.getCode(), 0);
+
+ if (taskDepMsg.isPresent()) {
+ String errorMeg = "Process definition cannot be deleted because it has dependent, " + taskDepMsg.get();
+ log.error(errorMeg);
+ throw new ServiceException(errorMeg);
}
}
@@ -2219,12 +2282,47 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
putMsg(result, Status.SWITCH_PROCESS_DEFINITION_VERSION_ERROR);
throw new ServiceException(Status.SWITCH_PROCESS_DEFINITION_VERSION_ERROR);
}
+
+ List<ProcessTaskRelation> processTaskRelationList = processTaskRelationMapper
+ .queryProcessTaskRelationsByProcessDefinitionCode(processDefinitionLog.getCode(),
+ processDefinitionLog.getVersion());
+ List<TaskCodeVersionDto> taskDefinitionList = getTaskCodeVersionDtos(processTaskRelationList);
+ List<TaskDefinitionLog> taskDefinitionLogList =
+ taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitionList.stream()
+ .flatMap(taskCodeVersionDto -> {
+ TaskDefinitionLog taskDefinitionLog = new TaskDefinitionLog();
+ taskDefinitionLog.setCode(taskCodeVersionDto.getCode());
+ taskDefinitionLog.setVersion(taskCodeVersionDto.getVersion());
+ return Stream.of(taskDefinitionLog);
+ }).collect(Collectors.toList()));
+ saveProcessLineage(processDefinitionLog.getProjectCode(), processDefinitionLog.getCode(),
+ processDefinitionLog.getVersion(), taskDefinitionLogList);
+
log.info("Switch process definition version complete, projectCode:{}, processDefinitionCode:{}, version:{}.",
projectCode, code, version);
putMsg(result, Status.SUCCESS);
return result;
}
+ private static @NotNull List<TaskCodeVersionDto> getTaskCodeVersionDtos(List<ProcessTaskRelation> processTaskRelationList) {
+ List<TaskCodeVersionDto> taskDefinitionList = new ArrayList<>();
+ for (ProcessTaskRelation processTaskRelation : processTaskRelationList) {
+ if (processTaskRelation.getPreTaskCode() != 0) {
+ TaskCodeVersionDto taskCodeVersionDto = new TaskCodeVersionDto();
+ taskCodeVersionDto.setCode(processTaskRelation.getPreTaskCode());
+ taskCodeVersionDto.setVersion(processTaskRelation.getPreTaskVersion());
+ taskDefinitionList.add(taskCodeVersionDto);
+ }
+ if (processTaskRelation.getPostTaskCode() != 0) {
+ TaskCodeVersionDto taskCodeVersionDto = new TaskCodeVersionDto();
+ taskCodeVersionDto.setCode(processTaskRelation.getPostTaskCode());
+ taskCodeVersionDto.setVersion(processTaskRelation.getPostTaskVersion());
+ taskDefinitionList.add(taskCodeVersionDto);
+ }
+ }
+ return taskDefinitionList;
+ }
+
/**
* check batch operate result
*
@@ -2330,7 +2428,14 @@ public class ProcessDefinitionServiceImpl extends BaseServiceImpl implements Pro
if (deleteLog == 0 || deleteRelationLog == 0) {
throw new ServiceException(Status.DELETE_PROCESS_DEFINE_BY_CODE_ERROR);
}
- log.info("Delete version: {} of workflow: {}, projectCode:{}.", version, code, projectCode);
+ log.info("Delete version: {} of workflow: {}, projectCode: {}", version, code, projectCode);
+
+ // delete process lineage
+ int deleteProcessLineageResult = processLineageService.deleteProcessLineage(Collections.singletonList(code));
+ if (deleteProcessLineageResult <= 0) {
+ log.error("Delete process lineage by process definition code error, processDefinitionCode: {}", code);
+ throw new ServiceException(Status.DELETE_PROCESS_LINEAGE_ERROR);
+ }
}
private void updateWorkflowValid(User user, ProcessDefinition oldProcessDefinition,
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
index 11ff034bb6..3258fbc236 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessInstanceServiceImpl.java
@@ -684,6 +684,13 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl implements Proce
} else
log.info("Update process definition complete, projectCode:{}, processDefinitionName:{}.", projectCode,
processDefinition.getName());
+
+ // save process lineage
+ if (syncDefine) {
+ processDefinitionService.saveProcessLineage(projectCode, processDefinition.getCode(),
+ insertVersion, taskDefinitionLogs);
+ }
+
int insertResult = processService.saveTaskRelation(loginUser, processDefinition.getProjectCode(),
processDefinition.getCode(), insertVersion, taskRelationList, taskDefinitionLogs, syncDefine);
if (insertResult == Constants.EXIT_CODE_SUCCESS) {
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessLineageServiceImpl.java
new file mode 100644
index 0000000000..a2f18714f4
--- /dev/null
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessLineageServiceImpl.java
@@ -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);
+ }
+}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java
deleted file mode 100644
index 9763f21b0f..0000000000
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java
+++ /dev/null
@@ -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;
- }
-}
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessTaskLineageControllerTest.java
similarity index 67%
rename from dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java
rename to dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessTaskLineageControllerTest.java
index 6329cc584a..0a3da8437c 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessTaskLineageControllerTest.java
@@ -20,14 +20,13 @@ package org.apache.dolphinscheduler.api.controller;
import static org.apache.dolphinscheduler.api.AssertionsHelper.assertDoesNotThrow;
import org.apache.dolphinscheduler.api.enums.Status;
-import org.apache.dolphinscheduler.api.service.impl.WorkFlowLineageServiceImpl;
+import org.apache.dolphinscheduler.api.service.impl.ProcessLineageServiceImpl;
import org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.enums.UserType;
import org.apache.dolphinscheduler.dao.entity.User;
import java.text.MessageFormat;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
@@ -42,13 +41,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
* work flow lineage controller test
*/
@ExtendWith(MockitoExtension.class)
-public class WorkFlowLineageControllerTest {
+public class ProcessTaskLineageControllerTest {
@InjectMocks
- private WorkFlowLineageController workFlowLineageController;
+ private ProcessLineageController processLineageController;
@Mock
- private WorkFlowLineageServiceImpl workFlowLineageService;
+ private ProcessLineageServiceImpl workFlowLineageService;
protected User user;
@@ -76,27 +75,7 @@ public class WorkFlowLineageControllerTest {
String searchVal = "test";
Mockito.when(workFlowLineageService.queryWorkFlowLineageByName(projectCode, searchVal))
.thenReturn(Collections.emptyList());
- assertDoesNotThrow(() -> workFlowLineageController.queryWorkFlowLineageByName(user, projectCode, searchVal));
+ assertDoesNotThrow(() -> processLineageController.queryWorkFlowLineageByName(user, projectCode, searchVal));
}
- @Test
- public void testQueryWorkFlowLineageByCode() {
- long projectCode = 1L;
- long code = 1L;
- Mockito.when(workFlowLineageService.queryWorkFlowLineageByCode(projectCode, code)).thenReturn(new HashMap<>());
- assertDoesNotThrow(() -> workFlowLineageController.queryWorkFlowLineageByCode(user, projectCode, code));
- }
-
- @Test
- public void testQueryDownstreamDependentTaskList() {
- long code = 1L;
- long taskCode = 1L;
- Map<String, Object> result = new HashMap<>();
- result.put(Constants.STATUS, Status.SUCCESS);
- Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(code, taskCode))
- .thenReturn(result);
-
- assertDoesNotThrow(
- () -> workFlowLineageController.queryDownstreamDependentTaskList(user, code, taskCode));
- }
}
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecuteFunctionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecuteFunctionServiceTest.java
index 04dabf5ead..c722fb6014 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecuteFunctionServiceTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ExecuteFunctionServiceTest.java
@@ -162,6 +162,9 @@ public class ExecuteFunctionServiceTest {
@Mock
private ProcessDefinitionService processDefinitionService;
+ @Mock
+ private ProcessLineageService processLineageService;
+
private int processDefinitionId = 1;
private int processDefinitionVersion = 1;
@@ -358,7 +361,7 @@ public class ExecuteFunctionServiceTest {
dependentProcessDefinition.setWorkerGroup(WorkerGroupUtils.getDefaultWorkerGroup());
dependentProcessDefinition.setTaskParams(
"{\"localParams\":[],\"resourceList\":[],\"dependence\":{\"relation\":\"AND\",\"dependTaskList\":[{\"relation\":\"AND\",\"dependItemList\":[{\"depTaskCode\":2,\"status\":\"SUCCESS\"}]}]},\"conditionResult\":{\"successNode\":[1],\"failedNode\":[1]}}");
- Mockito.when(processService.queryDependentProcessDefinitionByProcessDefinitionCode(processDefinitionCode))
+ Mockito.when(processLineageService.queryDownstreamDependentProcessDefinitions(processDefinitionCode))
.thenReturn(Lists.newArrayList(dependentProcessDefinition));
Map<Long, String> processDefinitionWorkerGroupMap = new HashMap<>();
@@ -387,7 +390,7 @@ public class ExecuteFunctionServiceTest {
childDependent.setWorkerGroup(WorkerGroupUtils.getDefaultWorkerGroup());
childDependent.setTaskParams(
"{\"localParams\":[],\"resourceList\":[],\"dependence\":{\"relation\":\"AND\",\"dependTaskList\":[{\"relation\":\"AND\",\"dependItemList\":[{\"depTaskCode\":3,\"status\":\"SUCCESS\"}]}]},\"conditionResult\":{\"successNode\":[1],\"failedNode\":[1]}}");
- Mockito.when(processService.queryDependentProcessDefinitionByProcessDefinitionCode(
+ Mockito.when(processLineageService.queryDownstreamDependentProcessDefinitions(
dependentProcessDefinition.getProcessDefinitionCode())).thenReturn(Lists.newArrayList(childDependent))
.thenReturn(Lists.newArrayList());
int allLevelDependentCount = executorService.createComplementDependentCommand(schedules, command, true);
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
index 37af53dbbd..b4b6dcb00d 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
@@ -84,7 +84,6 @@ import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -108,7 +107,6 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.mock.web.MockMultipartFile;
-import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
@ExtendWith(MockitoExtension.class)
@@ -171,7 +169,7 @@ public class ProcessDefinitionServiceTest extends BaseServiceTestTool {
private DataSourceMapper dataSourceMapper;
@Mock
- private WorkFlowLineageService workFlowLineageService;
+ private ProcessLineageService processLineageService;
@Mock
private MetricsCleanUpService metricsCleanUpService;
@@ -524,8 +522,8 @@ public class ProcessDefinitionServiceTest extends BaseServiceTestTool {
when(processDefinitionDao.queryByCode(46L)).thenReturn(Optional.of(processDefinition));
when(scheduleMapper.queryByProcessDefinitionCode(46L)).thenReturn(getSchedule());
when(scheduleMapper.deleteById(46)).thenReturn(1);
- when(workFlowLineageService.queryTaskDepOnProcess(project.getCode(), processDefinition.getCode()))
- .thenReturn(Collections.emptySet());
+ when(processLineageService.taskDependentMsg(project.getCode(), processDefinition.getCode(), 0))
+ .thenReturn(Optional.empty());
processDefinitionService.deleteProcessDefinitionByCode(user, 46L);
Mockito.verify(metricsCleanUpService, times(1)).cleanUpWorkflowMetricsByDefinitionCode(46L);
@@ -540,19 +538,17 @@ public class ProcessDefinitionServiceTest extends BaseServiceTestTool {
// process used by other task, sub process
user.setUserType(UserType.ADMIN_USER);
TaskMainInfo taskMainInfo = getTaskMainInfo().get(0);
- when(workFlowLineageService.queryTaskDepOnProcess(project.getCode(), processDefinition.getCode()))
- .thenReturn(ImmutableSet.copyOf(getTaskMainInfo()));
+ when(processLineageService.taskDependentMsg(project.getCode(), processDefinition.getCode(), 0))
+ .thenReturn(Optional.of(taskMainInfo.getTaskName()));
exception = Assertions.assertThrows(ServiceException.class,
() -> processDefinitionService.deleteProcessDefinitionByCode(user, 46L));
- Assertions.assertEquals(Status.DELETE_PROCESS_DEFINITION_USE_BY_OTHER_FAIL.getCode(),
- ((ServiceException) exception).getCode());
// delete success
schedule.setReleaseState(ReleaseState.OFFLINE);
when(scheduleMapper.queryByProcessDefinitionCode(46L)).thenReturn(getSchedule());
when(scheduleMapper.deleteById(schedule.getId())).thenReturn(1);
- when(workFlowLineageService.queryTaskDepOnProcess(project.getCode(), processDefinition.getCode()))
- .thenReturn(Collections.emptySet());
+ when(processLineageService.taskDependentMsg(project.getCode(), processDefinition.getCode(), 0))
+ .thenReturn(Optional.empty());
Assertions.assertDoesNotThrow(() -> processDefinitionService.deleteProcessDefinitionByCode(user, 46L));
Mockito.verify(metricsCleanUpService, times(2)).cleanUpWorkflowMetricsByDefinitionCode(46L);
}
@@ -600,8 +596,8 @@ public class ProcessDefinitionServiceTest extends BaseServiceTestTool {
// delete success
process.setReleaseState(ReleaseState.OFFLINE);
when(processDefinitionDao.queryByCode(processDefinitionCode)).thenReturn(Optional.of(process));
- when(workFlowLineageService.queryTaskDepOnProcess(project.getCode(), process.getCode()))
- .thenReturn(Collections.emptySet());
+ when(processLineageService.taskDependentMsg(project.getCode(), process.getCode(), 0))
+ .thenReturn(Optional.empty());
putMsg(result, Status.SUCCESS, projectCode);
doNothing().when(metricsCleanUpService).cleanUpWorkflowMetricsByDefinitionCode(11L);
Map<String, Object> deleteSuccess =
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessTaskLineageServiceTest.java
similarity index 50%
rename from dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageServiceTest.java
rename to dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessTaskLineageServiceTest.java
index 316ed5d18e..2d8a28cad6 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageServiceTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessTaskLineageServiceTest.java
@@ -19,23 +19,20 @@ package org.apache.dolphinscheduler.api.service;
import static org.mockito.Mockito.when;
-import org.apache.dolphinscheduler.api.service.impl.WorkFlowLineageServiceImpl;
-import org.apache.dolphinscheduler.common.constants.Constants;
-import org.apache.dolphinscheduler.dao.entity.ProcessLineage;
+import org.apache.dolphinscheduler.api.service.impl.ProcessLineageServiceImpl;
+import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage;
import org.apache.dolphinscheduler.dao.entity.Project;
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.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionLogMapper;
-import org.apache.dolphinscheduler.dao.mapper.WorkFlowLineageMapper;
+import org.apache.dolphinscheduler.dao.repository.ProcessTaskLineageDao;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -49,13 +46,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
* work flow lineage service test
*/
@ExtendWith(MockitoExtension.class)
-public class WorkFlowLineageServiceTest {
+public class ProcessTaskLineageServiceTest {
@InjectMocks
- private WorkFlowLineageServiceImpl workFlowLineageService;
+ private ProcessLineageServiceImpl processLineageService;
@Mock
- private WorkFlowLineageMapper workFlowLineageMapper;
+ private ProcessTaskLineageDao processTaskLineageDao;
@Mock
private ProjectMapper projectMapper;
@@ -83,9 +80,9 @@ public class WorkFlowLineageServiceTest {
Project project = getProject("test");
String name = "test";
when(projectMapper.queryByCode(1L)).thenReturn(project);
- when(workFlowLineageMapper.queryWorkFlowLineageByName(Mockito.anyLong(), Mockito.any()))
+ when(processTaskLineageDao.queryWorkFlowLineageByName(Mockito.anyLong(), Mockito.any()))
.thenReturn(getWorkFlowLineages());
- List<WorkFlowLineage> workFlowLineages = workFlowLineageService.queryWorkFlowLineageByName(1L, name);
+ List<WorkFlowRelationDetail> workFlowLineages = processLineageService.queryWorkFlowLineageByName(1L, name);
Assertions.assertTrue(CollectionUtils.isNotEmpty(workFlowLineages));
}
@@ -93,43 +90,44 @@ public class WorkFlowLineageServiceTest {
public void testQueryWorkFlowLineage() {
Project project = getProject("test");
- List<ProcessLineage> processLineages = new ArrayList<>();
- ProcessLineage processLineage = new ProcessLineage();
- processLineage.setPreTaskVersion(1);
- processLineage.setPreTaskCode(1L);
- processLineage.setPostTaskCode(2L);
- processLineage.setPostTaskVersion(1);
- processLineage.setProcessDefinitionCode(1111L);
- processLineage.setProcessDefinitionVersion(1);
- processLineage.setProjectCode(1111L);
- processLineages.add(processLineage);
- WorkFlowLineage workFlowLineage = new WorkFlowLineage();
- workFlowLineage.setSourceWorkFlowCode("");
- workFlowLineage.setWorkFlowCode(1111L);
- List<WorkFlowLineage> workFlowLineages = new ArrayList<>();
- workFlowLineages.add(workFlowLineage);
+ List<ProcessTaskLineage> processTaskLineages = new ArrayList<>();
+ ProcessTaskLineage processTaskLineage = new ProcessTaskLineage();
+ processTaskLineage.setProcessDefinitionCode(1);
+ processTaskLineage.setProcessDefinitionVersion(1);
+ processTaskLineage.setTaskDefinitionCode(2L);
+ processTaskLineage.setTaskDefinitionVersion(1);
+ processTaskLineage.setDeptProjectCode(1111L);
+ processTaskLineage.setDeptProcessDefinitionCode(1);
+ processTaskLineage.setDeptTaskDefinitionCode(1111L);
+ processTaskLineages.add(processTaskLineage);
+
+ List<WorkFlowRelationDetail> workFlowRelationDetailList = new ArrayList<>();
+ WorkFlowRelationDetail workFlowRelationDetail = new WorkFlowRelationDetail();
+ workFlowRelationDetail.setWorkFlowCode(processTaskLineage.getProcessDefinitionCode());
+ workFlowRelationDetail.setWorkFlowName("testProcessDefinitionName");
+ workFlowRelationDetailList.add(workFlowRelationDetail);
when(projectMapper.queryByCode(1L)).thenReturn(project);
- when(workFlowLineageMapper.queryProcessLineage(project.getCode())).thenReturn(processLineages);
- when(workFlowLineageMapper.queryWorkFlowLineageByLineage(processLineages)).thenReturn(workFlowLineages);
-
- Map<String, Object> result = workFlowLineageService.queryWorkFlowLineage(1L);
-
- Map<String, Object> workFlowLists = (Map<String, Object>) result.get(Constants.DATA_LIST);
- Collection<WorkFlowLineage> workFlowLineageList =
- (Collection<WorkFlowLineage>) workFlowLists.get(Constants.WORKFLOW_LIST);
- Set<WorkFlowRelation> workFlowRelations =
- (Set<WorkFlowRelation>) workFlowLists.get(Constants.WORKFLOW_RELATION_LIST);
- Assertions.assertTrue(workFlowLineageList.size() > 0);
- Assertions.assertTrue(workFlowRelations.size() > 0);
+ when(processTaskLineageDao.queryByProjectCode(project.getCode())).thenReturn(processTaskLineages);
+ when(processTaskLineageDao.queryWorkFlowLineageByCode(processTaskLineage.getProcessDefinitionCode()))
+ .thenReturn(workFlowRelationDetailList);
+
+ WorkFlowLineage workFlowLineage = processLineageService.queryWorkFlowLineage(1L);
+
+ List<WorkFlowRelationDetail> workFlowLineageList =
+ workFlowLineage.getWorkFlowRelationDetailList();
+ List<WorkFlowRelation> workFlowRelations =
+ workFlowLineage.getWorkFlowRelationList();
+ Assertions.assertTrue(!workFlowLineageList.isEmpty());
+ Assertions.assertTrue(!workFlowRelations.isEmpty());
}
- private List<WorkFlowLineage> getWorkFlowLineages() {
- List<WorkFlowLineage> workFlowLineages = new ArrayList<>();
- WorkFlowLineage workFlowLineage = new WorkFlowLineage();
- workFlowLineage.setWorkFlowCode(1);
- workFlowLineage.setWorkFlowName("testdag");
- workFlowLineages.add(workFlowLineage);
+ private List<WorkFlowRelationDetail> getWorkFlowLineages() {
+ List<WorkFlowRelationDetail> workFlowLineages = new ArrayList<>();
+ WorkFlowRelationDetail workFlowRelationDetail = new WorkFlowRelationDetail();
+ workFlowRelationDetail.setWorkFlowCode(1);
+ workFlowRelationDetail.setWorkFlowName("testdag");
+ workFlowLineages.add(workFlowRelationDetail);
return workFlowLineages;
}
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
index c7d771796f..03a00e67d2 100644
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
+++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
@@ -482,11 +482,9 @@ public final class Constants {
public static final String TOTAL = "total";
- /**
- * workflow
- */
- public static final String WORKFLOW_LIST = "workFlowList";
- public static final String WORKFLOW_RELATION_LIST = "workFlowRelationList";
+ public static final long DEFAULT_PROJECT_CODE = 0;
+
+ public static final long DEPENDENT_ALL_TASK = 0;
/**
* session user
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentLineageTask.java
similarity index 72%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentLineageTask.java
index 0f2e325da5..2f3ffdff56 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentLineageTask.java
@@ -17,20 +17,18 @@
package org.apache.dolphinscheduler.dao.entity;
-import java.util.Date;
-
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
-public class WorkFlowLineage {
-
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
+@NoArgsConstructor
+@AllArgsConstructor
+public class DependentLineageTask {
+ private long projectCode;
+ private long processDefinitionCode;
+ private String processDefinitionName;
+ private long taskDefinitionCode;
+ private String taskDefinitionName;
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentProcessDefinition.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentProcessDefinition.java
index fcce2a33d3..111b07aaba 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentProcessDefinition.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DependentProcessDefinition.java
@@ -25,9 +25,12 @@ import org.apache.dolphinscheduler.plugin.task.api.parameters.DependentParameter
import java.util.List;
+import lombok.Data;
+
/**
* dependent process definition
*/
+@Data
public class DependentProcessDefinition {
/**
@@ -35,11 +38,6 @@ public class DependentProcessDefinition {
*/
private long processDefinitionCode;
- /**
- * process definition name
- */
- private String processDefinitionName;
-
/**
* process definition version
**/
@@ -106,52 +104,4 @@ public class DependentProcessDefinition {
return JSONUtils.parseObject(taskParams, DependentParameters.class);
}
- public String getProcessDefinitionName() {
- return this.processDefinitionName;
- }
-
- public void setProcessDefinitionName(String name) {
- this.processDefinitionName = name;
- }
-
- public long getProcessDefinitionCode() {
- return this.processDefinitionCode;
- }
-
- public void setProcessDefinitionCode(long code) {
- this.processDefinitionCode = code;
- }
-
- public int getProcessDefinitionVersion() {
- return processDefinitionVersion;
- }
-
- public void setProcessDefinitionVersion(int processDefinitionVersion) {
- this.processDefinitionVersion = processDefinitionVersion;
- }
-
- public long getTaskDefinitionCode() {
- return this.taskDefinitionCode;
- }
-
- public void setTaskDefinitionCode(long code) {
- this.taskDefinitionCode = code;
- }
-
- public String getTaskParams() {
- return this.taskParams;
- }
-
- public void setTaskParams(String taskParams) {
- this.taskParams = taskParams;
- }
-
- public String getWorkerGroup() {
- return this.workerGroup;
- }
-
- public void setWorkerGroup(String workerGroup) {
- this.workerGroup = workerGroup;
- }
-
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessLineage.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessLineage.java
deleted file mode 100644
index 27d0f8cac0..0000000000
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessLineage.java
+++ /dev/null
@@ -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;
- }
-}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskLineage.java
similarity index 54%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskLineage.java
index 0f2e325da5..8e45fde680 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessTaskLineage.java
@@ -19,18 +19,30 @@ 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
-public class WorkFlowLineage {
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("t_ds_process_task_lineage")
+public class ProcessTaskLineage {
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
+ @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;
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
index 0f2e325da5..ffeffcc9be 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
@@ -17,20 +17,15 @@
package org.apache.dolphinscheduler.dao.entity;
-import java.util.Date;
+import java.util.List;
import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
+@NoArgsConstructor
public class WorkFlowLineage {
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
-
+ private List<WorkFlowRelation> workFlowRelationList;
+ private List<WorkFlowRelationDetail> workFlowRelationDetailList;
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelation.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelation.java
index 72dbf8790d..1327fae6ef 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelation.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelation.java
@@ -19,35 +19,18 @@ package org.apache.dolphinscheduler.dao.entity;
import java.util.Objects;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
public class WorkFlowRelation {
private long sourceWorkFlowCode;
private long targetWorkFlowCode;
- public long getSourceWorkFlowCode() {
- return sourceWorkFlowCode;
- }
-
- public void setSourceWorkFlowCode(long sourceWorkFlowCode) {
- this.sourceWorkFlowCode = sourceWorkFlowCode;
- }
-
- public long getTargetWorkFlowCode() {
- return targetWorkFlowCode;
- }
-
- public void setTargetWorkFlowCode(long targetWorkFlowCode) {
- this.targetWorkFlowCode = targetWorkFlowCode;
- }
-
- public WorkFlowRelation() {
- }
-
- public WorkFlowRelation(long sourceWorkFlowCode, long targetWorkFlowCode) {
- this.sourceWorkFlowCode = sourceWorkFlowCode;
- this.targetWorkFlowCode = targetWorkFlowCode;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelationDetail.java
similarity index 96%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelationDetail.java
index 0f2e325da5..fc2b09e824 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowRelationDetail.java
@@ -22,7 +22,7 @@ import java.util.Date;
import lombok.Data;
@Data
-public class WorkFlowLineage {
+public class WorkFlowRelationDetail {
private long workFlowCode;
private String workFlowName;
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.java
new file mode 100644
index 0000000000..08920b89d3
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.java
@@ -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);
+
+}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.java
index 4caadac540..cfbe6e94e0 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.java
@@ -140,4 +140,6 @@ public interface TaskDefinitionMapper extends BaseMapper<TaskDefinition> {
int deleteByBatchCodes(@Param("taskCodeList") List<Long> taskCodeList);
void deleteByWorkflowDefinitionCodeAndVersion(long workflowDefinitionCode, int workflowDefinitionVersion);
+
+ List<TaskDefinition> queryDefinitionsByTaskType(@Param("taskType") String taskType);
}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java
deleted file mode 100644
index 649e188e9c..0000000000
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java
+++ /dev/null
@@ -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);
-}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/ProcessTaskLineageDao.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/ProcessTaskLineageDao.java
new file mode 100644
index 0000000000..953db08701
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/ProcessTaskLineageDao.java
@@ -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);
+}
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/ProcessTaskLineageDaoImpl.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/ProcessTaskLineageDaoImpl.java
new file mode 100644
index 0000000000..e7fe04f4c7
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/ProcessTaskLineageDaoImpl.java
@@ -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);
+ }
+}
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
index 874db82ccc..bcd21647b3 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
@@ -92,10 +92,10 @@
<if test=" pd.projectCode != 0">
and project_code = #{pd.projectCode}
</if>
- <if test=" pd.name != null and pd.name != ''">
+ <if test="pd.name != null and pd.name != ''">
and name like concat('%', #{pd.name}, '%')
</if>
- <if test=" pd.releaseState != null and pd.releaseState != ''">
+ <if test="pd.releaseState != null and pd.releaseState != ''">
and release_state = #{pd.releaseState}
</if>
</where>
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.xml
new file mode 100644
index 0000000000..0b11d730ac
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapper.xml
@@ -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>
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.xml
index c4e912cab6..ba06d5a9bd 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskDefinitionMapper.xml
@@ -160,4 +160,12 @@
</where>
order by update_time desc, id asc
</select>
+
+ <select id="queryDefinitionsByTaskType" resultType="org.apache.dolphinscheduler.dao.entity.TaskDefinition">
+ select
+ <include refid="baseSql"/>
+ from t_ds_task_definition
+ where task_type = #{taskType}
+ </select>
+
</mapper>
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml
deleted file mode 100644
index 51c60394be..0000000000
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml
+++ /dev/null
@@ -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>
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
index a907ec69a1..6069284bbd 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
@@ -2185,3 +2185,25 @@ CREATE TABLE t_ds_listener_event
KEY idx_status (post_status),
KEY idx_event_sign (sign)
);
+
+-- ----------------------------
+-- Table structure for t_ds_process_task_lineage
+-- ----------------------------
+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(20) NOT NULL DEFAULT 0,
+ `process_definition_version` int NOT NULL DEFAULT 0,
+ `task_definition_code` bigint(20) NOT NULL DEFAULT 0,
+ `task_definition_version` int NOT NULL DEFAULT 0,
+ `dept_project_code` bigint(20) NOT NULL DEFAULT 0,
+ `dept_process_definition_code` bigint(20) NOT NULL DEFAULT 0,
+ `dept_task_definition_code` bigint(20) NOT NULL DEFAULT 0,
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ 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`)
+);
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
index 3a4f17a357..f60d78bf5f 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
@@ -2157,3 +2157,24 @@ CREATE TABLE `t_ds_listener_event` (
KEY `idx_status` (`post_status`) USING BTREE,
KEY `idx_sign` (`sign`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
+
+-- ----------------------------
+-- Table structure for t_ds_process_task_lineage
+-- ----------------------------
+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;
diff --git a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
index d314c6ef09..cbaa38f039 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
@@ -2149,3 +2149,25 @@ comment on column t_ds_listener_event.sign is 'sign=sha1(content)';
create index idx_listener_event_post_status on t_ds_listener_event (post_status);
create index idx_listener_event_sign on t_ds_listener_event (sign);
+
+-- ----------------------------
+-- Table structure for t_ds_process_task_lineage
+-- ----------------------------
+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);
diff --git a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql
new file mode 100644
index 0000000000..e90459d209
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_ddl.sql
@@ -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;
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_dml.sql
similarity index 65%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_dml.sql
index 0f2e325da5..4a14f326b9 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/mysql/dolphinscheduler_dml.sql
@@ -13,24 +13,4 @@
* 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 WorkFlowLineage {
-
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
-
-}
+*/
diff --git a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql
new file mode 100644
index 0000000000..593d9998fd
--- /dev/null
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_ddl.sql
@@ -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);
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_dml.sql
similarity index 65%
copy from dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
copy to dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_dml.sql
index 0f2e325da5..4a14f326b9 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/WorkFlowLineage.java
+++ b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.3.0_schema/postgresql/dolphinscheduler_dml.sql
@@ -13,24 +13,4 @@
* 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 WorkFlowLineage {
-
- private long workFlowCode;
- private String workFlowName;
- private String workFlowPublishStatus;
- private Date scheduleStartTime;
- private Date scheduleEndTime;
- private String crontab;
- private int schedulePublishStatus;
- private String sourceWorkFlowCode;
-
-}
+*/
diff --git a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapperTest.java b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapperTest.java
similarity index 75%
rename from dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapperTest.java
rename to dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapperTest.java
index 7b86bd2170..fb95c18352 100644
--- a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapperTest.java
+++ b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskLineageMapperTest.java
@@ -22,10 +22,10 @@ import org.apache.dolphinscheduler.common.enums.ReleaseState;
import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.dao.BaseDaoTest;
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition;
-import org.apache.dolphinscheduler.dao.entity.ProcessLineage;
+import org.apache.dolphinscheduler.dao.entity.ProcessTaskLineage;
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation;
import org.apache.dolphinscheduler.dao.entity.Schedule;
-import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage;
+import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail;
import java.util.Date;
import java.util.List;
@@ -34,10 +34,10 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-public class WorkFlowLineageMapperTest extends BaseDaoTest {
+public class ProcessTaskLineageMapperTest extends BaseDaoTest {
@Autowired
- private WorkFlowLineageMapper workFlowLineageMapper;
+ private ProcessTaskLineageMapper processTaskLineageMapper;
@Autowired
private ProcessDefinitionMapper processDefinitionMapper;
@@ -50,10 +50,8 @@ public class WorkFlowLineageMapperTest extends BaseDaoTest {
/**
* insert
- *
- * @return ProcessDefinition
*/
- private ProcessTaskRelation insertOneProcessTaskRelation() {
+ private void insertOneProcessTaskRelation() {
// insertOne
ProcessTaskRelation processTaskRelation = new ProcessTaskRelation();
processTaskRelation.setName("def 1");
@@ -67,7 +65,6 @@ public class WorkFlowLineageMapperTest extends BaseDaoTest {
processTaskRelation.setUpdateTime(new Date());
processTaskRelation.setCreateTime(new Date());
processTaskRelationMapper.insert(processTaskRelation);
- return processTaskRelation;
}
/**
@@ -86,6 +83,21 @@ public class WorkFlowLineageMapperTest extends BaseDaoTest {
processDefinitionMapper.insert(processDefinition);
}
+ private void insertOneProcessLineage() {
+ // insertOne
+ ProcessTaskLineage processTaskLineage = new ProcessTaskLineage();
+ processTaskLineage.setProcessDefinitionCode(1L);
+ processTaskLineage.setProcessDefinitionVersion(1);
+ processTaskLineage.setTaskDefinitionCode(1L);
+ processTaskLineage.setTaskDefinitionVersion(1);
+ processTaskLineage.setDeptProjectCode(1L);
+ processTaskLineage.setDeptProcessDefinitionCode(1L);
+ processTaskLineage.setDeptTaskDefinitionCode(1L);
+ processTaskLineage.setUpdateTime(new Date());
+ processTaskLineage.setCreateTime(new Date());
+ processTaskLineageMapper.insert(processTaskLineage);
+ }
+
/**
* insert
*
@@ -110,29 +122,20 @@ public class WorkFlowLineageMapperTest extends BaseDaoTest {
insertOneProcessDefinition();
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(1L);
insertOneSchedule(processDefinition.getId());
-
- List<WorkFlowLineage> workFlowLineages = workFlowLineageMapper
+ List<WorkFlowRelationDetail> workFlowLineages = processTaskLineageMapper
.queryWorkFlowLineageByName(processDefinition.getProjectCode(), processDefinition.getName());
Assertions.assertNotEquals(0, workFlowLineages.size());
}
- @Test
- public void testQueryCodeRelation() {
- ProcessTaskRelation processTaskRelation = insertOneProcessTaskRelation();
- List<ProcessLineage> workFlowLineages =
- workFlowLineageMapper.queryProcessLineageByCode(processTaskRelation.getProjectCode(),
- processTaskRelation.getProcessDefinitionCode());
- Assertions.assertNotEquals(0, workFlowLineages.size());
- }
-
@Test
public void testQueryWorkFlowLineage() {
insertOneProcessDefinition();
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(1L);
insertOneProcessTaskRelation();
- List<ProcessLineage> workFlowLineages =
- workFlowLineageMapper.queryProcessLineage(processDefinition.getProjectCode());
- Assertions.assertNotEquals(0, workFlowLineages.size());
+ insertOneProcessLineage();
+ List<ProcessTaskLineage> processTaskLineages =
+ processTaskLineageMapper.queryByProjectCode(processDefinition.getProjectCode());
+ Assertions.assertNotEquals(0, processTaskLineages.size());
}
@Test
@@ -140,8 +143,8 @@ public class WorkFlowLineageMapperTest extends BaseDaoTest {
insertOneProcessDefinition();
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(1L);
insertOneSchedule(processDefinition.getId());
- WorkFlowLineage workFlowLineages = workFlowLineageMapper
- .queryWorkFlowLineageByCode(processDefinition.getProjectCode(), processDefinition.getCode());
+ List<WorkFlowRelationDetail> workFlowLineages = processTaskLineageMapper
+ .queryWorkFlowLineageByCode(processDefinition.getCode());
Assertions.assertNotNull(workFlowLineages);
}
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 b9e4d811f3..8a09e3bb98 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
@@ -25,7 +25,6 @@ import org.apache.dolphinscheduler.common.utils.CodeGenerateUtils;
import org.apache.dolphinscheduler.dao.entity.Command;
import org.apache.dolphinscheduler.dao.entity.DagData;
import org.apache.dolphinscheduler.dao.entity.DataSource;
-import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition;
import org.apache.dolphinscheduler.dao.entity.DqComparisonType;
import org.apache.dolphinscheduler.dao.entity.DqExecuteResult;
import org.apache.dolphinscheduler.dao.entity.DqRule;
@@ -108,8 +107,6 @@ public interface ProcessService {
List<Schedule> queryReleaseSchedulerListByProcessDefinitionCode(long processDefinitionCode);
- List<DependentProcessDefinition> queryDependentProcessDefinitionByProcessDefinitionCode(long processDefinitionCode);
-
List<ProcessInstance> queryNeedFailoverProcessInstances(String host);
List<String> queryNeedFailoverProcessInstanceHost();
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
index 2b0a8e073c..5553024701 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
@@ -51,7 +51,6 @@ import org.apache.dolphinscheduler.dao.entity.Cluster;
import org.apache.dolphinscheduler.dao.entity.Command;
import org.apache.dolphinscheduler.dao.entity.DagData;
import org.apache.dolphinscheduler.dao.entity.DataSource;
-import org.apache.dolphinscheduler.dao.entity.DependentProcessDefinition;
import org.apache.dolphinscheduler.dao.entity.DqComparisonType;
import org.apache.dolphinscheduler.dao.entity.DqExecuteResult;
import org.apache.dolphinscheduler.dao.entity.DqRule;
@@ -98,7 +97,6 @@ import org.apache.dolphinscheduler.dao.mapper.TaskGroupQueueMapper;
import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
import org.apache.dolphinscheduler.dao.mapper.UserMapper;
-import org.apache.dolphinscheduler.dao.mapper.WorkFlowLineageMapper;
import org.apache.dolphinscheduler.dao.repository.ProcessInstanceDao;
import org.apache.dolphinscheduler.dao.repository.ProcessInstanceMapDao;
import org.apache.dolphinscheduler.dao.repository.TaskDefinitionDao;
@@ -256,9 +254,6 @@ public class ProcessServiceImpl implements ProcessService {
@Autowired
private TaskGroupMapper taskGroupMapper;
- @Autowired
- private WorkFlowLineageMapper workFlowLineageMapper;
-
@Autowired
private ClusterMapper clusterMapper;
@@ -1430,17 +1425,6 @@ public class ProcessServiceImpl implements ProcessService {
return scheduleMapper.queryReleaseSchedulerListByProcessDefinitionCode(processDefinitionCode);
}
- /**
- * query dependent process definition by process definition code
- *
- * @param processDefinitionCode processDefinitionCode
- * @see DependentProcessDefinition
- */
- @Override
- public List<DependentProcessDefinition> queryDependentProcessDefinitionByProcessDefinitionCode(long processDefinitionCode) {
- return workFlowLineageMapper.queryDependentProcessDefinitionByProcessDefinitionCode(processDefinitionCode);
- }
-
/**
* query need failover process instance
*
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/TaskTypeUtils.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/TaskTypeUtils.java
index cf1f2022ea..14ee1c40b6 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/TaskTypeUtils.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/utils/TaskTypeUtils.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.plugin.task.api.utils;
import org.apache.dolphinscheduler.plugin.task.api.ILogicTaskChannel;
import org.apache.dolphinscheduler.plugin.task.api.TaskPluginManager;
import org.apache.dolphinscheduler.plugin.task.api.task.ConditionsLogicTaskChannelFactory;
+import org.apache.dolphinscheduler.plugin.task.api.task.DependentLogicTaskChannelFactory;
import org.apache.dolphinscheduler.plugin.task.api.task.DynamicLogicTaskChannelFactory;
import org.apache.dolphinscheduler.plugin.task.api.task.SubWorkflowLogicTaskChannelFactory;
import org.apache.dolphinscheduler.plugin.task.api.task.SwitchLogicTaskChannelFactory;
@@ -41,7 +42,7 @@ public class TaskTypeUtils {
}
public boolean isDependentTask(String taskType) {
- return SubWorkflowLogicTaskChannelFactory.NAME.equals(taskType);
+ return DependentLogicTaskChannelFactory.NAME.equals(taskType);
}
public boolean isDynamicTask(String taskType) {
diff --git a/dolphinscheduler-tools/src/main/bin/migrate-lineage.sh b/dolphinscheduler-tools/src/main/bin/migrate-lineage.sh
new file mode 100644
index 0000000000..c34ae0e117
--- /dev/null
+++ b/dolphinscheduler-tools/src/main/bin/migrate-lineage.sh
@@ -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
diff --git a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineage.java b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineage.java
new file mode 100644
index 0000000000..0fab0abaed
--- /dev/null
+++ b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineage.java
@@ -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();
+ }
+ }
+}
diff --git a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineageService.java b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineageService.java
new file mode 100644
index 0000000000..8fdad845f4
--- /dev/null
+++ b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/lineage/MigrateLineageService.java
@@ -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);
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/dolphinscheduler-ui/src/service/modules/lineages/types.ts b/dolphinscheduler-ui/src/service/modules/lineages/types.ts
index 8434491053..13ebb90fcb 100644
--- a/dolphinscheduler-ui/src/service/modules/lineages/types.ts
+++ b/dolphinscheduler-ui/src/service/modules/lineages/types.ts
@@ -27,7 +27,7 @@ interface WorkFlowNameReq {
workFlowName: string
}
-interface WorkFlowListRes extends WorkflowCodeReq {
+interface WorkFlowRelationDetailListRes extends WorkflowCodeReq {
workFlowName: string
workFlowPublishStatus: string
scheduleStartTime?: any
@@ -43,7 +43,7 @@ interface WorkFlowRelationList {
}
interface WorkflowRes {
- workFlowList: WorkFlowListRes[]
+ workFlowRelationDetailList: WorkFlowRelationDetailListRes[]
workFlowRelationList: WorkFlowRelationList[]
}
@@ -57,5 +57,5 @@ export {
WorkFlowNameReq,
DependentTaskReq,
WorkflowRes,
- WorkFlowListRes
+ WorkFlowRelationDetailListRes
}
diff --git a/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts
index 3093aad669..d2be5c347d 100644
--- a/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts
+++ b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts
@@ -17,7 +17,6 @@
import { DependentTaskReq } from '@/service/modules/lineages/types'
import { queryDependentTasks } from '@/service/modules/lineages'
-import { TASK_TYPES_MAP } from '@/store/project'
export function useDependencies() {
const getDependentTasksBySingleTask = async (
@@ -33,13 +32,11 @@ export function useDependencies() {
} as DependentTaskReq
const res = await queryDependentTasks(projectCode, dependentTaskReq)
res
- .filter(
- (item: any) =>
- item.processDefinitionCode !== workflowCode &&
- item.taskType === TASK_TYPES_MAP.DEPENDENT.alias
- )
+ .filter((item: any) => item.processDefinitionCode !== workflowCode)
.forEach((item: any) => {
- tasks.push(item.processDefinitionName + '->' + item.taskName)
+ tasks.push(
+ item.processDefinitionName + '->' + item.taskDefinitionName
+ )
})
}
return tasks
@@ -56,13 +53,11 @@ export function useDependencies() {
} as DependentTaskReq
const res = await queryDependentTasks(projectCode, dependentTaskReq)
res
- .filter(
- (item: any) =>
- item.processDefinitionCode !== workflowCode &&
- item.taskType === TASK_TYPES_MAP.DEPENDENT.alias
- )
+ .filter((item: any) => item.processDefinitionCode !== workflowCode)
.forEach((item: any) => {
- tasks.push(item.processDefinitionName + '->' + item.taskName)
+ tasks.push(
+ item.processDefinitionName + '->' + item.taskDefinitionName
+ )
})
}
return tasks
@@ -116,14 +111,11 @@ export function useDependencies() {
await queryDependentTasks(projectCode, dependentTaskReq).then(
(res: any) => {
res
- .filter(
- (item: any) =>
- item.processDefinitionCode !== workflowCode &&
- item.taskType === TASK_TYPES_MAP.DEPENDENT.alias
- )
+ .filter((item: any) => item.processDefinitionCode !== workflowCode)
.forEach((item: any) => {
dependentTaskLinks.push({
- text: item.processDefinitionName + '->' + item.taskName,
+ text:
+ item.processDefinitionName + '->' + item.taskDefinitionName,
show: true,
action: () => {
const url = `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`
@@ -151,14 +143,11 @@ export function useDependencies() {
await queryDependentTasks(projectCode, dependentTaskReq).then(
(res: any) => {
res
- .filter(
- (item: any) =>
- item.processDefinitionCode !== workflowCode &&
- item.taskType === TASK_TYPES_MAP.DEPENDENT.alias
- )
+ .filter((item: any) => item.processDefinitionCode !== workflowCode)
.forEach((item: any) => {
dependentTaskLinks.push({
- text: item.processDefinitionName + '->' + item.taskName,
+ text:
+ item.processDefinitionName + '->' + item.taskDefinitionName,
show: true,
action: () => {
const url = `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`
diff --git a/dolphinscheduler-ui/src/views/projects/workflow/relation/use-relation.ts b/dolphinscheduler-ui/src/views/projects/workflow/relation/use-relation.ts
index 7b49e910f7..4fa826d49b 100644
--- a/dolphinscheduler-ui/src/views/projects/workflow/relation/use-relation.ts
+++ b/dolphinscheduler-ui/src/views/projects/workflow/relation/use-relation.ts
@@ -24,7 +24,7 @@ import {
} from '@/service/modules/lineages'
import type {
WorkflowRes,
- WorkFlowListRes
+ WorkFlowRelationDetailListRes
} from '@/service/modules/lineages/types'
export function useRelation() {
@@ -40,7 +40,7 @@ export function useRelation() {
variables.seriesData = []
variables.links = []
- variables.seriesData = obj.workFlowList.map((item) => {
+ variables.seriesData = obj.workFlowRelationDetailList.map((item) => {
return {
name: item.workFlowName,
id: item.workFlowCode,
@@ -59,7 +59,7 @@ export function useRelation() {
const getWorkflowName = (projectCode: number) => {
const { state } = useAsyncState(
queryLineageByWorkFlowName({ projectCode }).then(
- (res: Array<WorkFlowListRes>) => {
+ (res: Array<WorkFlowRelationDetailListRes>) => {
variables.workflowOptions = res.map((item) => {
return {
label: item.workFlowName,