greenplumn CJobTransformation 源码

  • 2022-08-18
  • 浏览 (153)

greenplumn CJobTransformation 代码

文件路径:/src/backend/gporca/libgpopt/include/gpopt/search/CJobTransformation.h

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2011 EMC Corp.
//
//	@filename:
//		CJobTransformation.h
//
//	@doc:
//		Transform group expression job
//---------------------------------------------------------------------------
#ifndef GPOPT_CJobTransformation_H
#define GPOPT_CJobTransformation_H

#include "gpopt/search/CJob.h"
#include "gpopt/search/CJobStateMachine.h"


namespace gpopt
{
using namespace gpos;

// prototypes
class CGroup;
class CGroupExpression;
class CXform;

//---------------------------------------------------------------------------
//	@class:
//		CJobTransformation
//
//	@doc:
//		Runs the given transformation (XForm) rule.
//
//---------------------------------------------------------------------------
class CJobTransformation : public CJob
{
public:
	// transition events of a transformation
	enum EEvent
	{
		eevCompleted,

		eevSentinel
	};

	// states of a transformation
	enum EState
	{
		estInitialized = 0,
		estCompleted,

		estSentinel
	};

private:
	// shorthand for job state machine
	using JSM = CJobStateMachine<EState, estSentinel, EEvent, eevSentinel>;

	// target group expression
	CGroupExpression *m_pgexpr;

	// xform to apply to group expression
	CXform *m_xform;

	// job state machine
	JSM m_jsm;

	// apply transformation action
	static EEvent EevtTransform(CSchedulerContext *psc, CJob *pj);

public:
	CJobTransformation(const CJobTransformation &) = delete;

	// ctor
	CJobTransformation();

	// dtor
	~CJobTransformation() override;

	// initialize job
	void Init(CGroupExpression *pgexpr, CXform *pxform);

	// schedule a new transformation job
	static void ScheduleJob(CSchedulerContext *psc, CGroupExpression *pgexpr,
							CXform *pxform, CJob *pjParent);

	// job's main function
	BOOL FExecute(CSchedulerContext *psc) override;

#ifdef GPOS_DEBUG

	// print function
	IOstream &OsPrint(IOstream &os) const override;

	// dump state machine diagram in graphviz format
	virtual IOstream &
	OsDiagramToGraphviz(CMemoryPool *mp, IOstream &os,
						const WCHAR *wszTitle) const
	{
		(void) m_jsm.OsDiagramToGraphviz(mp, os, wszTitle);

		return os;
	}

	// compute unreachable states
	void
	Unreachable(CMemoryPool *mp, EState **ppestate, ULONG *pulSize) const
	{
		m_jsm.Unreachable(mp, ppestate, pulSize);
	}

#endif	// GPOS_DEBUG

	// conversion function
	static CJobTransformation *
	PjConvert(CJob *pj)
	{
		GPOS_ASSERT(nullptr != pj);
		GPOS_ASSERT(EjtTransformation == pj->Ejt());

		return dynamic_cast<CJobTransformation *>(pj);
	}

};	// class CJobTransformation

}  // namespace gpopt

#endif	// !GPOPT_CJobTransformation_H


// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CBinding 源码

greenplumn CGroup 源码

greenplumn CGroupExpression 源码

greenplumn CGroupProxy 源码

greenplumn CJob 源码

greenplumn CJobFactory 源码

greenplumn CJobGroup 源码

greenplumn CJobGroupExploration 源码

greenplumn CJobGroupExpression 源码

greenplumn CJobGroupExpressionExploration 源码

0  赞