greenplumn CLogicalGet 源码
greenplumn CLogicalGet 代码
文件路径:/src/backend/gporca/libgpopt/src/operators/CLogicalGet.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2009 Greenplum, Inc.
//
// @filename:
// CLogicalGet.cpp
//
// @doc:
// Implementation of basic table access
//---------------------------------------------------------------------------
#include "gpopt/operators/CLogicalGet.h"
#include "gpos/base.h"
#include "gpos/common/CAutoP.h"
#include "gpos/common/CDynamicPtrArray.h"
#include "gpopt/base/CColRefSet.h"
#include "gpopt/base/CColRefSetIter.h"
#include "gpopt/base/CColRefTable.h"
#include "gpopt/base/CKeyCollection.h"
#include "gpopt/base/COptCtxt.h"
#include "gpopt/base/CUtils.h"
#include "gpopt/metadata/CName.h"
#include "gpopt/metadata/CTableDescriptor.h"
#include "gpopt/operators/CExpressionHandle.h"
#include "naucrates/statistics/CStatistics.h"
using namespace gpopt;
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::CLogicalGet
//
// @doc:
// ctor - for pattern
//
//---------------------------------------------------------------------------
CLogicalGet::CLogicalGet(CMemoryPool *mp)
: CLogical(mp),
m_pnameAlias(nullptr),
m_ptabdesc(nullptr),
m_pdrgpcrOutput(nullptr),
m_pdrgpdrgpcrPart(nullptr),
m_pcrsDist(nullptr)
{
m_fPattern = true;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::CLogicalGet
//
// @doc:
// ctor
//
//---------------------------------------------------------------------------
CLogicalGet::CLogicalGet(CMemoryPool *mp, const CName *pnameAlias,
CTableDescriptor *ptabdesc)
: CLogical(mp),
m_pnameAlias(pnameAlias),
m_ptabdesc(ptabdesc),
m_pdrgpcrOutput(nullptr),
m_pdrgpdrgpcrPart(nullptr),
m_pcrsDist(nullptr)
{
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());
if (m_ptabdesc->IsPartitioned())
{
m_pdrgpdrgpcrPart = PdrgpdrgpcrCreatePartCols(
mp, m_pdrgpcrOutput, m_ptabdesc->PdrgpulPart());
}
m_pcrsDist = CLogical::PcrsDist(mp, m_ptabdesc, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::CLogicalGet
//
// @doc:
// ctor
//
//---------------------------------------------------------------------------
CLogicalGet::CLogicalGet(CMemoryPool *mp, const CName *pnameAlias,
CTableDescriptor *ptabdesc,
CColRefArray *pdrgpcrOutput)
: CLogical(mp),
m_pnameAlias(pnameAlias),
m_ptabdesc(ptabdesc),
m_pdrgpcrOutput(pdrgpcrOutput),
m_pdrgpdrgpcrPart(nullptr)
{
GPOS_ASSERT(nullptr != ptabdesc);
GPOS_ASSERT(nullptr != pnameAlias);
if (m_ptabdesc->IsPartitioned())
{
m_pdrgpdrgpcrPart = PdrgpdrgpcrCreatePartCols(
mp, m_pdrgpcrOutput, m_ptabdesc->PdrgpulPart());
}
m_pcrsDist = CLogical::PcrsDist(mp, m_ptabdesc, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::~CLogicalGet
//
// @doc:
// dtor
//
//---------------------------------------------------------------------------
CLogicalGet::~CLogicalGet()
{
CRefCount::SafeRelease(m_ptabdesc);
CRefCount::SafeRelease(m_pdrgpcrOutput);
CRefCount::SafeRelease(m_pdrgpdrgpcrPart);
CRefCount::SafeRelease(m_pcrsDist);
GPOS_DELETE(m_pnameAlias);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::HashValue
//
// @doc:
// Operator specific hash function
//
//---------------------------------------------------------------------------
ULONG
CLogicalGet::HashValue() const
{
ULONG ulHash = gpos::CombineHashes(COperator::HashValue(),
m_ptabdesc->MDId()->HashValue());
ulHash =
gpos::CombineHashes(ulHash, CUtils::UlHashColArray(m_pdrgpcrOutput));
return ulHash;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::Matches
//
// @doc:
// Match function on operator level
//
//---------------------------------------------------------------------------
BOOL
CLogicalGet::Matches(COperator *pop) const
{
if (pop->Eopid() != Eopid())
{
return false;
}
CLogicalGet *popGet = CLogicalGet::PopConvert(pop);
return m_ptabdesc->MDId()->Equals(popGet->m_ptabdesc->MDId()) &&
m_pdrgpcrOutput->Equals(popGet->PdrgpcrOutput());
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::PopCopyWithRemappedColumns
//
// @doc:
// Return a copy of the operator with remapped columns
//
//---------------------------------------------------------------------------
COperator *
CLogicalGet::PopCopyWithRemappedColumns(CMemoryPool *mp,
UlongToColRefMap *colref_mapping,
BOOL must_exist)
{
CColRefArray *pdrgpcrOutput = nullptr;
if (must_exist)
{
pdrgpcrOutput =
CUtils::PdrgpcrRemapAndCreate(mp, m_pdrgpcrOutput, colref_mapping);
}
else
{
pdrgpcrOutput = CUtils::PdrgpcrRemap(mp, m_pdrgpcrOutput,
colref_mapping, must_exist);
}
CName *pnameAlias = GPOS_NEW(mp) CName(mp, *m_pnameAlias);
m_ptabdesc->AddRef();
return GPOS_NEW(mp) CLogicalGet(mp, pnameAlias, m_ptabdesc, pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::DeriveOutputColumns
//
// @doc:
// Derive output columns
//
//---------------------------------------------------------------------------
CColRefSet *
CLogicalGet::DeriveOutputColumns(CMemoryPool *mp,
CExpressionHandle & // exprhdl
)
{
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp);
for (ULONG i = 0; i < m_pdrgpcrOutput->Size(); i++)
{
// We want to limit the output columns to only those which are referenced in the query
// We will know the entire list of columns which are referenced in the query only after
// translating the entire DXL to an expression. Hence we should not limit the output columns
// before we have processed the entire DXL.
if ((*m_pdrgpcrOutput)[i]->GetUsage() == CColRef::EUsed ||
(*m_pdrgpcrOutput)[i]->GetUsage() == CColRef::EUnknown)
{
pcrs->Include((*m_pdrgpcrOutput)[i]);
}
}
return pcrs;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::DeriveNotNullColumns
//
// @doc:
// Derive not null output columns
//
//---------------------------------------------------------------------------
CColRefSet *
CLogicalGet::DeriveNotNullColumns(CMemoryPool *mp,
CExpressionHandle &exprhdl) const
{
// get all output columns
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp);
pcrs->Include(exprhdl.DeriveOutputColumns());
// filters out nullable columns
CColRefSetIter crsi(*exprhdl.DeriveOutputColumns());
while (crsi.Advance())
{
CColRefTable *pcrtable = CColRefTable::PcrConvert(crsi.Pcr());
if (pcrtable->IsNullable())
{
pcrs->Exclude(pcrtable);
}
}
return pcrs;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::FInputOrderSensitive
//
// @doc:
// Not called for leaf operators
//
//---------------------------------------------------------------------------
BOOL
CLogicalGet::FInputOrderSensitive() const
{
GPOS_ASSERT(!"Unexpected function call of FInputOrderSensitive");
return false;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::PkcDeriveKeys
//
// @doc:
// Derive key collection
//
//---------------------------------------------------------------------------
CKeyCollection *
CLogicalGet::DeriveKeyCollection(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const
{
const CBitSetArray *pdrgpbs = m_ptabdesc->PdrgpbsKeys();
return CLogical::PkcKeysBaseTable(mp, pdrgpbs, m_pdrgpcrOutput);
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::PxfsCandidates
//
// @doc:
// Get candidate xforms
//
//---------------------------------------------------------------------------
CXformSet *
CLogicalGet::PxfsCandidates(CMemoryPool *mp) const
{
CXformSet *xform_set = GPOS_NEW(mp) CXformSet(mp);
(void) xform_set->ExchangeSet(CXform::ExfGet2TableScan);
return xform_set;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::PstatsDerive
//
// @doc:
// Load up statistics from metadata
//
//---------------------------------------------------------------------------
IStatistics *
CLogicalGet::PstatsDerive(CMemoryPool *mp, CExpressionHandle &exprhdl,
IStatisticsArray * // not used
) const
{
// requesting stats on distribution columns to estimate data skew
IStatistics *pstatsTable =
PstatsBaseTable(mp, exprhdl, m_ptabdesc, m_pcrsDist);
CColRefSet *pcrs = GPOS_NEW(mp) CColRefSet(mp, m_pdrgpcrOutput);
CUpperBoundNDVs *upper_bound_NDVs =
GPOS_NEW(mp) CUpperBoundNDVs(pcrs, pstatsTable->Rows());
CStatistics::CastStats(pstatsTable)->AddCardUpperBound(upper_bound_NDVs);
return pstatsTable;
}
//---------------------------------------------------------------------------
// @function:
// CLogicalGet::OsPrint
//
// @doc:
// debug print
//
//---------------------------------------------------------------------------
IOstream &
CLogicalGet::OsPrint(IOstream &os) const
{
if (m_fPattern)
{
return COperator::OsPrint(os);
}
else
{
os << SzId() << " ";
// alias of table as referenced in the query
m_pnameAlias->OsPrint(os);
// actual name of table in catalog and columns
os << " (";
m_ptabdesc->Name().OsPrint(os);
os << "), Columns: [";
CUtils::OsPrintDrgPcr(os, m_pdrgpcrOutput);
os << "] Key sets: {";
const ULONG ulColumns = m_pdrgpcrOutput->Size();
const CBitSetArray *pdrgpbsKeys = m_ptabdesc->PdrgpbsKeys();
for (ULONG ul = 0; ul < pdrgpbsKeys->Size(); ul++)
{
CBitSet *pbs = (*pdrgpbsKeys)[ul];
if (0 < ul)
{
os << ", ";
}
os << "[";
ULONG ulPrintedKeys = 0;
for (ULONG ulKey = 0; ulKey < ulColumns; ulKey++)
{
if (pbs->Get(ulKey))
{
if (0 < ulPrintedKeys)
{
os << ",";
}
os << ulKey;
ulPrintedKeys++;
}
}
os << "]";
}
os << "}";
}
return os;
}
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦