greenplumn CMemo 源码

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

greenplumn CMemo 代码


//	Greenplum Database
//	Copyright (C) 2009 - 2011 EMC Corp.
//	@filename:
//		CMemo.h
//	@doc:
//		Memo lookup table for dynamic programming
#ifndef GPOPT_CMemo_H
#define GPOPT_CMemo_H

#include "gpos/base.h"
#include "gpos/common/CRefCount.h"
#include "gpos/common/CSyncHashtable.h"
#include "gpos/common/CSyncList.h"
#include "gpos/common/DbgPrintMixin.h"

#include "gpopt/search/CGroupExpression.h"

namespace gpopt
class CGroup;
class CDrvdProp;
class CDrvdPropCtxtPlan;
class CMemoProxy;
class COptimizationContext;

// memo tree map definition
using MemoTreeMap = CTreeMap<CCostContext, CExpression, CDrvdPropCtxtPlan,
							 CCostContext::HashValue, CCostContext::Equals>;

using namespace gpos;

//	@class:
//		CMemo
//	@doc:
//		Dynamic programming table
class CMemo : public gpos::DbgPrintMixin<CMemo>
	// definition of hash table key accessor
	using ShtAcc =
		CSyncHashtableAccessByKey<CGroupExpression, CGroupExpression>;

	// definition of hash table iterator
	using ShtIter = CSyncHashtableIter<CGroupExpression, CGroupExpression>;

	// definition of hash table iterator accessor
	using ShtAccIter =
		CSyncHashtableAccessByIter<CGroupExpression, CGroupExpression>;

	// memory pool
	CMemoryPool *m_mp;

	// id counter for groups
	ULONG m_aul;

	// root group
	CGroup *m_pgroupRoot;

	// number of groups
	ULONG_PTR m_ulpGrps;

	// tree map of member group expressions
	MemoTreeMap *m_pmemotmap;

	// list of groups
	CSyncList<CGroup> m_listGroups;

	// hashtable of all group expressions
	CSyncHashtable<CGroupExpression,  // entry

	// add new group
	void Add(CGroup *pgroup, CExpression *pexprOrigin);

	// rehash all group expressions after group merge - not thread-safe
	BOOL FRehash();

	// helper for inserting group expression in target group
	CGroup *PgroupInsert(CGroup *pgroupTarget, CGroupExpression *pgexpr,
						 CExpression *pexprOrigin, BOOL fNewGroup);

	// helper to check if a new group needs to be created
	BOOL FNewGroup(CGroup **ppgroupTarget, CGroupExpression *pgexpr,
				   BOOL fScalar);

	CMemo(const CMemo &) = delete;

	// ctor
	explicit CMemo(CMemoryPool *mp);

	// dtor

	// return root group
	CGroup *
	PgroupRoot() const
		return m_pgroupRoot;

	// return number of groups
	UlpGroups() const
		return m_ulpGrps;

	// return total number of group expressions
	ULONG UlGrpExprs();

	// return number of duplicate groups
	ULONG UlDuplicateGroups();

	// mark groups as duplicates
	static void MarkDuplicates(CGroup *pgroupFst, CGroup *pgroupSnd);

	// return tree map
	MemoTreeMap *
	Pmemotmap() const
		return m_pmemotmap;

	// set root group
	void SetRoot(CGroup *pgroup);

	// insert group expression into hash table
	CGroup *PgroupInsert(CGroup *pgroupTarget, CExpression *pexprOrigin,
						 CGroupExpression *pgexpr);

	// extract a plan that delivers the given required properties
	CExpression *PexprExtractPlan(CMemoryPool *mp, CGroup *pgroupRoot,
								  CReqdPropPlan *prppInput,
								  ULONG ulSearchStages);

	// merge duplicate groups
	void GroupMerge();

	// reset states of all memo groups
	void ResetGroupStates();

	// reset statistics of memo groups
	void ResetStats();

	// print driver
	IOstream &OsPrint(IOstream &os) const;

	// derive stats when no stats not present for the group
	void DeriveStatsIfAbsent(CMemoryPool *mp);

	// build tree map
	void BuildTreeMap(COptimizationContext *poc);

	// reset tree map
	void ResetTreeMap();

	// print memo to output logger
	void Trace();

	// get group by id
	CGroup *Pgroup(ULONG id);

};	// class CMemo

}  // namespace gpopt

#endif	// !GPOPT_CMemo_H

// EOF


greenplumn 源码目录


greenplumn CBinding 源码

greenplumn CGroup 源码

greenplumn CGroupExpression 源码

greenplumn CGroupProxy 源码

greenplumn CJob 源码

greenplumn CJobFactory 源码

greenplumn CJobGroup 源码

greenplumn CJobGroupExploration 源码

greenplumn CJobGroupExpression 源码

greenplumn CJobGroupExpressionExploration 源码

0  赞