/* * UnrelateWorkFlowFileHelper.h * * Created on: Mar 5, 2015 * Author: dev */ #ifndef PAI_FRAME_WORKFLOWENGINE_UNRELATEWORKFLOWFILEHELPER_H #define PAI_FRAME_WORKFLOWENGINE_UNRELATEWORKFLOWFILEHELPER_H #include #include #include "WorkFlowFile.h" class CUnrelateWorkFlowFileHelperTest; namespace pai{ namespace workflow{ struct UnrelateRoot2LeafPair { std::set roots; std::set leafs; bool HasRoots(const int root) { if(roots.count(root) > 0) { return true; }else { return false; } } void InsertPair(int root, std::set& leaf) { roots.insert(root); for(std::set::iterator iter = leaf.begin(); iter != leaf.end(); iter++) { leafs.insert(*iter); } } }; class CUnrelateWorkFlowFileHelper { private: std::vector* unrelatedWorkflowFileList; friend class ::CUnrelateWorkFlowFileHelperTest; //for test private: /** * @brief 获取workflowfile中的所有输出 * @param[in] workflowFile * @param[in/out] leafList 存储输出模块的moduleid */ void GetLeafList(CWorkFlowFile* workflowFile, std::set& leafList); /** * @brief 获取workflowfile中的所有输入 * @param[in] workflowFile * @param[in/out] rootList 存储输入模块的moduleid */ void GetRootList(CWorkFlowFile* workflowFile, std::set& rootList); /** * @brief 获取从输入可以到达的输出的映射 * @param[in] connections * @param[in] rootList 所有的根节点 * @param[in] leafList 所有的叶子节点 * @param[in/out] root2LeafList 存储输入模块的moduleid 与输出模块id的映射 */ void GetRoot2LeafList(std::vector* connections, std::set& rootList, std::set& leafList, std::map >& root2LeafList); /** * @brief 递归获取从输入可以到达的输出的映射 * @param[in] connections * @param[in] leafList 所有的叶子节点 * @param[in] moduleID 模块id * @param[in/out] findLeafs */ void InternalGetRoot2LeafList(std::vector* connections, std::set& leafList, int moduleID, std::set& findLeafs); /** * @brief 获取不相关的的输入和输出对 * @param[in] root2LeafList 储输入模块的moduleid 与输出模块id的映射 * @param[in/out] root2LeafPairList 存储不相关的的输入和输出对 */ void GetUnrelateRoot2LeafPair(std::map >& root2LeafList, std::vector& root2LeafPairList); /** * @brief 通过rootlist中跟节点,获取所有下游节点 * @param[in] rootList 存储跟节点 * @param[in] connections * @param[in/out] unrelateWorkflowModuleIDs 存储moduleid */ void GetUnrelateModuleIdByRootId(std::set& rootList, std::vector* connections, std::set& unrelateWorkflowModuleIDs); /** * @brief 递归获取所有下游节点 * @param[in] sourceId * @param[in] connections * @param[in/out] unrelateWorkflowModuleIDs 存储moduleid */ void InneralGetUnrelateModuleIdByRootId(const int sourceId, std::vector* connections, std::set& unrelateWorkflowModuleIDs); /** * @brief 在sourceWorkflowFile的基础上创建新的workflowfile对象 * @param[in] sourceWorkflowFile * @param[in] unrelateWorkflowModuleIDs 新workflowfile中包含的moduleid * @return 新的workflowfile对象 */ CWorkFlowFile* GetNewWorkFlowFile(CWorkFlowFile* sourceWorkflowFile, std::set& unrelateWorkflowModuleIDs); public: CUnrelateWorkFlowFileHelper(CWorkFlowFile* workflowFile); ~CUnrelateWorkFlowFileHelper(); /** * @brief 对workflowFile拆分后,在workflowFile有可能出现多个互补相干的工作流 * @param[in] workflowFile * @param[in/out] unrelatedWorkflowFileList 保存结果 */ std::vector* GetUnrelatedWorkFlowFile(); void GetTopLevelWkf(std::vector& result, std::map& outputID2inputID); }; } } #endif /* WORKFLOWFILEWRAPPER_H_ */