greenplumn CMDAccessor 源码

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

greenplumn CMDAccessor 代码

文件路径:/src/backend/gporca/libgpopt/include/gpopt/mdcache/CMDAccessor.h

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2011 EMC Corp.
//
//	@filename:
//		CMDAccessor.h
//
//	@doc:
//		Metadata cache accessor.
//---------------------------------------------------------------------------



#ifndef GPOPT_CMDAccessor_H
#define GPOPT_CMDAccessor_H

#include "gpos/base.h"
#include "gpos/memory/CCache.h"
#include "gpos/memory/CCacheAccessor.h"

#include "gpopt/engine/CStatisticsConfig.h"
#include "gpopt/mdcache/CMDKey.h"
#include "naucrates/md/CSystemId.h"
#include "naucrates/md/IMDFunction.h"
#include "naucrates/md/IMDId.h"
#include "naucrates/md/IMDProvider.h"
#include "naucrates/md/IMDType.h"
#include "naucrates/statistics/IStatistics.h"

// fwd declarations
namespace gpdxl
{
class CDXLDatum;
}

namespace gpmd
{
class IMDCacheObject;
class IMDRelation;
class IMDRelationExternal;
class IMDScalarOp;
class IMDAggregate;
class IMDTrigger;
class IMDIndex;
class IMDCheckConstraint;
class IMDProvider;
class CMDProviderGeneric;
class IMDColStats;
class IMDRelStats;
class CDXLBucket;
class IMDCast;
class IMDScCmp;
}  // namespace gpmd

namespace gpnaucrates
{
class CHistogram;
class CBucket;
class IStatistics;
}  // namespace gpnaucrates

namespace gpopt
{
using namespace gpos;
using namespace gpmd;


using MdidPtr = IMDId *;

//---------------------------------------------------------------------------
//	@class:
//		CMDAccessor
//
//	@doc:
//		Gives the optimizer access to metadata information of a particular
//		object (e.g., a Table).
//
//		CMDAccessor maintains a cache of metadata objects (IMDCacheObject)
//		keyed on CMDKey (wrapper over IMDId). It also provides various accessor
//		methods (such as RetrieveAgg(), RetrieveRel() etc.) to request for corresponding
//		metadata objects (such as aggregates and relations respectively). These
//		methods in turn call the private method GetImdObj().
//
//		GetImdObj() first looks up the object in the MDCache. If no information
//		is available in the cache, it goes to a CMDProvider (e.g., GPDB
//		relcache or Minidump) to retrieve the required information.
//
//---------------------------------------------------------------------------
class CMDAccessor
{
public:
	// ccache template for mdcache
	using MDCache = CCache<IMDCacheObject *, CMDKey *>;

private:
	// element in the hashtable of cache accessors maintained by the MD accessor
	struct SMDAccessorElem;
	struct SMDProviderElem;


	// cache accessor for objects in a MD cache
	using CacheAccessorMD = CCacheAccessor<IMDCacheObject *, CMDKey *>;

	// hashtable for cache accessors indexed by the md id of the accessed object
	using MDHT = CSyncHashtable<SMDAccessorElem, MdidPtr>;

	using MDHTAccessor = CSyncHashtableAccessByKey<SMDAccessorElem, MdidPtr>;

	// iterator for the cache accessors hashtable
	using MDHTIter = CSyncHashtableIter<SMDAccessorElem, MdidPtr>;
	using MDHTIterAccessor =
		CSyncHashtableAccessByIter<SMDAccessorElem, MdidPtr>;

	// hashtable for MD providers indexed by the source system id
	using MDPHT = CSyncHashtable<SMDProviderElem, SMDProviderElem>;

	using MDPHTAccessor =
		CSyncHashtableAccessByKey<SMDProviderElem, SMDProviderElem>;

	// iterator for the providers hashtable
	using MDPHTIter = CSyncHashtableIter<SMDProviderElem, SMDProviderElem>;
	using MDPHTIterAccessor =
		CSyncHashtableAccessByIter<SMDProviderElem, SMDProviderElem>;

	// element in the cache accessor hashtable maintained by the MD Accessor
	struct SMDAccessorElem
	{
	private:
		// hashed object
		IMDCacheObject *m_imd_obj;

	public:
		// hash key
		IMDId *m_mdid;

		// generic link
		SLink m_link;

		// invalid key
		static const MdidPtr m_pmdidInvalid;

		// ctor
		SMDAccessorElem(IMDCacheObject *pimdobj, IMDId *mdid);

		// dtor
		~SMDAccessorElem();

		// hashed object
		IMDCacheObject *
		GetImdObj()
		{
			return m_imd_obj;
		}

		// return the key for this hashtable element
		IMDId *MDId() const;

		// equality function for hash tables
		static BOOL Equals(const MdidPtr &left_mdid, const MdidPtr &right_mdid);

		// hash function for cost contexts hash table
		static ULONG HashValue(const MdidPtr &mdid);
	};

	// element in the MD provider hashtable
	struct SMDProviderElem
	{
	private:
		// source system id
		CSystemId m_sysid;

		// value of the hashed element
		IMDProvider *m_pmdp;

	public:
		// generic link
		SLink m_link;

		// invalid key
		static const SMDProviderElem m_mdpelemInvalid;

		// ctor
		SMDProviderElem(CSystemId sysid, IMDProvider *pmdp);

		// dtor
		~SMDProviderElem();

		// return the MD provider
		IMDProvider *Pmdp();

		// return the system id
		CSystemId Sysid() const;

		// equality function for hash tables
		static BOOL Equals(const SMDProviderElem &mdpelemLeft,
						   const SMDProviderElem &mdpelemRight);

		// hash function for MD providers hash table
		static ULONG HashValue(const SMDProviderElem &mdpelem);
	};

private:
	// memory pool
	CMemoryPool *m_mp;

	// metadata cache
	MDCache *m_pcache;

	// generic metadata provider
	CMDProviderGeneric *m_pmdpGeneric;

	// hashtable of cache accessors
	MDHT m_shtCacheAccessors;

	// hashtable of MD providers
	MDPHT m_shtProviders;

	// total time consumed in looking up MD objects (including time used to fetch objects from MD provider)
	CDouble m_dLookupTime;

	// total time consumed in fetching MD objects from MD provider,
	// this time is currently dominated by serialization time
	CDouble m_dFetchTime;

	// interface to a MD cache object
	const IMDCacheObject *GetImdObj(IMDId *mdid);

	// return the type corresponding to the given type info and source system id
	const IMDType *RetrieveType(CSystemId sysid, IMDType::ETypeInfo type_info);

	// return the generic type corresponding to the given type info
	const IMDType *RetrieveType(IMDType::ETypeInfo type_info);

	// destroy accessor element when MDAccessor is destroyed
	static void DestroyAccessorElement(SMDAccessorElem *pmdaccelem);

	// destroy accessor element when MDAccessor is destroyed
	static void DestroyProviderElement(SMDProviderElem *pmdpelem);

	// lookup an MD provider by system id
	IMDProvider *Pmdp(CSystemId sysid);

	// initialize hash tables
	void InitHashtables(CMemoryPool *mp);

	// return the column statistics meta data object for a given column of a table
	const IMDColStats *Pmdcolstats(CMemoryPool *mp, IMDId *rel_mdid,
								   ULONG ulPos);

	// record histogram and width information for a given column of a table
	void RecordColumnStats(CMemoryPool *mp, IMDId *rel_mdid, ULONG colid,
						   ULONG ulPos, BOOL isSystemCol, BOOL isEmptyTable,
						   UlongToHistogramMap *col_histogram_mapping,
						   UlongToDoubleMap *colid_width_mapping,
						   CStatisticsConfig *stats_config);

	// construct a stats histogram from an MD column stats object
	CHistogram *GetHistogram(CMemoryPool *mp, IMDId *mdid_type,
							 const IMDColStats *pmdcolstats);

	// construct a typed bucket from a DXL bucket
	CBucket *Pbucket(CMemoryPool *mp, IMDId *mdid_type,
					 const CDXLBucket *dxl_bucket);

	// construct a typed datum from a DXL bucket
	IDatum *GetDatum(CMemoryPool *mp, IMDId *mdid_type,
					 const CDXLDatum *dxl_datum);

public:
	CMDAccessor(const CMDAccessor &) = delete;

	// ctors
	CMDAccessor(CMemoryPool *mp, MDCache *pcache);
	CMDAccessor(CMemoryPool *mp, MDCache *pcache, CSystemId sysid,
				IMDProvider *pmdp);
	CMDAccessor(CMemoryPool *mp, MDCache *pcache,
				const CSystemIdArray *pdrgpsysid,
				const CMDProviderArray *pdrgpmdp);

	//dtor
	~CMDAccessor();

	// return MD cache
	MDCache *
	Pcache() const
	{
		return m_pcache;
	}

	// register a new MD provider
	void RegisterProvider(CSystemId sysid, IMDProvider *pmdp);

	// register given MD providers
	void RegisterProviders(const CSystemIdArray *pdrgpsysid,
						   const CMDProviderArray *pdrgpmdp);

	// interface to a relation object from the MD cache
	const IMDRelation *RetrieveRel(IMDId *mdid);

	// interface to type's from the MD cache given the type's mdid
	const IMDType *RetrieveType(IMDId *mdid);

	// obtain the specified base type given by the template parameter
	template <class T>
	const T *
	PtMDType()
	{
		IMDType::ETypeInfo type_info = T::GetTypeInfo();
		GPOS_ASSERT(IMDType::EtiGeneric != type_info);
		return dynamic_cast<const T *>(RetrieveType(type_info));
	}

	// obtain the specified base type given by the template parameter
	template <class T>
	const T *
	PtMDType(CSystemId sysid)
	{
		IMDType::ETypeInfo type_info = T::GetTypeInfo();
		GPOS_ASSERT(IMDType::EtiGeneric != type_info);
		return dynamic_cast<const T *>(RetrieveType(sysid, type_info));
	}

	// interface to a scalar operator from the MD cache
	const IMDScalarOp *RetrieveScOp(IMDId *mdid);

	// interface to a function from the MD cache
	const IMDFunction *RetrieveFunc(IMDId *mdid);

	// interface to check if the window function from the MD cache is an aggregate window function
	BOOL FAggWindowFunc(IMDId *mdid);

	// interface to an aggregate from the MD cache
	const IMDAggregate *RetrieveAgg(IMDId *mdid);

	// interface to a trigger from the MD cache
	const IMDTrigger *RetrieveTrigger(IMDId *mdid);

	// interface to an index from the MD cache
	const IMDIndex *RetrieveIndex(IMDId *mdid);

	// interface to a check constraint from the MD cache
	const IMDCheckConstraint *RetrieveCheckConstraints(IMDId *mdid);

	// retrieve a column stats object from the cache
	const IMDColStats *Pmdcolstats(IMDId *mdid);

	// retrieve a relation stats object from the cache
	const IMDRelStats *Pmdrelstats(IMDId *mdid);

	// retrieve a cast object from the cache
	const IMDCast *Pmdcast(IMDId *mdid_src, IMDId *mdid_dest);

	// retrieve a scalar comparison object from the cache
	const IMDScCmp *Pmdsccmp(IMDId *left_mdid, IMDId *right_mdid,
							 IMDType::ECmpType cmp_type);

	// construct a statistics object for the columns of the given relation
	IStatistics *Pstats(
		CMemoryPool *mp, IMDId *rel_mdid,
		CColRefSet
			*pcrsHist,	// set of column references for which stats are needed
		CColRefSet *
			pcrsWidth,	// set of column references for which the widths are needed
		CStatisticsConfig *stats_config = nullptr);

	// serialize object to passed stream
	void Serialize(COstream &oos);

	// serialize system ids to passed stream
	void SerializeSysid(COstream &oos);
};
}  // namespace gpopt



#endif	// !GPOPT_CMDAccessor_H

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CAutoMDAccessor 源码

greenplumn CMDAccessorUtils 源码

greenplumn CMDCache 源码

greenplumn CMDKey 源码

0  赞