/* * MultiJobDecompose.h * * Created on: Mar 14, 2015 * Author: dev */ #ifndef PAI_FRAME_WORKFLOWENGINE_MULTIJOBDECOMPOSE_H #define PAI_FRAME_WORKFLOWENGINE_MULTIJOBDECOMPOSE_H #include "WorkFlowFileWrapper.h" #include "WorkFlowFile.h" #include "WorkFlowDecompose.h" #include #include class CMultiJobDecomposeDecomposeTest; namespace pai{ namespace workflow{ class CMultiJobDecompose:public CWorkFlowDecompose { public: CMultiJobDecompose(const int &startModuleId); virtual ~CMultiJobDecompose(); /** * @brief 拆分工作流的入口函数,其他类需要实现此函数进行分类处理 * @param[in] workflowFileWrapper */ virtual void DecomposeWorkFlowFile(CWorkFlowFileWrapper* workflowFileWrapper); private: /** * @brief 处理特殊模块 *@param[in] workflowFileWrapper 原始的CWorkFlowFile的封装对象 */ void InternalDecomposeWorkFlowFile(CWorkFlowFile* workflowFile); /** * @brief sourceWorkflowFile中包含静矫正应用类型的模块, * 从sourceWorkflowFile中moduleID及其上游的模块复制出一个新的工作流,并返回。 *@param[in] sourceWorkflowFile *@param[in] moduleID 特殊模块的id *@return 返回新建的workflowfile对象 */ CStatApplyWorkFlowFile* ProcessStaticApplyJobType(CWorkFlowFile* workflowFile, const int moduleID); /** * @brief sourceWorkflowFile中包含偏移多hadoop作业类型的模块, * 从sourceWorkflowFile中moduleID及其上游的模块拆分出一个新的工作流, * 并返回,sourceWorkflowFile中剩下moduleID及其其他模块。 *@param[in] sourceWorkflowFile *@param[in] moduleID 特殊模块的id *@param[in] isMultiJob 是否是多作业类型 *@return 返回新建的workflowfile对象 */ COffsetWorkFlowFile* ProcessOffsetJobType(CWorkFlowFile* workflowFile, const int moduleID, bool isMultiJob); /** * @brief 从workflowFile中获取所有特殊模块 *@param[in] workflowFile *@return */ std::vector GetSpecialModuleIDs(CWorkFlowFile* workflowFile); /** * @brief 获取特殊模块的处理方法 *@param[in] workflowFile *@param[in] moduleID 特殊模块的id *@return 1 处理统计-应用类型模块的工作流 2 处理偏移多hadoop作业类型模块的工作流 3 处理偏移单hadoop作业类型模块的工作流 */ virtual int GetSpecialModuleProcessType(CWorkFlowFile* workflowFile, const int moduleID); /** * @brief 获取工作流中的模块id作为key,模块信息作为value的映射; * @param[in] workflow 工作流对象 * @param[out] moduleMap 模块信息映射 * pair */ void GetModulesMap(const CWorkFlowFile *workflow, map &moduleMap); /** * @brief 获取工作流中以模块id作为key,该模块作为dest模块的连接作为value的向上的连接信息映射; * 获取工作流中以模块id作为key,该模块作为source模块的连接作为value的向下的连接信息映射; * @param[in] workflow 工作流对象 * @param[out] parentMap 工作流中各个模块向上的连接信息映射 * @param[out] childMap 工作流中各个模块向下的连接信息映射 */ void GetParentAndChildConnMap(const CWorkFlowFile *workflow, map > &parentMap, map > &childMap); /** * @brief 将一个工作流中的模块和连接填充到另一个工作流中 * @param[in] src 源工作流 * @param[out] dest 目标工作流 */ void FillOriModulesAndConns(CWorkFlowFile *src, CWorkFlowFile *dest); /** * @brief 向工作流中填充以指定模块为基础的上游所有模块和连接 * @param[in] id 模块id * @param[in] connMap 工作流中各个模块向上的连接信息映射 * @param[in] moduleMap 工作流模块信息映射 * @param[out] workflow 需要填充的工作流 */ void FillParentModulesAndConns(const int &id, map > &connMap, map &moduleMap, CWorkFlowFile *workflow); /** * @brief 向工作流中填充以指定模块为基础的上游所有模块和连接 * @param[in] id 模块id * @param[in] connMap 工作流中各个模块向下的连接信息映射 * @param[in] moduleMap 工作流模块信息映射 * @param[out] workflow 需要填充的工作流 */ void FillChildModulesAndConns(const int &id, map > &connMap, map &moduleMap, CWorkFlowFile *workflow); private: std::vector spcialModuleNameList; friend class ::CMultiJobDecomposeDecomposeTest; }; } } #endif /* MULTIJOBDECOMPOSE_H_ */