greenplumn CPartitionPropagationSpec 源码
greenplumn CPartitionPropagationSpec 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/base/CPartitionPropagationSpec.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2012 EMC Corp.
//
// @filename:
// CPartitionPropagationSpec.h
//
// @doc:
// Partition Propagation spec in required properties
//---------------------------------------------------------------------------
#ifndef GPOPT_CPartitionPropagationSpec_H
#define GPOPT_CPartitionPropagationSpec_H
#include "gpos/base.h"
#include "gpos/common/CRefCount.h"
#include "gpopt/base/COptCtxt.h"
#include "gpopt/base/CPropSpec.h"
namespace gpopt
{
using namespace gpos;
//---------------------------------------------------------------------------
// @class:
// CPartitionPropagationSpec
//
// @doc:
// Partition Propagation specification
//
//---------------------------------------------------------------------------
class CPartitionPropagationSpec : public CPropSpec
{
public:
enum EPartPropSpecInfoType
{
EpptPropagator,
EpptConsumer,
EpptSentinel
};
private:
struct SPartPropSpecInfo : public CRefCount
{
// scan id of the DynamicScan
ULONG m_scan_id;
// info type: consumer or propagator
EPartPropSpecInfoType m_type;
// relation id of the DynamicScan
IMDId *m_root_rel_mdid;
// partition selector ids to use (reqd only)
CBitSet *m_selector_ids = nullptr;
// filter expressions to generate partition pruning data in the translator (reqd only)
CExpression *m_filter_expr = nullptr;
SPartPropSpecInfo(ULONG scan_id, EPartPropSpecInfoType type,
IMDId *rool_rel_mdid)
: m_scan_id(scan_id), m_type(type), m_root_rel_mdid(rool_rel_mdid)
{
GPOS_ASSERT(m_root_rel_mdid != nullptr);
CMemoryPool *mp = COptCtxt::PoctxtFromTLS()->Pmp();
m_selector_ids = GPOS_NEW(mp) CBitSet(mp);
}
~SPartPropSpecInfo() override
{
m_root_rel_mdid->Release();
CRefCount::SafeRelease(m_selector_ids);
CRefCount::SafeRelease(m_filter_expr);
}
IOstream &OsPrint(IOstream &os) const;
// used for determining equality in memo (e.g in optimization contexts)
BOOL Equals(const SPartPropSpecInfo *) const;
BOOL FSatisfies(const SPartPropSpecInfo *) const;
// used for sorting SPartPropSpecInfo in an array
static INT CmpFunc(const void *val1, const void *val2);
};
using SPartPropSpecInfoArray =
CDynamicPtrArray<SPartPropSpecInfo, CleanupRelease>;
// partition required/derived info, sorted by scanid
SPartPropSpecInfoArray *m_part_prop_spec_infos = nullptr;
// Present scanids (for easy lookup)
CBitSet *m_scan_ids = nullptr;
public:
CPartitionPropagationSpec(const CPartitionPropagationSpec &) = delete;
// ctor
CPartitionPropagationSpec(CMemoryPool *mp);
// dtor
~CPartitionPropagationSpec() override;
// append enforcers to dynamic array for the given plan properties
void AppendEnforcers(CMemoryPool *mp, CExpressionHandle &exprhdl,
CReqdPropPlan *prpp, CExpressionArray *pdrgpexpr,
CExpression *pexpr) override;
// hash function
ULONG
HashValue() const override
{
// GPDB_12_MERGE_FIXME: Implement this, even if it's unused
GPOS_RTL_ASSERT(!"Unused");
}
// extract columns used by the partition propagation spec
CColRefSet *
PcrsUsed(CMemoryPool *mp) const override
{
// return an empty set
return GPOS_NEW(mp) CColRefSet(mp);
}
// property type
EPropSpecType
Epst() const override
{
return EpstPartPropagation;
}
BOOL
Contains(ULONG scan_id) const
{
return m_scan_ids->Get(scan_id);
}
BOOL ContainsAnyConsumers() const;
// equality check to determine compatibility of derived & required properties
BOOL Equals(const CPartitionPropagationSpec *ppps) const;
// satisfies function
BOOL FSatisfies(const CPartitionPropagationSpec *pps_reqd) const;
SPartPropSpecInfo *FindPartPropSpecInfo(ULONG scan_id) const;
void Insert(ULONG scan_id, EPartPropSpecInfoType type, IMDId *rool_rel_mdid,
CBitSet *selector_ids, CExpression *expr);
void Insert(SPartPropSpecInfo *other);
void InsertAll(CPartitionPropagationSpec *pps);
void InsertAllowedConsumers(CPartitionPropagationSpec *pps,
CBitSet *allowed_scan_ids);
void InsertAllExcept(CPartitionPropagationSpec *pps, ULONG scan_id);
const CBitSet *SelectorIds(ULONG scan_id) const;
// is partition propagation required
BOOL
FPartPropagationReqd() const
{
return true;
}
// print
IOstream &OsPrint(IOstream &os) const override;
void InsertAllResolve(CPartitionPropagationSpec *pSpec);
}; // class CPartitionPropagationSpec
} // namespace gpopt
#endif // !GPOPT_CPartitionPropagationSpec_H
// EOF
相关信息
相关文章
greenplumn CColConstraintsArrayMapper 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦