greenplumn CPhysicalHashJoin 源码
greenplumn CPhysicalHashJoin 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/operators/CPhysicalHashJoin.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2012 EMC Corp.
//
// @filename:
// CPhysicalHashJoin.h
//
// @doc:
// Base hash join operator
//---------------------------------------------------------------------------
#ifndef GPOPT_CPhysicalHashJoin_H
#define GPOPT_CPhysicalHashJoin_H
#include "gpos/base.h"
#include "gpopt/base/CUtils.h"
#include "gpopt/operators/CPhysicalJoin.h"
namespace gpopt
{
// fwd declarations
class CDistributionSpecHashed;
//---------------------------------------------------------------------------
// @class:
// CPhysicalHashJoin
//
// @doc:
// Base hash join operator
//
//---------------------------------------------------------------------------
class CPhysicalHashJoin : public CPhysicalJoin
{
private:
// the array of expressions from the outer relation
// that are extracted from the hashing condition
CExpressionArray *m_pdrgpexprOuterKeys;
// the array of expressions from the inner relation
// that are extracted from the hashing condition
CExpressionArray *m_pdrgpexprInnerKeys;
// Hash op families of the operators used in the join conditions
IMdIdArray *m_hash_opfamilies;
// array redistribute request sent to the first hash join child
CDistributionSpecArray *m_pdrgpdsRedistributeRequests;
// compute a distribution matching the distribution delivered by given child
CDistributionSpec *PdsMatch(CMemoryPool *mp, CDistributionSpec *pds,
ULONG ulSourceChildIndex) const;
protected:
// compute required hashed distribution from the n-th child
CDistributionSpecHashed *PdshashedRequired(CMemoryPool *mp,
ULONG child_index,
ULONG ulReqIndex) const;
// create (redistribute, redistribute) optimization request
CDistributionSpec *PdsRequiredRedistribute(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CDistributionSpec *pdsInput,
ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt,
ULONG ulOptReq) const;
// create the set of redistribute requests to send to first hash join child
void CreateHashRedistributeRequests(CMemoryPool *mp);
private:
// create (non-singleton, replicate) optimization request
CDistributionSpec *PdsRequiredReplicate(
CMemoryPool *mp, CExpressionHandle &exprhdl,
CDistributionSpec *pdsInput, ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt, ULONG ulOptReq, CReqdPropPlan *prppInput);
// create a child hashed distribution request based on input hashed distribution,
// return NULL if no such request can be created
static CDistributionSpecHashed *PdshashedPassThru(
CMemoryPool *mp, CExpressionHandle &exprhdl,
CDistributionSpecHashed *pdshashedInput, ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt, ULONG ulOptReq);
// check whether a hash key is nullable
BOOL FNullableHashKey(ULONG ulKey, CColRefSet *pcrsNotNullInner,
BOOL fInner) const;
protected:
// helper for computing a hashed distribution matching the given distribution
CDistributionSpecHashed *PdshashedMatching(
CMemoryPool *mp, CDistributionSpecHashed *pdshashed,
ULONG ulSourceChild) const;
// create (singleton, singleton) optimization request
CDistributionSpec *PdsRequiredSingleton(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CDistributionSpec *pdsInput,
ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt) const;
// check whether the hash keys from one child are nullable
BOOL FNullableHashKeys(CColRefSet *pcrsNotNullInner, BOOL fInner) const;
ULONG
NumDistrReq() const
{
return m_pdrgpdsRedistributeRequests->Size();
}
// create optimization requests
virtual void CreateOptRequests(CMemoryPool *mp);
public:
CPhysicalHashJoin(const CPhysicalHashJoin &) = delete;
// ctor
CPhysicalHashJoin(CMemoryPool *mp, CExpressionArray *pdrgpexprOuterKeys,
CExpressionArray *pdrgpexprInnerKeys,
IMdIdArray *hash_opfamilies,
CXform::EXformId origin_xform = CXform::ExfSentinel);
// dtor
~CPhysicalHashJoin() override;
// inner keys
const CExpressionArray *
PdrgpexprInnerKeys() const
{
return m_pdrgpexprInnerKeys;
}
// outer keys
const CExpressionArray *
PdrgpexprOuterKeys() const
{
return m_pdrgpexprOuterKeys;
}
//-------------------------------------------------------------------------------------
// Required Plan Properties
//-------------------------------------------------------------------------------------
// compute required sort order of the n-th child
COrderSpec *PosRequired(CMemoryPool *mp, CExpressionHandle &exprhdl,
COrderSpec *posInput, ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt,
ULONG ulOptReq) const override;
// compute required rewindability of the n-th child
CRewindabilitySpec *PrsRequired(CMemoryPool *mp, CExpressionHandle &exprhdl,
CRewindabilitySpec *prsRequired,
ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt,
ULONG ulOptReq) const override;
// compute required distribution of the n-th child
CDistributionSpec *PdsRequired(CMemoryPool *mp, CExpressionHandle &exprhdl,
CDistributionSpec *pdsRequired,
ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt,
ULONG ulOptReq) const override;
CEnfdDistribution *Ped(CMemoryPool *mp, CExpressionHandle &exprhdl,
CReqdPropPlan *prppInput, ULONG child_index,
CDrvdPropArray *pdrgpdpCtxt,
ULONG ulDistrReq) override;
//-------------------------------------------------------------------------------------
// Derived Plan Properties
//-------------------------------------------------------------------------------------
// derive sort order
COrderSpec *
PosDerive(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const override
{
// hash join is not order-preserving
return GPOS_NEW(mp) COrderSpec(mp);
}
//-------------------------------------------------------------------------------------
// Enforced Properties
//-------------------------------------------------------------------------------------
// return order property enforcing type for this operator
CEnfdProp::EPropEnforcingType EpetOrder(
CExpressionHandle &exprhdl, const CEnfdOrder *peo) const override;
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
// execution order of children
EChildExecOrder
Eceo() const override
{
// TODO - ; 01/06/2014
// obtain this property by through MD abstraction layer, similar to scalar properties
// hash join in GPDB executes its inner (right) child first,
// the optimization order of hash join children follows the execution order
return EceoRightToLeft;
}
// conversion function
static CPhysicalHashJoin *
PopConvert(COperator *pop)
{
GPOS_ASSERT(CUtils::FHashJoin(pop));
return dynamic_cast<CPhysicalHashJoin *>(pop);
}
}; // class CPhysicalHashJoin
} // namespace gpopt
#endif // !GPOPT_CPhysicalHashJoin_H
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦