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 789f7abe70 [Chore] Remove unused utils in common module (#16902)
789f7abe70 is described below
commit 789f7abe703de7c44a53192d6f039be73e4a3ff3
Author: Wenjun Ruan <[email protected]>
AuthorDate: Thu Dec 19 11:09:05 2024 +0800
[Chore] Remove unused utils in common module (#16902)
---
.../api/service/impl/TaskInstanceServiceImpl.java | 10 +-
.../common/utils/CollectionUtils.java | 76 ---
.../common/utils/ConnectionUtils.java | 51 --
.../common/utils/RetryerUtils.java | 112 ----
.../dolphinscheduler/common/utils/TriFunction.java | 28 -
.../common/utils/RetryerUtilsTest.java | 218 -------
.../dolphinscheduler/common/utils/StringTest.java | 54 --
.../dolphinscheduler/service/utils/DagHelper.java | 458 -------------
.../service/utils/DagHelperTest.java | 707 ---------------------
9 files changed, 2 insertions(+), 1712 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java
index b1518e3cc7..d7f6faea53 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskInstanceServiceImpl.java
@@ -30,7 +30,6 @@ import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.api.utils.Result;
import org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.enums.TaskExecuteType;
-import org.apache.dolphinscheduler.common.utils.CollectionUtils;
import org.apache.dolphinscheduler.common.utils.DateUtils;
import org.apache.dolphinscheduler.dao.entity.Project;
import org.apache.dolphinscheduler.dao.entity.TaskInstance;
@@ -55,10 +54,8 @@ import
org.apache.dolphinscheduler.task.executor.operations.TaskExecutorKillResp
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
@@ -145,7 +142,7 @@ public class TaskInstanceServiceImpl extends
BaseServiceImpl implements TaskInst
Date start = checkAndParseDateParameters(startDate);
Date end = checkAndParseDateParameters(endDate);
Page<TaskInstance> page = new Page<>(pageNo, pageSize);
- PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(pageNo,
pageSize);
+ PageInfo<TaskInstance> pageInfo = new PageInfo<>(pageNo, pageSize);
IPage<TaskInstance> taskInstanceIPage;
if (taskExecuteType == TaskExecuteType.STREAM) {
// stream task without workflow instance
@@ -178,9 +175,6 @@ public class TaskInstanceServiceImpl extends
BaseServiceImpl implements TaskInst
start,
end);
}
- Set<String> exclusionSet = new HashSet<>();
- exclusionSet.add(Constants.CLASS);
- exclusionSet.add("taskJson");
List<TaskInstance> taskInstanceList = taskInstanceIPage.getRecords();
List<Integer> executorIds =
taskInstanceList.stream().map(TaskInstance::getExecutorId).distinct().collect(Collectors.toList());
@@ -194,7 +188,7 @@ public class TaskInstanceServiceImpl extends
BaseServiceImpl implements TaskInst
}
}
pageInfo.setTotal((int) taskInstanceIPage.getTotal());
-
pageInfo.setTotalList(CollectionUtils.getListByExclusion(taskInstanceIPage.getRecords(),
exclusionSet));
+ pageInfo.setTotalList(taskInstanceList);
result.setData(pageInfo);
putMsg(result, Status.SUCCESS);
return result;
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
deleted file mode 100644
index db1044f05f..0000000000
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CollectionUtils.java
+++ /dev/null
@@ -1,76 +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.common.utils;
-
-import org.apache.commons.beanutils.BeanMap;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Provides utility methods and decorators for {@link Collection} instances.
- * <p>
- * Various utility methods might put the input objects into a Set/Map/Bag. In
case
- * the input objects override {@link Object#equals(Object)}, it is mandatory
that
- * the general contract of the {@link Object#hashCode()} method is maintained.
- * <p>
- * NOTE: From 4.0, method parameters will take {@link Iterable} objects when
possible.
- *
- * @version $Id: CollectionUtils.java 1686855 2015-06-22 13:00:27Z tn $
- * @since 1.0
- */
-public class CollectionUtils {
-
- private CollectionUtils() {
- throw new UnsupportedOperationException("Construct CollectionUtils");
- }
-
- /**
- * Removes certain attributes of each object in the list
- *
- * @param originList origin list
- * @param exclusionSet exclusion set
- * @param <T> T
- * @return removes certain attributes of each object in the list
- */
- public static <T extends Object> List<Map<String, Object>>
getListByExclusion(List<T> originList,
-
Set<String> exclusionSet) {
- List<Map<String, Object>> instanceList = new ArrayList<>();
- if (originList == null) {
- return instanceList;
- }
- Map<String, Object> instanceMap;
- for (T instance : originList) {
- BeanMap beanMap = new BeanMap(instance);
- instanceMap = new LinkedHashMap<>(16, 0.75f, true);
- for (Map.Entry<Object, Object> entry : beanMap.entrySet()) {
- if (exclusionSet != null &&
exclusionSet.contains(entry.getKey())) {
- continue;
- }
- instanceMap.put((String) entry.getKey(), entry.getValue());
- }
- instanceList.add(instanceMap);
- }
- return instanceList;
- }
-
-}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ConnectionUtils.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ConnectionUtils.java
deleted file mode 100644
index 1c1f464c1d..0000000000
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ConnectionUtils.java
+++ /dev/null
@@ -1,51 +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.common.utils;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ConnectionUtils {
-
- private ConnectionUtils() {
- throw new UnsupportedOperationException("Construct ConnectionUtils");
- }
-
- /**
- * release resource
- *
- * @param resources resources
- */
- public static void releaseResource(AutoCloseable... resources) {
-
- if (resources == null || resources.length == 0) {
- return;
- }
- Arrays.stream(resources).filter(Objects::nonNull)
- .forEach(resource -> {
- try {
- resource.close();
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- }
- });
- }
-}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/RetryerUtils.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/RetryerUtils.java
deleted file mode 100644
index 1764ba1e0a..0000000000
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/RetryerUtils.java
+++ /dev/null
@@ -1,112 +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.common.utils;
-
-import org.apache.dolphinscheduler.common.constants.Constants;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-
-public class RetryerUtils {
-
- private static Retryer<Boolean> defaultRetryerResultCheck;
- private static Retryer<Boolean> defaultRetryerResultNoCheck;
-
- private RetryerUtils() {
- throw new UnsupportedOperationException("Construct RetryerUtils");
- }
-
- private static Retryer<Boolean> getDefaultRetryerResultNoCheck() {
- if (defaultRetryerResultNoCheck == null) {
- defaultRetryerResultNoCheck = RetryerBuilder
- .<Boolean>newBuilder()
- .retryIfException()
-
.withWaitStrategy(WaitStrategies.fixedWait(Constants.SLEEP_TIME_MILLIS,
TimeUnit.MILLISECONDS))
- .withStopStrategy(StopStrategies.stopAfterAttempt(3))
- .build();
- }
- return defaultRetryerResultNoCheck;
- }
-
- /**
- * Gets default retryer.
- * the retryer will retry 3 times if exceptions throw
- * and wait 1 second between each retry
- *
- * @param checkResult true means the callable must return true before
retrying
- * false means that retry callable only throw exceptions
- * @return the default retryer
- */
- public static Retryer<Boolean> getDefaultRetryer(boolean checkResult) {
- return checkResult ? getDefaultRetryer() :
getDefaultRetryerResultNoCheck();
- }
-
- /**
- * Gets default retryer.
- * the retryer will retry 3 times if exceptions throw
- * and wait 1 second between each retry
- *
- * @return the default retryer
- */
- public static Retryer<Boolean> getDefaultRetryer() {
- if (defaultRetryerResultCheck == null) {
- defaultRetryerResultCheck = RetryerBuilder
- .<Boolean>newBuilder()
- .retryIfResult(Boolean.FALSE::equals)
- .retryIfException()
-
.withWaitStrategy(WaitStrategies.fixedWait(Constants.SLEEP_TIME_MILLIS,
TimeUnit.MILLISECONDS))
- .withStopStrategy(StopStrategies.stopAfterAttempt(3))
- .build();
- }
- return defaultRetryerResultCheck;
- }
-
- /**
- * Use RETRYER to invoke the Callable
- *
- * @param callable the callable
- * @param checkResult true means that retry callable before returning true
- * false means that retry callable only throw exceptions
- * @return the final result of callable
- * @throws ExecutionException the execution exception
- * @throws RetryException the retry exception
- */
- public static Boolean retryCall(final Callable<Boolean> callable,
- boolean checkResult) throws
ExecutionException, RetryException {
- return getDefaultRetryer(checkResult).call(callable);
- }
-
- /**
- * Use RETRYER to invoke the Callable before returning true
- *
- * @param callable the callable
- * @return the boolean
- * @throws ExecutionException the execution exception
- * @throws RetryException the retry exception
- */
- public static Boolean retryCall(final Callable<Boolean> callable) throws
ExecutionException, RetryException {
- return retryCall(callable, true);
- }
-}
diff --git
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/TriFunction.java
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/TriFunction.java
deleted file mode 100644
index fae03af6b1..0000000000
---
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/TriFunction.java
+++ /dev/null
@@ -1,28 +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.common.utils;
-
-/**
- * tri function function interface
- */
-@FunctionalInterface
-public interface TriFunction<IN1, IN2, IN3, OUT1> {
-
- OUT1 apply(IN1 in1, IN2 in2, IN3 in3);
-
-}
diff --git
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/RetryerUtilsTest.java
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/RetryerUtilsTest.java
deleted file mode 100644
index bcf52adf26..0000000000
---
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/RetryerUtilsTest.java
+++ /dev/null
@@ -1,218 +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.common.utils;
-
-import java.util.concurrent.ExecutionException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.Retryer;
-
-public class RetryerUtilsTest {
-
- @Test
- public void testDefaultRetryer() {
- Retryer<Boolean> retryer = RetryerUtils.getDefaultRetryer();
- Assertions.assertNotNull(retryer);
- try {
- boolean result = retryer.call(() -> true);
- Assertions.assertTrue(result);
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- Retryer<Boolean> retryer1 = RetryerUtils.getDefaultRetryer(true);
- Assertions.assertEquals(retryer, retryer1);
- }
-
- @Test
- public void testDefaultRetryerResultCheck() {
- Retryer<Boolean> retryer = RetryerUtils.getDefaultRetryer();
- Assertions.assertNotNull(retryer);
- try {
- for (int execTarget = 1; execTarget <= 3; execTarget++) {
- int finalExecTarget = execTarget;
- int[] execTime = {0};
- boolean result = retryer.call(() -> {
- execTime[0]++;
- return execTime[0] == finalExecTarget;
- });
- Assertions.assertEquals(finalExecTarget, execTime[0]);
- Assertions.assertTrue(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- int[] execTime = {0};
- try {
- retryer.call(() -> {
- execTime[0]++;
- return execTime[0] == 4;
- });
- Assertions.fail("Retry times not reached");
- } catch (RetryException e) {
- Assertions.assertEquals(3, e.getNumberOfFailedAttempts());
- Assertions.assertEquals(3, execTime[0]);
- } catch (ExecutionException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- @Test
- public void testDefaultRetryerResultNoCheck() {
- Retryer<Boolean> retryer = RetryerUtils.getDefaultRetryer(false);
- Assertions.assertNotNull(retryer);
- try {
- for (int execTarget = 1; execTarget <= 5; execTarget++) {
- int[] execTime = {0};
- boolean result = retryer.call(() -> {
- execTime[0]++;
- return execTime[0] > 1;
- });
- Assertions.assertEquals(1, execTime[0]);
- Assertions.assertFalse(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- @Test
- public void testRecallResultCheck() {
- try {
- for (int execTarget = 1; execTarget <= 3; execTarget++) {
- int finalExecTarget = execTarget;
- int[] execTime = {0};
- boolean result = RetryerUtils.retryCall(() -> {
- execTime[0]++;
- return execTime[0] == finalExecTarget;
- });
- Assertions.assertEquals(finalExecTarget, execTime[0]);
- Assertions.assertTrue(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- int[] execTime = {0};
- try {
- RetryerUtils.retryCall(() -> {
- execTime[0]++;
- return execTime[0] == 4;
- });
- Assertions.fail("Recall times not reached");
- } catch (RetryException e) {
- Assertions.assertEquals(3, e.getNumberOfFailedAttempts());
- Assertions.assertEquals(3, execTime[0]);
- } catch (ExecutionException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- @Test
- public void testRecallResultCheckWithPara() {
- try {
- for (int execTarget = 1; execTarget <= 3; execTarget++) {
- int finalExecTarget = execTarget;
- int[] execTime = {0};
- boolean result = RetryerUtils.retryCall(() -> {
- execTime[0]++;
- return execTime[0] == finalExecTarget;
- }, true);
- Assertions.assertEquals(finalExecTarget, execTime[0]);
- Assertions.assertTrue(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- int[] execTime = {0};
- try {
- RetryerUtils.retryCall(() -> {
- execTime[0]++;
- return execTime[0] == 4;
- }, true);
- Assertions.fail("Recall times not reached");
- } catch (RetryException e) {
- Assertions.assertEquals(3, e.getNumberOfFailedAttempts());
- Assertions.assertEquals(3, execTime[0]);
- } catch (ExecutionException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- @Test
- public void testRecallResultNoCheck() {
- try {
- for (int execTarget = 1; execTarget <= 5; execTarget++) {
- int[] execTime = {0};
- boolean result = RetryerUtils.retryCall(() -> {
- execTime[0]++;
- return execTime[0] > 1;
- }, false);
- Assertions.assertEquals(1, execTime[0]);
- Assertions.assertFalse(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- private void testRetryExceptionWithPara(boolean checkResult) {
- try {
- for (int execTarget = 1; execTarget <= 3; execTarget++) {
- int finalExecTarget = execTarget;
- int[] execTime = {0};
- boolean result = RetryerUtils.retryCall(() -> {
- execTime[0]++;
- if (execTime[0] != finalExecTarget) {
- throw new
IllegalArgumentException(String.valueOf(execTime[0]));
- }
- return true;
- }, checkResult);
- Assertions.assertEquals(finalExecTarget, execTime[0]);
- Assertions.assertTrue(result);
- }
- } catch (ExecutionException | RetryException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- int[] execTime = {0};
- try {
- RetryerUtils.retryCall(() -> {
- execTime[0]++;
- if (execTime[0] != 4) {
- throw new
IllegalArgumentException(String.valueOf(execTime[0]));
- }
- return true;
- }, checkResult);
- Assertions.fail("Recall times not reached");
- } catch (RetryException e) {
- Assertions.assertEquals(3, e.getNumberOfFailedAttempts());
- Assertions.assertEquals(3, execTime[0]);
- Assertions.assertNotNull(e.getCause());
- Assertions.assertEquals(3,
Integer.parseInt(e.getCause().getMessage()));
- } catch (ExecutionException e) {
- Assertions.fail("Retry call failed " + e.getMessage());
- }
- }
-
- @Test
- public void testRetryException() {
- testRetryExceptionWithPara(true);
- testRetryExceptionWithPara(false);
- }
-}
diff --git
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/StringTest.java
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/StringTest.java
deleted file mode 100644
index 8c685c736e..0000000000
---
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/StringTest.java
+++ /dev/null
@@ -1,54 +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.common.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-public class StringTest {
-
- @Test
- public void stringCompareTest() {
-
- for (int j = 0; j < 5; j++) {
- long start = System.currentTimeMillis();
- int size = 10000;
-
- List<String> taskList = new ArrayList<>(size);
-
- // init
- for (int i = 0; i < size; i++) {
- taskList.add(String.format("%d_%010d_%010d", 1, i, i + 1));
- }
-
- String origin = taskList.get(0);
- for (int i = 1; i < taskList.size(); i++) {
- String str = taskList.get(i);
- int result = str.compareTo(origin);
- if (result < 0) {
- origin = str;
- }
- }
- double during = (System.currentTimeMillis() - start) / 1000.0;
- Assertions.assertEquals("1_0000000000_0000000001", origin);
- }
- }
-}
diff --git
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/utils/DagHelper.java
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/utils/DagHelper.java
index 414e9970ec..50dc2a3f49 100644
---
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/utils/DagHelper.java
+++
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/utils/DagHelper.java
@@ -17,421 +17,27 @@
package org.apache.dolphinscheduler.service.utils;
-import org.apache.dolphinscheduler.common.enums.TaskDependType;
import org.apache.dolphinscheduler.common.graph.DAG;
import org.apache.dolphinscheduler.common.model.TaskNodeRelation;
-import org.apache.dolphinscheduler.common.utils.JSONUtils;
-import org.apache.dolphinscheduler.dao.entity.TaskInstance;
import org.apache.dolphinscheduler.dao.entity.WorkflowTaskRelation;
-import org.apache.dolphinscheduler.plugin.task.api.model.SwitchResultVo;
-import
org.apache.dolphinscheduler.plugin.task.api.parameters.ConditionsParameters;
-import org.apache.dolphinscheduler.plugin.task.api.parameters.SwitchParameters;
-import
org.apache.dolphinscheduler.plugin.task.api.task.ConditionsLogicTaskChannelFactory;
-import
org.apache.dolphinscheduler.plugin.task.api.task.SwitchLogicTaskChannelFactory;
-import org.apache.dolphinscheduler.plugin.task.api.utils.TaskTypeUtils;
import org.apache.dolphinscheduler.service.model.TaskNode;
import org.apache.dolphinscheduler.service.process.WorkflowDag;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
import lombok.extern.slf4j.Slf4j;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.google.common.collect.Lists;
-
/**
* dag tools
*/
@Slf4j
public class DagHelper {
- /**
- * generate flow node relation list by task node list;
- * Edges that are not in the task Node List will not be added to the result
- *
- * @param taskNodeList taskNodeList
- * @return task node relation list
- */
- public static List<TaskNodeRelation>
generateRelationListByFlowNodes(List<TaskNode> taskNodeList) {
- List<TaskNodeRelation> nodeRelationList = new ArrayList<>();
- for (TaskNode taskNode : taskNodeList) {
- String preTasks = taskNode.getPreTasks();
- List<Long> preTaskList = JSONUtils.toList(preTasks, Long.class);
- if (preTaskList != null) {
- for (Long depNodeCode : preTaskList) {
- if (null != findNodeByCode(taskNodeList, depNodeCode)) {
- nodeRelationList.add(new TaskNodeRelation(depNodeCode,
taskNode.getCode()));
- }
- }
- }
- }
- return nodeRelationList;
- }
-
- /**
- * generate task nodes needed by dag
- *
- * @param taskNodeList taskNodeList
- * @param startNodeNameList startNodeNameList
- * @param recoveryNodeCodeList recoveryNodeCodeList
- * @param taskDependType taskDependType
- * @return task node list
- */
- public static List<TaskNode>
generateFlowNodeListByStartNode(List<TaskNode> taskNodeList,
- List<Long>
startNodeNameList,
- List<Long>
recoveryNodeCodeList,
-
TaskDependType taskDependType) {
- List<TaskNode> destFlowNodeList = new ArrayList<>();
- List<Long> startNodeList = startNodeNameList;
-
- if (taskDependType != TaskDependType.TASK_POST &&
CollectionUtils.isEmpty(startNodeList)) {
- log.error("start node list is empty! cannot continue run the
workflow ");
- return destFlowNodeList;
- }
-
- List<TaskNode> destTaskNodeList = new ArrayList<>();
- List<TaskNode> tmpTaskNodeList = new ArrayList<>();
-
- if (taskDependType == TaskDependType.TASK_POST
- && CollectionUtils.isNotEmpty(recoveryNodeCodeList)) {
- startNodeList = recoveryNodeCodeList;
- }
- if (CollectionUtils.isEmpty(startNodeList)) {
- // no special designation start nodes
- tmpTaskNodeList = taskNodeList;
- } else {
- // specified start nodes or resume execution
- for (Long startNodeCode : startNodeList) {
- TaskNode startNode = findNodeByCode(taskNodeList,
startNodeCode);
- List<TaskNode> childNodeList = new ArrayList<>();
- if (startNode == null) {
- log.error("start node name [{}] is not in task node list
[{}] ",
- startNodeCode,
- taskNodeList);
- continue;
- } else if (TaskDependType.TASK_POST == taskDependType) {
- List<Long> visitedNodeCodeList = new ArrayList<>();
- childNodeList = getFlowNodeListPost(startNode,
taskNodeList, visitedNodeCodeList);
- } else if (TaskDependType.TASK_PRE == taskDependType) {
- List<Long> visitedNodeCodeList = new ArrayList<>();
- childNodeList =
- getFlowNodeListPre(startNode,
recoveryNodeCodeList, taskNodeList, visitedNodeCodeList);
- } else {
- childNodeList.add(startNode);
- }
- tmpTaskNodeList.addAll(childNodeList);
- }
- }
-
- for (TaskNode taskNode : tmpTaskNodeList) {
- if (null == findNodeByCode(destTaskNodeList, taskNode.getCode())) {
- destTaskNodeList.add(taskNode);
- }
- }
- return destTaskNodeList;
- }
-
- /**
- * find all the nodes that depended on the start node
- *
- * @param startNode startNode
- * @param taskNodeList taskNodeList
- * @return task node list
- */
- private static List<TaskNode> getFlowNodeListPost(TaskNode startNode,
- List<TaskNode>
taskNodeList,
- List<Long>
visitedNodeCodeList) {
- List<TaskNode> resultList = new ArrayList<>();
- for (TaskNode taskNode : taskNodeList) {
- List<Long> depList = taskNode.getDepList();
- if (null != depList && null != startNode &&
depList.contains(startNode.getCode())
- && !visitedNodeCodeList.contains(taskNode.getCode())) {
- resultList.addAll(getFlowNodeListPost(taskNode, taskNodeList,
visitedNodeCodeList));
- }
- }
- // why add (startNode != null) condition? for SonarCloud Quality Gate
passed
- if (null != startNode) {
- visitedNodeCodeList.add(startNode.getCode());
- }
-
- resultList.add(startNode);
- return resultList;
- }
-
- /**
- * find all nodes that start nodes depend on.
- *
- * @param startNode startNode
- * @param recoveryNodeCodeList recoveryNodeCodeList
- * @param taskNodeList taskNodeList
- * @return task node list
- */
- private static List<TaskNode> getFlowNodeListPre(TaskNode startNode,
- List<Long>
recoveryNodeCodeList,
- List<TaskNode>
taskNodeList,
- List<Long>
visitedNodeCodeList) {
-
- List<TaskNode> resultList = new ArrayList<>();
-
- List<Long> depList = new ArrayList<>();
- if (null != startNode) {
- depList = startNode.getDepList();
- resultList.add(startNode);
- }
- if (CollectionUtils.isEmpty(depList)) {
- return resultList;
- }
- for (Long depNodeCode : depList) {
- TaskNode start = findNodeByCode(taskNodeList, depNodeCode);
- if (recoveryNodeCodeList.contains(depNodeCode)) {
- resultList.add(start);
- } else if (!visitedNodeCodeList.contains(depNodeCode)) {
- resultList.addAll(getFlowNodeListPre(start,
recoveryNodeCodeList, taskNodeList, visitedNodeCodeList));
- }
- }
- // why add (startNode != null) condition? for SonarCloud Quality Gate
passed
- if (null != startNode) {
- visitedNodeCodeList.add(startNode.getCode());
- }
- return resultList;
- }
-
- /**
- * find node by node code
- *
- * @param nodeDetails nodeDetails
- * @param nodeCode nodeCode
- * @return task node
- */
- public static TaskNode findNodeByCode(List<TaskNode> nodeDetails, Long
nodeCode) {
- for (TaskNode taskNode : nodeDetails) {
- if (taskNode.getCode() == nodeCode) {
- return taskNode;
- }
- }
- return null;
- }
-
- /**
- * the task can be submit when all the depends nodes are forbidden or
complete
- *
- * @param taskNode taskNode
- * @param dag dag
- * @param completeTaskList completeTaskList
- * @return can submit
- */
- public static boolean allDependsForbiddenOrEnd(TaskNode taskNode,
- DAG<Long, TaskNode,
TaskNodeRelation> dag,
- Map<Long, TaskNode>
skipTaskNodeList,
- Map<Long, TaskInstance>
completeTaskList) {
- List<Long> dependList = taskNode.getDepList();
- if (dependList == null) {
- return true;
- }
- for (Long dependNodeCode : dependList) {
- TaskNode dependNode = dag.getNode(dependNodeCode);
- if (dependNode == null ||
completeTaskList.containsKey(dependNodeCode)
- || dependNode.isForbidden()
- || skipTaskNodeList.containsKey(dependNodeCode)) {
- continue;
- } else {
- return false;
- }
- }
- return true;
- }
-
- /**
- * parse the successor nodes of previous node.
- * this function parse the condition node to find the right branch.
- * also check all the depends nodes forbidden or complete
- *
- * @return successor nodes
- */
- public static Set<Long> parsePostNodes(Long preNodeCode,
- Map<Long, TaskNode>
skipTaskNodeList,
- DAG<Long, TaskNode,
TaskNodeRelation> dag,
- Map<Long, TaskInstance>
completeTaskList) {
- Set<Long> postNodeList = new HashSet<>();
- Collection<Long> startVertexes = new ArrayList<>();
-
- if (preNodeCode == null) {
- startVertexes = dag.getBeginNode();
- } else if
(TaskTypeUtils.isConditionTask(dag.getNode(preNodeCode).getType())) {
- List<Long> conditionTaskList = parseConditionTask(preNodeCode,
skipTaskNodeList, dag, completeTaskList);
- startVertexes.addAll(conditionTaskList);
- } else if
(TaskTypeUtils.isSwitchTask(dag.getNode(preNodeCode).getType())) {
- List<Long> conditionTaskList = parseSwitchTask(preNodeCode,
skipTaskNodeList, dag, completeTaskList);
- startVertexes.addAll(conditionTaskList);
- } else {
- startVertexes = dag.getSubsequentNodes(preNodeCode);
- }
- for (Long subsequent : startVertexes) {
- TaskNode taskNode = dag.getNode(subsequent);
- if (taskNode == null) {
- log.error("taskNode {} is null, please check dag", subsequent);
- continue;
- }
- if (isTaskNodeNeedSkip(taskNode, skipTaskNodeList)) {
- setTaskNodeSkip(subsequent, dag, skipTaskNodeList);
- continue;
- }
- if (!DagHelper.allDependsForbiddenOrEnd(taskNode, dag,
skipTaskNodeList, completeTaskList)) {
- continue;
- }
- if (taskNode.isForbidden() ||
completeTaskList.containsKey(subsequent)) {
- postNodeList.addAll(parsePostNodes(subsequent,
skipTaskNodeList, dag, completeTaskList));
- continue;
- }
- postNodeList.add(subsequent);
- }
- return postNodeList;
- }
-
- /**
- * if all of the task dependence are skipped, skip it too.
- */
- private static boolean isTaskNodeNeedSkip(TaskNode taskNode,
- Map<Long, TaskNode>
skipTaskNodeList) {
- if (CollectionUtils.isEmpty(taskNode.getDepList())) {
- return false;
- }
- for (Long depNode : taskNode.getDepList()) {
- if (!skipTaskNodeList.containsKey(depNode)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * parse condition task find the branch workflow
- * set skip flag for another one.
- */
- public static List<Long> parseConditionTask(Long nodeCode,
- Map<Long, TaskNode>
skipTaskNodeList,
- DAG<Long, TaskNode,
TaskNodeRelation> dag,
- Map<Long, TaskInstance>
completeTaskList) {
- List<Long> conditionTaskList = new ArrayList<>();
- TaskNode taskNode = dag.getNode(nodeCode);
- if (!TaskTypeUtils.isConditionTask(taskNode.getType())) {
- return conditionTaskList;
- }
- if (!completeTaskList.containsKey(nodeCode)) {
- return conditionTaskList;
- }
- TaskInstance taskInstance = completeTaskList.get(nodeCode);
- ConditionsParameters conditionsParameters =
- JSONUtils.parseObject(taskInstance.getTaskParams(), new
TypeReference<ConditionsParameters>() {
- });
- ConditionsParameters.ConditionResult conditionResult =
conditionsParameters.getConditionResult();
-
- List<Long> skipNodeList = new ArrayList<>();
- if (conditionResult.isConditionSuccess()) {
- conditionTaskList = conditionResult.getSuccessNode();
- skipNodeList = conditionResult.getFailedNode();
- } else {
- conditionTaskList = conditionResult.getFailedNode();
- skipNodeList = conditionResult.getSuccessNode();
- }
-
- if (CollectionUtils.isNotEmpty(skipNodeList)) {
- skipNodeList.forEach(skipNode -> setTaskNodeSkip(skipNode, dag,
skipTaskNodeList));
- }
- // the conditionTaskList maybe null if no next task
- conditionTaskList = Optional.ofNullable(conditionTaskList).orElse(new
ArrayList<>());
- return conditionTaskList;
- }
-
- /**
- * parse condition task find the branch workflow
- * set skip flag for another one.
- *
- * @param nodeCode
- * @return
- */
- public static List<Long> parseSwitchTask(Long nodeCode,
- Map<Long, TaskNode>
skipTaskNodeList,
- DAG<Long, TaskNode,
TaskNodeRelation> dag,
- Map<Long, TaskInstance>
completeTaskList) {
- List<Long> conditionTaskList = new ArrayList<>();
- TaskNode taskNode = dag.getNode(nodeCode);
- if (!SwitchLogicTaskChannelFactory.NAME.equals(taskNode.getType())) {
- return conditionTaskList;
- }
- if (!completeTaskList.containsKey(nodeCode)) {
- return conditionTaskList;
- }
- conditionTaskList = skipTaskNode4Switch(skipTaskNodeList,
completeTaskList.get(nodeCode), dag);
- return conditionTaskList;
- }
-
- public static List<Long> skipTaskNode4Switch(Map<Long, TaskNode>
skipTaskNodeList,
- TaskInstance taskInstance,
- DAG<Long, TaskNode,
TaskNodeRelation> dag) {
- SwitchParameters switchParameters =
- JSONUtils.parseObject(taskInstance.getTaskParams(), new
TypeReference<SwitchParameters>() {
- });
-
- SwitchParameters.SwitchResult switchResult =
switchParameters.getSwitchResult();
- Long nextBranch = switchParameters.getNextBranch();
- if (switchResult == null) {
- log.error("switchResult is null, please check the switch task
configuration");
- return Collections.emptyList();
- }
- if (nextBranch == null) {
- log.error("switchParameters.getNextBranch() is null, please check
the switch task configuration");
- return Collections.emptyList();
- }
-
- Set<Long> allNextBranches = new HashSet<>();
- if (switchResult.getNextNode() != null) {
- allNextBranches.add(switchResult.getNextNode());
- }
- if (CollectionUtils.isNotEmpty(switchResult.getDependTaskList())) {
- for (SwitchResultVo switchResultVo :
switchResult.getDependTaskList()) {
- allNextBranches.add(switchResultVo.getNextNode());
- }
- }
-
- allNextBranches.remove(nextBranch);
-
- for (Long branch : allNextBranches) {
- setTaskNodeSkip(branch, dag, skipTaskNodeList);
- }
- return Lists.newArrayList(nextBranch);
- }
-
- /**
- * set task node and the post nodes skip flag
- */
- private static void setTaskNodeSkip(Long skipNodeCode,
- DAG<Long, TaskNode, TaskNodeRelation>
dag,
- Map<Long, TaskNode> skipTaskNodeList) {
- if (!dag.containsNode(skipNodeCode)) {
- return;
- }
- skipTaskNodeList.putIfAbsent(skipNodeCode, dag.getNode(skipNodeCode));
- Collection<Long> postNodeList = dag.getSubsequentNodes(skipNodeCode);
- for (Long post : postNodeList) {
- TaskNode postNode = dag.getNode(post);
- if (isTaskNodeNeedSkip(postNode, skipTaskNodeList)) {
- setTaskNodeSkip(post, dag, skipTaskNodeList);
- }
- }
- }
-
/***
* build dag graph
* @param workflowDag workflowDag
@@ -457,34 +63,6 @@ public class DagHelper {
return dag;
}
- /**
- * get workflow dag
- *
- * @param taskNodeList task node list
- * @return workflow dag
- */
- public static WorkflowDag getWorkflowDag(List<TaskNode> taskNodeList) {
- List<TaskNodeRelation> taskNodeRelations = new ArrayList<>();
-
- // Traverse node information and build relationships
- for (TaskNode taskNode : taskNodeList) {
- String preTasks = taskNode.getPreTasks();
- List<Long> preTasksList = JSONUtils.toList(preTasks, Long.class);
-
- // If the dependency is not empty
- if (preTasksList != null) {
- for (Long depNode : preTasksList) {
- taskNodeRelations.add(new TaskNodeRelation(depNode,
taskNode.getCode()));
- }
- }
- }
-
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(taskNodeList);
- return workflowDag;
- }
-
/**
* get workflow dag
*
@@ -518,40 +96,4 @@ public class DagHelper {
return workflowDag;
}
- /**
- * is there have conditions after the parent node
- */
- public static boolean haveConditionsAfterNode(Long parentNodeCode,
- DAG<Long, TaskNode,
TaskNodeRelation> dag) {
- return haveSubAfterNode(parentNodeCode, dag,
ConditionsLogicTaskChannelFactory.NAME);
- }
-
- /**
- * is there have all node after the parent node
- */
- public static boolean haveAllNodeAfterNode(Long parentNodeCode,
- DAG<Long, TaskNode,
TaskNodeRelation> dag) {
- return haveSubAfterNode(parentNodeCode, dag, null);
- }
-
- /**
- * Whether there is a specified type of child node after the parent node
- */
- public static boolean haveSubAfterNode(Long parentNodeCode,
- DAG<Long, TaskNode,
TaskNodeRelation> dag, String filterNodeType) {
- Set<Long> subsequentNodes = dag.getSubsequentNodes(parentNodeCode);
- if (CollectionUtils.isEmpty(subsequentNodes)) {
- return false;
- }
- if (StringUtils.isBlank(filterNodeType)) {
- return true;
- }
- for (Long nodeName : subsequentNodes) {
- TaskNode taskNode = dag.getNode(nodeName);
- if (taskNode.getType().equalsIgnoreCase(filterNodeType)) {
- return true;
- }
- }
- return false;
- }
}
diff --git
a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/utils/DagHelperTest.java
b/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/utils/DagHelperTest.java
deleted file mode 100644
index 5489b9de8a..0000000000
---
a/dolphinscheduler-service/src/test/java/org/apache/dolphinscheduler/service/utils/DagHelperTest.java
+++ /dev/null
@@ -1,707 +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.service.utils;
-
-import org.apache.dolphinscheduler.common.constants.Constants;
-import org.apache.dolphinscheduler.common.enums.TaskDependType;
-import org.apache.dolphinscheduler.common.graph.DAG;
-import org.apache.dolphinscheduler.common.model.TaskNodeRelation;
-import org.apache.dolphinscheduler.common.utils.JSONUtils;
-import org.apache.dolphinscheduler.dao.entity.TaskInstance;
-import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
-import org.apache.dolphinscheduler.plugin.task.api.model.Property;
-import org.apache.dolphinscheduler.plugin.task.api.model.SwitchResultVo;
-import
org.apache.dolphinscheduler.plugin.task.api.parameters.ConditionsParameters;
-import org.apache.dolphinscheduler.plugin.task.api.parameters.SwitchParameters;
-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.SwitchLogicTaskChannelFactory;
-import org.apache.dolphinscheduler.service.model.TaskNode;
-import org.apache.dolphinscheduler.service.process.WorkflowDag;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.common.collect.Lists;
-import com.google.common.truth.Truth;
-
-public class DagHelperTest {
-
- @Test
- public void testHaveSubAfterNode() {
- Long parentNodeCode = 5293789969856L;
- List<TaskNodeRelation> taskNodeRelations = new ArrayList<>();
- TaskNodeRelation relation = new TaskNodeRelation();
- relation.setStartNode(5293789969856L);
- relation.setEndNode(5293789969857L);
- taskNodeRelations.add(relation);
-
- TaskNodeRelation relationNext = new TaskNodeRelation();
- relationNext.setStartNode(5293789969856L);
- relationNext.setEndNode(5293789969858L);
- taskNodeRelations.add(relationNext);
-
- List<TaskNode> taskNodes = new ArrayList<>();
- TaskNode node = new TaskNode();
- node.setCode(5293789969856L);
- node.setType("SHELL");
-
- TaskNode subNode = new TaskNode();
- subNode.setCode(5293789969857L);
- subNode.setType("BLOCKING");
- subNode.setPreTasks("[5293789969856]");
-
- TaskNode subNextNode = new TaskNode();
- subNextNode.setCode(5293789969858L);
- subNextNode.setType("CONDITIONS");
- subNextNode.setPreTasks("[5293789969856]");
-
- taskNodes.add(node);
- taskNodes.add(subNode);
- taskNodes.add(subNextNode);
-
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(taskNodes);
- DAG<Long, TaskNode, TaskNodeRelation> dag =
DagHelper.buildDagGraph(workflowDag);
- boolean canSubmit = DagHelper.haveAllNodeAfterNode(parentNodeCode,
dag);
- Assertions.assertTrue(canSubmit);
-
- boolean haveConditions =
DagHelper.haveConditionsAfterNode(parentNodeCode, dag);
- Assertions.assertTrue(haveConditions);
-
- boolean dependent = DagHelper.haveSubAfterNode(parentNodeCode, dag,
DependentLogicTaskChannelFactory.NAME);
- Assertions.assertFalse(dependent);
- }
-
- @Test
- public void testTaskNodeCanSubmit() {
- List<TaskNode> taskNodeList = new ArrayList<>();
- TaskNode node1 = new TaskNode();
- node1.setId("1");
- node1.setName("1");
- node1.setCode(1);
- node1.setType("SHELL");
- taskNodeList.add(node1);
-
- TaskNode node2 = new TaskNode();
- node2.setId("2");
- node2.setName("2");
- node2.setCode(2);
- node2.setType("SHELL");
- List<String> dep2 = new ArrayList<>();
- dep2.add("1");
- node2.setPreTasks(JSONUtils.toJsonString(dep2));
- taskNodeList.add(node2);
-
- TaskNode node4 = new TaskNode();
- node4.setId("4");
- node4.setName("4");
- node4.setCode(4);
- node4.setType("SHELL");
- taskNodeList.add(node4);
-
- TaskNode node3 = new TaskNode();
- node3.setId("3");
- node3.setName("3");
- node3.setCode(3);
- node3.setType("SHELL");
- List<String> dep3 = new ArrayList<>();
- dep3.add("2");
- dep3.add("4");
- node3.setPreTasks(JSONUtils.toJsonString(dep3));
- taskNodeList.add(node3);
-
- TaskNode node5 = new TaskNode();
- node5.setId("5");
- node5.setName("5");
- node5.setCode(5);
- node5.setType("SHELL");
- List<String> dep5 = new ArrayList<>();
- dep5.add("3");
- dep5.add("8");
- node5.setPreTasks(JSONUtils.toJsonString(dep5));
- taskNodeList.add(node5);
-
- TaskNode node6 = new TaskNode();
- node6.setId("6");
- node6.setName("6");
- node6.setCode(6);
- node6.setType("SHELL");
- List<String> dep6 = new ArrayList<>();
- dep6.add("3");
- node6.setPreTasks(JSONUtils.toJsonString(dep6));
- taskNodeList.add(node6);
-
- TaskNode node7 = new TaskNode();
- node7.setId("7");
- node7.setName("7");
- node7.setCode(7);
- node7.setType("SHELL");
- List<String> dep7 = new ArrayList<>();
- dep7.add("5");
- node7.setPreTasks(JSONUtils.toJsonString(dep7));
- taskNodeList.add(node7);
-
- TaskNode node8 = new TaskNode();
- node8.setId("8");
- node8.setName("8");
- node8.setCode(8);
- node8.setType("SHELL");
- List<String> dep8 = new ArrayList<>();
- dep8.add("2");
- node8.setPreTasks(JSONUtils.toJsonString(dep8));
- taskNodeList.add(node8);
-
- List<Long> startNodes = new ArrayList<>();
- List<Long> recoveryNodes = new ArrayList<>();
- List<TaskNode> destTaskNodeList =
DagHelper.generateFlowNodeListByStartNode(taskNodeList,
- startNodes, recoveryNodes, TaskDependType.TASK_POST);
- List<TaskNodeRelation> taskNodeRelations =
DagHelper.generateRelationListByFlowNodes(destTaskNodeList);
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(destTaskNodeList);
-
- // 1->2->3->5->7
- // 4->3->6
- // 1->2->8->5->7
- DAG<Long, TaskNode, TaskNodeRelation> dag =
DagHelper.buildDagGraph(workflowDag);
- TaskNode taskNode3 = dag.getNode(3L);
- Map<Long, TaskInstance> completeTaskList = new HashMap<>();
- Map<Long, TaskNode> skipNodeList = new HashMap<>();
- completeTaskList.putIfAbsent(1L, new TaskInstance());
- Boolean canSubmit = false;
-
- // 2/4 are forbidden submit 3
- node2 = dag.getNode(2L);
- node2.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- TaskNode nodex = dag.getNode(4L);
- nodex.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- canSubmit = DagHelper.allDependsForbiddenOrEnd(taskNode3, dag,
skipNodeList, completeTaskList);
- Assertions.assertEquals(canSubmit, true);
-
- // 2forbidden, 3 cannot be submit
- completeTaskList.putIfAbsent(2L, new TaskInstance());
- TaskNode nodey = dag.getNode(4L);
- nodey.setRunFlag("");
- canSubmit = DagHelper.allDependsForbiddenOrEnd(taskNode3, dag,
skipNodeList, completeTaskList);
- Assertions.assertEquals(canSubmit, false);
-
- // 2/3 forbidden submit 5
- node3 = dag.getNode(3L);
- node3.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- node8 = dag.getNode(8L);
- node8.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- node5 = dag.getNode(5L);
- canSubmit = DagHelper.allDependsForbiddenOrEnd(node5, dag,
skipNodeList, completeTaskList);
- Assertions.assertEquals(canSubmit, true);
- }
-
- @Test
- public void testParsePostNodeList() {
- List<TaskNode> taskNodeList = new ArrayList<>();
- TaskNode node1 = new TaskNode();
- node1.setId("1");
- node1.setName("1");
- node1.setCode(1);
- node1.setType("SHELL");
- taskNodeList.add(node1);
-
- TaskNode node2 = new TaskNode();
- node2.setId("2");
- node2.setName("2");
- node2.setCode(2);
- node2.setType("SHELL");
- List<String> dep2 = new ArrayList<>();
- dep2.add("1");
- node2.setPreTasks(JSONUtils.toJsonString(dep2));
- taskNodeList.add(node2);
-
- TaskNode node4 = new TaskNode();
- node4.setId("4");
- node4.setName("4");
- node4.setCode(4);
- node4.setType("SHELL");
- taskNodeList.add(node4);
-
- TaskNode node3 = new TaskNode();
- node3.setId("3");
- node3.setName("3");
- node3.setCode(3);
- node3.setType("SHELL");
- List<String> dep3 = new ArrayList<>();
- dep3.add("2");
- dep3.add("4");
- node3.setPreTasks(JSONUtils.toJsonString(dep3));
- taskNodeList.add(node3);
-
- TaskNode node5 = new TaskNode();
- node5.setId("5");
- node5.setName("5");
- node5.setCode(5);
- node5.setType("SHELL");
- List<String> dep5 = new ArrayList<>();
- dep5.add("3");
- dep5.add("8");
- node5.setPreTasks(JSONUtils.toJsonString(dep5));
- taskNodeList.add(node5);
-
- TaskNode node6 = new TaskNode();
- node6.setId("6");
- node6.setName("6");
- node6.setCode(6);
- node6.setType("SHELL");
- List<String> dep6 = new ArrayList<>();
- dep6.add("3");
- node6.setPreTasks(JSONUtils.toJsonString(dep6));
- taskNodeList.add(node6);
-
- TaskNode node7 = new TaskNode();
- node7.setId("7");
- node7.setName("7");
- node7.setCode(7);
- node7.setType("SHELL");
- List<String> dep7 = new ArrayList<>();
- dep7.add("5");
- node7.setPreTasks(JSONUtils.toJsonString(dep7));
- taskNodeList.add(node7);
-
- TaskNode node8 = new TaskNode();
- node8.setId("8");
- node8.setName("8");
- node8.setCode(8);
- node8.setType("SHELL");
- List<String> dep8 = new ArrayList<>();
- dep8.add("2");
- node8.setPreTasks(JSONUtils.toJsonString(dep8));
- taskNodeList.add(node8);
-
- List<Long> startNodes = new ArrayList<>();
- List<Long> recoveryNodes = new ArrayList<>();
- List<TaskNode> destTaskNodeList =
DagHelper.generateFlowNodeListByStartNode(taskNodeList,
- startNodes, recoveryNodes, TaskDependType.TASK_POST);
- List<TaskNodeRelation> taskNodeRelations =
DagHelper.generateRelationListByFlowNodes(destTaskNodeList);
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(destTaskNodeList);
-
- // 1->2->3->5->7
- // 4->3->6
- // 1->2->8->5->7
- DAG<Long, TaskNode, TaskNodeRelation> dag =
DagHelper.buildDagGraph(workflowDag);
- Map<Long, TaskInstance> completeTaskList = new HashMap<>();
- Map<Long, TaskNode> skipNodeList = new HashMap<>();
-
- Set<Long> postNodes = null;
- // complete : null
- // expect post: 1/4
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(1L));
- Assertions.assertTrue(postNodes.contains(4L));
-
- // complete : 1
- // expect post: 2/4
- completeTaskList.put(1L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(2L));
- Assertions.assertTrue(postNodes.contains(4L));
-
- // complete : 1/2
- // expect post: 4
- completeTaskList.put(2L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(4L));
- Assertions.assertTrue(postNodes.contains(8L));
-
- // complete : 1/2/4
- // expect post: 3
- completeTaskList.put(4L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(3L));
- Assertions.assertTrue(postNodes.contains(8L));
-
- // complete : 1/2/4/3
- // expect post: 8/6
- completeTaskList.put(3L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(8L));
- Assertions.assertTrue(postNodes.contains(6L));
-
- // complete : 1/2/4/3/8
- // expect post: 6/5
- completeTaskList.put(8L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(5L));
- Assertions.assertTrue(postNodes.contains(6L));
- // complete : 1/2/4/3/5/6/8
- // expect post: 7
- completeTaskList.put(6L, new TaskInstance());
- completeTaskList.put(5L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(1, postNodes.size());
- Assertions.assertTrue(postNodes.contains(7L));
- }
-
- @Test
- public void testForbiddenPostNode() throws IOException {
- DAG<Long, TaskNode, TaskNodeRelation> dag = generateDag();
- Map<Long, TaskInstance> completeTaskList = new HashMap<>();
- Map<Long, TaskNode> skipNodeList = new HashMap<>();
- Set<Long> postNodes = null;
- // dag: 1-2-3-5-7 4-3-6 2-8-5-7
- // forbid:2 complete:1 post:4/8
- completeTaskList.put(1L, new TaskInstance());
- TaskNode node2 = dag.getNode(2L);
- node2.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(4L));
- Assertions.assertTrue(postNodes.contains(8L));
-
- // forbid:2/4 complete:1 post:3/8
- TaskNode node4 = dag.getNode(4L);
- node4.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(2, postNodes.size());
- Assertions.assertTrue(postNodes.contains(3L));
- Assertions.assertTrue(postNodes.contains(8L));
-
- // forbid:2/4/5 complete:1/8 post:3
- completeTaskList.put(8L, new TaskInstance());
- TaskNode node5 = dag.getNode(5L);
- node5.setRunFlag(Constants.FLOWNODE_RUN_FLAG_FORBIDDEN);
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(1, postNodes.size());
- Assertions.assertTrue(postNodes.contains(3L));
- }
-
- @Test
- public void testConditionPostNode() throws IOException {
- DAG<Long, TaskNode, TaskNodeRelation> dag = generateDag();
- Map<Long, TaskInstance> completeTaskList = new HashMap<>();
- Map<Long, TaskNode> skipNodeList = new HashMap<>();
- Set<Long> postNodes = null;
- // dag: 1-2-3-5-7 4-3-6 2-8-5-7
- // 3-if
- completeTaskList.put(1L, new TaskInstance());
- completeTaskList.put(2L, new TaskInstance());
- completeTaskList.put(4L, new TaskInstance());
-
- TaskInstance taskInstance3 = new TaskInstance();
- taskInstance3.setTaskType(ConditionsLogicTaskChannelFactory.NAME);
- ConditionsParameters.ConditionResult conditionResult =
ConditionsParameters.ConditionResult.builder()
- .conditionSuccess(true)
- .successNode(Lists.newArrayList(5L))
- .failedNode(Lists.newArrayList(6L))
- .build();
- ConditionsParameters conditionsParameters = new ConditionsParameters();
- conditionsParameters.setConditionResult(conditionResult);
-
taskInstance3.setTaskParams(JSONUtils.toJsonString(conditionsParameters));
- taskInstance3.setState(TaskExecutionStatus.SUCCESS);
- TaskNode node3 = dag.getNode(3L);
- node3.setType(ConditionsLogicTaskChannelFactory.NAME);
- // complete 1/2/3/4 expect:8
- completeTaskList.put(3L, taskInstance3);
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(1, postNodes.size());
- Assertions.assertTrue(postNodes.contains(8L));
-
- // 2.complete 1/2/3/4/8 expect:5 skip:6
- completeTaskList.put(8L, new TaskInstance());
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertTrue(postNodes.contains(5L));
- Assertions.assertEquals(1, skipNodeList.size());
- Assertions.assertTrue(skipNodeList.containsKey(6L));
-
- // 3.complete 1/2/3/4/5/8 expect post:7 skip:6
- skipNodeList.clear();
- TaskInstance taskInstance1 = new TaskInstance();
- completeTaskList.put(5L, taskInstance1);
- postNodes = DagHelper.parsePostNodes(null, skipNodeList, dag,
completeTaskList);
- Assertions.assertEquals(1, postNodes.size());
- Assertions.assertTrue(postNodes.contains(7L));
- Assertions.assertEquals(1, skipNodeList.size());
- Assertions.assertTrue(skipNodeList.containsKey(6L));
-
- }
-
- @Test
- public void testSwitchPostNode() {
- List<TaskNode> taskNodeList = new ArrayList<>();
-
- TaskNode node = new TaskNode();
- node.setId("0");
- node.setName("0");
- node.setCode(0);
- node.setType("SHELL");
- taskNodeList.add(node);
-
- TaskNode node1 = new TaskNode();
- node1.setId("1");
- node1.setName("1");
- node1.setCode(1);
- node1.setType(SwitchLogicTaskChannelFactory.NAME);
- SwitchParameters switchParameters = new SwitchParameters();
- node1.setParams(JSONUtils.toJsonString(switchParameters));
- taskNodeList.add(node1);
-
- TaskNode node2 = new TaskNode();
- node2.setId("2");
- node2.setName("2");
- node2.setCode(2);
- node2.setType("SHELL");
- List<String> dep2 = new ArrayList<>();
- dep2.add("1");
- node2.setPreTasks(JSONUtils.toJsonString(dep2));
- taskNodeList.add(node2);
-
- TaskNode node4 = new TaskNode();
- node4.setId("4");
- node4.setName("4");
- node4.setCode(4);
- node4.setType("SHELL");
- List<String> dep4 = new ArrayList<>();
- dep4.add("1");
- node4.setPreTasks(JSONUtils.toJsonString(dep4));
- taskNodeList.add(node4);
-
- TaskNode node5 = new TaskNode();
- node5.setId("5");
- node5.setName("5");
- node5.setCode(5);
- node5.setType("SHELL");
- List<Long> dep5 = new ArrayList<>();
- dep5.add(1L);
- node5.setPreTasks(JSONUtils.toJsonString(dep5));
- taskNodeList.add(node5);
-
- TaskNode node6 = new TaskNode();
- node5.setId("6");
- node5.setName("6");
- node5.setCode(6);
- node5.setType("SHELL");
- List<Long> dep6 = new ArrayList<>();
- dep5.add(2L);
- dep5.add(4L);
- node5.setPreTasks(JSONUtils.toJsonString(dep6));
- taskNodeList.add(node6);
-
- List<Long> startNodes = new ArrayList<>();
- List<Long> recoveryNodes = new ArrayList<>();
-
- // 0
- // 1->2->6
- // 1->4->6
- // 1->5
- List<TaskNode> destTaskNodeList =
DagHelper.generateFlowNodeListByStartNode(taskNodeList,
- startNodes, recoveryNodes, TaskDependType.TASK_POST);
- List<TaskNodeRelation> taskNodeRelations =
DagHelper.generateRelationListByFlowNodes(destTaskNodeList);
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(destTaskNodeList);
-
- DAG<Long, TaskNode, TaskNodeRelation> dag =
DagHelper.buildDagGraph(workflowDag);
- Map<Long, TaskNode> skipTaskNodeList = new HashMap<>();
- Map<Long, TaskInstance> completeTaskList = new HashMap<>();
- completeTaskList.put(0L, new TaskInstance());
- TaskInstance taskInstance = new TaskInstance();
- taskInstance.setState(TaskExecutionStatus.SUCCESS);
- taskInstance.setTaskCode(1L);
- taskInstance.setTaskType(SwitchLogicTaskChannelFactory.NAME);
- switchParameters = SwitchParameters.builder()
- .nextBranch(5L)
- .switchResult(SwitchParameters.SwitchResult.builder()
- .dependTaskList(Lists.newArrayList(
- new SwitchResultVo("", 2L),
- new SwitchResultVo("", 4L)))
- .nextNode(5L)
- .build())
- .build();
- taskInstance.setTaskParams(JSONUtils.toJsonString(switchParameters));
- completeTaskList.put(1l, taskInstance);
- List<Long> nextBranch =
DagHelper.skipTaskNode4Switch(skipTaskNodeList, taskInstance, dag);
- Assertions.assertNotNull(skipTaskNodeList.get(2L));
- Assertions.assertNotNull(skipTaskNodeList.get(4L));
- Assertions.assertEquals(2, skipTaskNodeList.size());
- Truth.assertThat(nextBranch).containsExactly(5L);
- }
-
- /**
- * process:
- * 1->2->3->5->7
- * 4->3->6
- * 1->2->8->5->7
- * DAG graph:
- * 4 -> -> 6
- * \ /
- * 1 -> 2 -> 3 -> 5 -> 7
- * \ /
- * -> 8 ->
- *
- * @return dag
- * @throws JsonProcessingException if error throws JsonProcessingException
- */
- private DAG<Long, TaskNode, TaskNodeRelation> generateDag() throws
IOException {
- List<TaskNode> taskNodeList = new ArrayList<>();
- TaskNode node1 = new TaskNode();
- node1.setId("1");
- node1.setName("1");
- node1.setCode(1);
- node1.setType("SHELL");
- taskNodeList.add(node1);
-
- TaskNode node2 = new TaskNode();
- node2.setId("2");
- node2.setName("2");
- node2.setCode(2);
- node2.setType("SHELL");
- List<String> dep2 = new ArrayList<>();
- dep2.add("1");
- node2.setPreTasks(JSONUtils.toJsonString(dep2));
- taskNodeList.add(node2);
-
- TaskNode node4 = new TaskNode();
- node4.setId("4");
- node4.setName("4");
- node4.setCode(4);
- node4.setType("SHELL");
- taskNodeList.add(node4);
-
- TaskNode node3 = new TaskNode();
- node3.setId("3");
- node3.setName("3");
- node3.setCode(3);
- node3.setType("SHELL");
- List<String> dep3 = new ArrayList<>();
- dep3.add("2");
- dep3.add("4");
- node3.setPreTasks(JSONUtils.toJsonString(dep3));
- taskNodeList.add(node3);
-
- TaskNode node5 = new TaskNode();
- node5.setId("5");
- node5.setName("5");
- node5.setCode(5);
- node5.setType("SHELL");
- List<String> dep5 = new ArrayList<>();
- dep5.add("3");
- dep5.add("8");
- node5.setPreTasks(JSONUtils.toJsonString(dep5));
- taskNodeList.add(node5);
-
- TaskNode node6 = new TaskNode();
- node6.setId("6");
- node6.setName("6");
- node6.setCode(6);
- node6.setType("SHELL");
- List<String> dep6 = new ArrayList<>();
- dep6.add("3");
- node6.setPreTasks(JSONUtils.toJsonString(dep6));
- taskNodeList.add(node6);
-
- TaskNode node7 = new TaskNode();
- node7.setId("7");
- node7.setName("7");
- node7.setCode(7);
- node7.setType("SHELL");
- List<String> dep7 = new ArrayList<>();
- dep7.add("5");
- node7.setPreTasks(JSONUtils.toJsonString(dep7));
- taskNodeList.add(node7);
-
- TaskNode node8 = new TaskNode();
- node8.setId("8");
- node8.setName("8");
- node8.setCode(8);
- node8.setType("SHELL");
- List<String> dep8 = new ArrayList<>();
- dep8.add("2");
- node8.setPreTasks(JSONUtils.toJsonString(dep8));
- taskNodeList.add(node8);
-
- List<Long> startNodes = new ArrayList<>();
- List<Long> recoveryNodes = new ArrayList<>();
- List<TaskNode> destTaskNodeList =
DagHelper.generateFlowNodeListByStartNode(taskNodeList,
- startNodes, recoveryNodes, TaskDependType.TASK_POST);
- List<TaskNodeRelation> taskNodeRelations =
DagHelper.generateRelationListByFlowNodes(destTaskNodeList);
- WorkflowDag workflowDag = new WorkflowDag();
- workflowDag.setEdges(taskNodeRelations);
- workflowDag.setNodes(destTaskNodeList);
- return DagHelper.buildDagGraph(workflowDag);
- }
-
- @Test
- public void testBuildDagGraph() {
- String shellJson =
-
"{\"globalParams\":[],\"tasks\":[{\"type\":\"SHELL\",\"id\":\"tasks-9527\",\"name\":\"shell-1\","
- +
-
"\"params\":{\"resourceList\":[],\"localParams\":[],\"rawScript\":\"#!/bin/bash\\necho
\\\"shell-1\\\"\"},"
- +
-
"\"description\":\"\",\"runFlag\":\"NORMAL\",\"dependence\":{},\"maxRetryTimes\":\"0\",\"retryInterval\":\"1\","
- +
-
"\"timeout\":{\"strategy\":\"\",\"interval\":1,\"enable\":false},\"taskInstancePriority\":\"MEDIUM\","
- +
-
"\"workerGroupId\":-1,\"preTasks\":[]}],\"tenantId\":1,\"timeout\":0}";
-
- ProcessData processData = JSONUtils.parseObject(shellJson,
ProcessData.class);
- assert processData != null;
- List<TaskNode> taskNodeList = processData.getTasks();
- WorkflowDag workflowDag = DagHelper.getWorkflowDag(taskNodeList);
- DAG<Long, TaskNode, TaskNodeRelation> dag =
DagHelper.buildDagGraph(workflowDag);
- Assertions.assertNotNull(dag);
- }
-
- @Data
- @NoArgsConstructor
- private static class ProcessData {
-
- @EqualsAndHashCode.Include
- private List<TaskNode> tasks;
-
- @EqualsAndHashCode.Include
- private List<Property> globalParams;
-
- private int timeout;
-
- private int tenantId;
-
- public ProcessData(List<TaskNode> tasks, List<Property> globalParams) {
- this.tasks = tasks;
- this.globalParams = globalParams;
- }
- }
-
-}