package tech.powerjob.server.core.workflow.algorithm; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.*; import tech.powerjob.common.model.PEWorkflowDAG; import java.util.List; import java.util.Map; /** * DAG 工作流对象 * 节点中均记录了上游以及下游的连接关系(无法使用 JSON 来序列化以及反序列化) * * @author tjq * @author Echo009 * @since 2020/5/26 */ @Data @ToString(exclude = {"nodeMap"}) @NoArgsConstructor @AllArgsConstructor public class WorkflowDAG { /** * DAG允许存在多个顶点 */ private List roots; private Map nodeMap; public Node getNode(Long nodeId) { if (nodeMap == null) { return null; } return nodeMap.get(nodeId); } @Getter @Setter @EqualsAndHashCode(exclude = {"dependencies", "dependenceEdgeMap", "successorEdgeMap", "holder","successors"}) @ToString(exclude = {"dependencies", "dependenceEdgeMap", "successorEdgeMap", "holder"}) @NoArgsConstructor public static final class Node { public Node(PEWorkflowDAG.Node node) { this.nodeId = node.getNodeId(); this.holder = node; this.dependencies = Lists.newLinkedList(); this.dependenceEdgeMap = Maps.newHashMap(); this.successors = Lists.newLinkedList(); this.successorEdgeMap = Maps.newHashMap(); } /** * node id * * @since 20210128 */ private Long nodeId; private PEWorkflowDAG.Node holder; /** * 依赖的上游节点 */ private List dependencies; /** * 连接依赖节点的边 */ private Map dependenceEdgeMap; /** * 后继者,子节点 */ private List successors; /** * 连接后继节点的边 */ private Map successorEdgeMap; } }