greenplumn CLogicalIndexApply 源码
greenplumn CLogicalIndexApply 代码
文件路径:/src/backend/gporca/libgpopt/src/operators/CLogicalIndexApply.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2018 VMware, Inc. or its affiliates.
//
// Implementation of inner / left outer index apply operator
//---------------------------------------------------------------------------
#include "gpopt/operators/CLogicalIndexApply.h"
#include "gpos/base.h"
#include "naucrates/statistics/CJoinStatsProcessor.h"
using namespace gpopt;
CLogicalIndexApply::CLogicalIndexApply(CMemoryPool *mp)
: CLogicalApply(mp),
m_pdrgpcrOuterRefs(nullptr),
m_fOuterJoin(false),
m_origJoinPred(nullptr)
{
m_fPattern = true;
}
CLogicalIndexApply::CLogicalIndexApply(CMemoryPool *mp,
CColRefArray *pdrgpcrOuterRefs,
BOOL fOuterJoin,
CExpression *origJoinPred)
: CLogicalApply(mp),
m_pdrgpcrOuterRefs(pdrgpcrOuterRefs),
m_fOuterJoin(fOuterJoin),
m_origJoinPred(origJoinPred)
{
GPOS_ASSERT(nullptr != pdrgpcrOuterRefs);
if (nullptr != origJoinPred)
{
// We don't allow subqueries in the expression that we
// store in the logical operator, since such expressions
// would be unsuitable for generating a plan.
GPOS_RTL_ASSERT(!origJoinPred->DeriveHasSubquery());
origJoinPred->AddRef();
}
}
CLogicalIndexApply::~CLogicalIndexApply()
{
CRefCount::SafeRelease(m_pdrgpcrOuterRefs);
CRefCount::SafeRelease(m_origJoinPred);
}
CMaxCard
CLogicalIndexApply::DeriveMaxCard(CMemoryPool *, // mp
CExpressionHandle &exprhdl) const
{
return CLogical::Maxcard(exprhdl, 2 /*ulScalarIndex*/, MaxcardDef(exprhdl));
}
CXformSet *
CLogicalIndexApply::PxfsCandidates(CMemoryPool *mp) const
{
CXformSet *xform_set = GPOS_NEW(mp) CXformSet(mp);
(void) xform_set->ExchangeSet(CXform::ExfImplementIndexApply);
return xform_set;
}
BOOL
CLogicalIndexApply::Matches(COperator *pop) const
{
GPOS_ASSERT(nullptr != pop);
if (pop->Eopid() == Eopid())
{
return m_pdrgpcrOuterRefs->Equals(
CLogicalIndexApply::PopConvert(pop)->PdrgPcrOuterRefs());
}
return false;
}
IStatistics *
CLogicalIndexApply::PstatsDerive(CMemoryPool *mp, CExpressionHandle &exprhdl,
IStatisticsArray * // stats_ctxt
) const
{
GPOS_ASSERT(EspNone < Esp(exprhdl));
IStatistics *outer_stats = exprhdl.Pstats(0);
IStatistics *inner_side_stats = exprhdl.Pstats(1);
CExpression *pexprScalar = exprhdl.PexprScalarRepChild(2 /*child_index*/);
// join stats of the children
IStatisticsArray *statistics_array = GPOS_NEW(mp) IStatisticsArray(mp);
outer_stats->AddRef();
statistics_array->Append(outer_stats);
inner_side_stats->AddRef();
statistics_array->Append(inner_side_stats);
IStatistics *stats = CJoinStatsProcessor::CalcAllJoinStats(
mp, statistics_array, pexprScalar,
const_cast<CLogicalIndexApply *>(this));
statistics_array->Release();
return stats;
}
// return a copy of the operator with remapped columns
COperator *
CLogicalIndexApply::PopCopyWithRemappedColumns(CMemoryPool *mp,
UlongToColRefMap *colref_mapping,
BOOL must_exist)
{
COperator *result = nullptr;
CColRefArray *colref_array = CUtils::PdrgpcrRemap(
mp, m_pdrgpcrOuterRefs, colref_mapping, must_exist);
CExpression *remapped_orig_join_pred = nullptr;
if (nullptr != m_origJoinPred)
{
remapped_orig_join_pred = m_origJoinPred->PexprCopyWithRemappedColumns(
mp, colref_mapping, must_exist);
}
result = GPOS_NEW(mp) CLogicalIndexApply(mp, colref_array, m_fOuterJoin,
remapped_orig_join_pred);
CRefCount::SafeRelease(remapped_orig_join_pred);
return result;
}
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦