greenplumn CLogicalDynamicGetBase 源码
greenplumn CLogicalDynamicGetBase 代码
文件路径:/src/backend/gporca/libgpopt/src/operators/CLogicalDynamicGetBase.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2013 EMC Corp.
//
// @filename:
// CLogicalDynamicGetBase.cpp
//
// @doc:
// Implementation of dynamic table access base class
//---------------------------------------------------------------------------
#include "gpopt/operators/CLogicalDynamicGetBase.h"
#include "gpos/base.h"
#include "gpopt/base/CColRefSet.h"
#include "gpopt/base/CColRefSetIter.h"
#include "gpopt/base/CColRefTable.h"
#include "gpopt/base/CConstraintInterval.h"
#include "gpopt/base/COptCtxt.h"
#include "gpopt/base/CUtils.h"
#include "gpopt/metadata/CName.h"
#include "gpopt/metadata/CPartConstraint.h"
#include "gpopt/metadata/CTableDescriptor.h"
#include "gpopt/operators/CExpressionHandle.h"
#include "gpopt/operators/CLogicalDynamicGet.h"
#include "gpopt/operators/CPredicateUtils.h"
#include "naucrates/statistics/CFilterStatsProcessor.h"
#include "naucrates/statistics/CStatistics.h"
#include "naucrates/statistics/CStatsPredUtils.h"
using namespace gpopt;
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::CLogicalDynamicGetBase
//
// @doc:
// ctor - for pattern
//
//---------------------------------------------------------------------------
CLogicalDynamicGetBase::CLogicalDynamicGetBase(CMemoryPool *mp)
: CLogical(mp),
m_pnameAlias(nullptr),
m_ptabdesc(nullptr),
m_scan_id(0),
m_pdrgpcrOutput(nullptr),
m_pdrgpdrgpcrPart(nullptr),
m_pcrsDist(nullptr)
{
m_fPattern = true;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::CLogicalDynamicGetBase
//
// @doc:
// ctor
//
//---------------------------------------------------------------------------
CLogicalDynamicGetBase::CLogicalDynamicGetBase(
CMemoryPool *mp, const CName *pnameAlias, CTableDescriptor *ptabdesc,
ULONG scan_id, CColRefArray *pdrgpcrOutput, CColRef2dArray *pdrgpdrgpcrPart,
IMdIdArray *partition_mdids)
: CLogical(mp),
m_pnameAlias(pnameAlias),
m_ptabdesc(ptabdesc),
m_scan_id(scan_id),
m_pdrgpcrOutput(pdrgpcrOutput),
m_pdrgpdrgpcrPart(pdrgpdrgpcrPart),
m_pcrsDist(nullptr),
m_partition_mdids(partition_mdids)
{
GPOS_ASSERT(nullptr != ptabdesc);
GPOS_ASSERT(nullptr != pnameAlias);
GPOS_ASSERT(nullptr != pdrgpcrOutput);
GPOS_ASSERT(nullptr != pdrgpdrgpcrPart);
m_pcrsDist = CLogical::PcrsDist(mp, m_ptabdesc, m_pdrgpcrOutput);
m_root_col_mapping_per_part =
ConstructRootColMappingPerPart(mp, m_pdrgpcrOutput, m_partition_mdids);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::CLogicalDynamicGetBase
//
// @doc:
// ctor
//
//---------------------------------------------------------------------------
CLogicalDynamicGetBase::CLogicalDynamicGetBase(CMemoryPool *mp,
const CName *pnameAlias,
CTableDescriptor *ptabdesc,
ULONG scan_id,
IMdIdArray *partition_mdids)
: CLogical(mp),
m_pnameAlias(pnameAlias),
m_ptabdesc(ptabdesc),
m_scan_id(scan_id),
m_pdrgpcrOutput(nullptr),
m_pcrsDist(nullptr),
m_partition_mdids(partition_mdids)
{
GPOS_ASSERT(nullptr != ptabdesc);
GPOS_ASSERT(nullptr != pnameAlias);
// generate a default column set for the table descriptor
m_pdrgpcrOutput = PdrgpcrCreateMapping(mp, m_ptabdesc->Pdrgpcoldesc(),
UlOpId(), m_ptabdesc->MDId());
m_pdrgpdrgpcrPart = PdrgpdrgpcrCreatePartCols(mp, m_pdrgpcrOutput,
m_ptabdesc->PdrgpulPart());
m_pcrsDist = CLogical::PcrsDist(mp, m_ptabdesc, m_pdrgpcrOutput);
m_root_col_mapping_per_part =
ConstructRootColMappingPerPart(mp, m_pdrgpcrOutput, m_partition_mdids);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::~CLogicalDynamicGetBase
//
// @doc:
// dtor
//
//---------------------------------------------------------------------------
CLogicalDynamicGetBase::~CLogicalDynamicGetBase()
{
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcrOutput);
CRefCount::SafeRelease(m_pdrgpdrgpcrPart);
CRefCount::SafeRelease(m_partition_mdids);
CRefCount::SafeRelease(m_root_col_mapping_per_part);
CRefCount::SafeRelease(m_pcrsDist);
GPOS_DELETE(m_pnameAlias);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::DeriveOutputColumns
//
// @doc:
// Derive output columns
//
//---------------------------------------------------------------------------
CColRefSet *
CLogicalDynamicGetBase::DeriveOutputColumns(CMemoryPool *mp,
CExpressionHandle & // exprhdl
)
{
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp);
pcrs->Include(m_pdrgpcrOutput);
return pcrs;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::PkcDeriveKeys
//
// @doc:
// Derive key collection
//
//---------------------------------------------------------------------------
CKeyCollection *
CLogicalDynamicGetBase::DeriveKeyCollection(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const
{
const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::DerivePropertyConstraint
//
// @doc:
// Derive constraint property
//
//---------------------------------------------------------------------------
CPropConstraint *
CLogicalDynamicGetBase::DerivePropertyConstraint(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const
{
return PpcDeriveConstraintFromTable(mp, m_ptabdesc, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalDynamicGetBase::PpartinfoDerive
//
// @doc:
// Derive partition consumer info
//
//---------------------------------------------------------------------------
CPartInfo *
CLogicalDynamicGetBase::DerivePartitionInfo(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const
{
IMDId *mdid = m_ptabdesc->MDId();
mdid->AddRef();
m_pdrgpdrgpcrPart->AddRef();
CPartInfo *ppartinfo = GPOS_NEW(mp) CPartInfo(mp);
ppartinfo->AddPartConsumer(mp, m_scan_id, mdid, m_pdrgpdrgpcrPart);
return ppartinfo;
}
// Construct a mapping from each column in root table to an index in each child
// partition's table descr by matching column names
ColRefToUlongMapArray *
CLogicalDynamicGetBase::ConstructRootColMappingPerPart(
CMemoryPool *mp, CColRefArray *root_cols, IMdIdArray *partition_mdids)
{
CMDAccessor *mda = COptCtxt::PoctxtFromTLS()->Pmda();
ColRefToUlongMapArray *part_maps = GPOS_NEW(mp) ColRefToUlongMapArray(mp);
for (ULONG ul = 0; ul < partition_mdids->Size(); ++ul)
{
IMDId *part_mdid = (*partition_mdids)[ul];
const IMDRelation *partrel = mda->RetrieveRel(part_mdid);
GPOS_ASSERT(nullptr != partrel);
ColRefToUlongMap *mapping = GPOS_NEW(mp) ColRefToUlongMap(mp);
for (ULONG i = 0; i < root_cols->Size(); ++i)
{
CColRef *root_colref = (*root_cols)[i];
BOOL found_mapping = false;
for (ULONG j = 0, idx = 0; j < partrel->ColumnCount(); ++j, ++idx)
{
const IMDColumn *coldesc = partrel->GetMdCol(j);
const CWStringConst *colname = coldesc->Mdname().GetMDName();
if (coldesc->IsDropped())
{
--idx;
continue;
}
if (colname->Equals(root_colref->Name().Pstr()))
{
// Found the corresponding column in the child partition
// Save the index in the mapping
mapping->Insert(root_colref, GPOS_NEW(mp) ULONG(idx));
found_mapping = true;
break;
}
}
if (!found_mapping)
{
GPOS_RAISE(
CException::ExmaInvalid, CException::ExmiInvalid,
GPOS_WSZ_LIT(
"Cannot generate root to child partition column mapping"));
}
}
part_maps->Append(mapping);
}
return part_maps;
}
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦