All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrapht.graph.DagTemplate Maven / Gradle / Ivy

package org.jgrapht.graph;

import java.util.Map;
import java.util.Objects;
import java.util.ServiceLoader;
import java.util.Set;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jgrapht.graph.beans.DagVertex;
import org.jgrapht.graph.beans.DagWeave;
import org.jgrapht.graph.dagger.VertexDataset;
import org.jgrapht.graph.dagger.VertexStateful;
import org.jgrapht.graph.dagger.VertexStateless;
import org.jgrapht.graph.pipeline.DataPipeline;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;

import lombok.Data;

/**
 * DAG算子执行器
 */
@Data
public class DagTemplate {

    public static VertexDataset dataset(DagWeave dagWeave, Map context) {
        Preconditions.checkArgument(Objects.nonNull(dagWeave.getStartVertex()), "DAG入口结点为空");
        Preconditions.checkArgument(Objects.nonNull(dagWeave.getDirectedAcyclicGraph()), "DAG编排结构错误");
        return dataset(dagWeave, dagWeave.getStartVertex(), context);
    }

    // 执行结点
    private static VertexDataset dataset(DagVertex dagVertex, Map context) {
        ServiceLoader serviceLoader = ServiceLoader.load(DataPipeline.class);
        for(DataPipeline dataPipeline: serviceLoader){
            if(dataPipeline.getClass().getSimpleName().equalsIgnoreCase(dagVertex.getTypeName())){
                System.out.println("[DAG] 执行:" + dagVertex.getVertexId());
                return dataPipeline.pipeline(dagVertex.getVertexId(), context);
            }
        }
        throw new IllegalStateException("未找DAG数据算子");
    }

    // 执行结点
    private static VertexDataset dataset(DagWeave dagWeave, DagVertex dagVertex, Map context) {
        VertexDataset vertexDataset = dataset(dagVertex, context);
        DagStatus dagStatus = vertexDataset.getStatus();
        // 状态结束直接返回(执行到部分路径结束|执行到最终结点结束)
        if (DagStatus.FINISH == dagStatus) {
            return vertexDataset;
        }
        // 流程完结结点返回(严格判断结束结点,避免End结点处理遗漏)
        if (dagWeave.getStopVertex() == dagVertex) {
            vertexDataset.setStatus(DagStatus.FINISH);
            return vertexDataset;
        }
        // 无状态结点,直接执行出度边
        if (vertexDataset instanceof VertexStateless) {
            Set outgoingEdges = dagWeave.getDirectedAcyclicGraph().outgoingEdgesOf(dagVertex);
            Preconditions.checkArgument(CollectionUtils.size(outgoingEdges) == 1, "(DAG)无状态结点出度不为1");
            DagVertex outgoing = (DagVertex) Lists.newArrayList(outgoingEdges).get(0).getTarget();
            return dataset(dagWeave, outgoing, context);
        }
        // 有状态结点,选择状态路径
        if (vertexDataset instanceof VertexStateful) {
            VertexStateful vertexStateful = (VertexStateful) vertexDataset;
            Set outgoingEdges = dagWeave.getDirectedAcyclicGraph().outgoingEdgesOf(dagVertex);
            DagVertex outgoing = outgoingEdges.stream()
                    .map(e -> (DagVertex) e.getTarget())
                    .filter(e -> StringUtils.isBlank(vertexStateful.getTargetVertexId()) || vertexStateful.getTargetVertexId().equals(e.getVertexId()))
                    .findFirst()
                    .orElse(null);
            Preconditions.checkArgument(Objects.nonNull(outgoing), "(DAG)有状态结点出度边未找到");
            return dataset(dagWeave, outgoing, context);
        }
        throw new IllegalStateException("无效执行结点状态");
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy