greenplumn COptimizationContext 源码
greenplumn COptimizationContext 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/base/COptimizationContext.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2011 EMC Corp.
//
// @filename:
// COptimizationContext.h
//
// @doc:
// Optimization context object stores properties required to hold
// on the plan generated by the optimizer
//---------------------------------------------------------------------------
#ifndef GPOPT_COptimizationContext_H
#define GPOPT_COptimizationContext_H
#include "gpos/base.h"
#include "gpos/common/DbgPrintMixin.h"
#include "gpos/task/CAutoTraceFlag.h"
#include "gpopt/base/CReqdPropPlan.h"
#include "gpopt/base/CReqdPropRelational.h"
#include "gpopt/search/CJobQueue.h"
#include "naucrates/statistics/IStatistics.h"
#define GPOPT_INVALID_OPTCTXT_ID gpos::ulong_max
namespace gpopt
{
using namespace gpos;
// forward declarations
class CGroup;
class CGroupExpression;
class CCostContext;
class COptimizationContext;
class CDrvdPropPlan;
// optimization context pointer definition
using OPTCTXT_PTR = COptimizationContext *;
// array of optimization contexts
using COptimizationContextArray =
CDynamicPtrArray<COptimizationContext, CleanupRelease>;
//---------------------------------------------------------------------------
// @class:
// COptimizationContext
//
// @doc:
// Optimization context
//
//---------------------------------------------------------------------------
class COptimizationContext : public CRefCount,
public DbgPrintMixin<COptimizationContext>
{
public:
// states of optimization context
enum EState
{
estUnoptimized, // initial state
estOptimizing, // ongoing optimization
estOptimized, // done optimization
estSentinel
};
private:
// memory pool
CMemoryPool *m_mp{nullptr};
// private copy ctor
COptimizationContext(const COptimizationContext &);
// unique id within owner group, used for debugging
ULONG m_id{GPOPT_INVALID_OPTCTXT_ID};
// back pointer to owner group, used for debugging
CGroup *m_pgroup{nullptr};
// required plan properties
CReqdPropPlan *m_prpp{nullptr};
// required relational properties -- used for stats computation during costing
CReqdPropRelational *m_prprel{nullptr};
// stats of previously optimized expressions
IStatisticsArray *m_pdrgpstatCtxt{nullptr};
// index of search stage where context is generated
ULONG m_ulSearchStageIndex{0};
// best cost context under the optimization context
CCostContext *m_pccBest{nullptr};
// optimization context state
EState m_estate{estUnoptimized};
// is there a multi-stage Agg plan satisfying required properties
BOOL m_fHasMultiStageAggPlan{false};
// context's optimization job queue
CJobQueue m_jqOptimization;
// internal matching function
BOOL FMatchSortColumns(const COptimizationContext *poc) const;
// private dummy ctor; used for creating invalid context
COptimizationContext() = default;
// check if Agg node should be optimized for the given context
static BOOL FOptimizeAgg(CMemoryPool *mp, CGroupExpression *pgexprParent,
CGroupExpression *pgexprAgg,
COptimizationContext *poc, ULONG ulSearchStages);
// check if Sort node should be optimized for the given context
static BOOL FOptimizeSort(CMemoryPool *mp, CGroupExpression *pgexprParent,
CGroupExpression *pgexprSort,
COptimizationContext *poc, ULONG ulSearchStages);
// check if Motion node should be optimized for the given context
static BOOL FOptimizeMotion(CMemoryPool *mp, CGroupExpression *pgexprParent,
CGroupExpression *pgexprMotion,
COptimizationContext *poc,
ULONG ulSearchStages);
// check if NL join node should be optimized for the given context
static BOOL FOptimizeNLJoin(CMemoryPool *mp, CGroupExpression *pgexprParent,
CGroupExpression *pgexprMotion,
COptimizationContext *poc,
ULONG ulSearchStages);
public:
// ctor
COptimizationContext(
CMemoryPool *mp, CGroup *pgroup, CReqdPropPlan *prpp,
CReqdPropRelational *
prprel, // required relational props -- used during stats derivation
IStatisticsArray
*stats_ctxt, // stats of previously optimized expressions
ULONG ulSearchStageIndex)
: m_mp(mp),
m_pgroup(pgroup),
m_prpp(prpp),
m_prprel(prprel),
m_pdrgpstatCtxt(stats_ctxt),
m_ulSearchStageIndex(ulSearchStageIndex)
{
GPOS_ASSERT(nullptr != pgroup);
GPOS_ASSERT(nullptr != prpp);
GPOS_ASSERT(nullptr != prprel);
GPOS_ASSERT(nullptr != stats_ctxt);
}
// dtor
~COptimizationContext() override;
// best group expression accessor
CGroupExpression *PgexprBest() const;
// match optimization contexts
BOOL Matches(const COptimizationContext *poc) const;
// get id
ULONG
Id() const
{
return m_id;
}
// group accessor
CGroup *
Pgroup() const
{
return m_pgroup;
}
// required plan properties accessor
CReqdPropPlan *
Prpp() const
{
return m_prpp;
}
// required relatoinal properties accessor
CReqdPropRelational *
GetReqdRelationalProps() const
{
return m_prprel;
}
// stats of previously optimized expressions
IStatisticsArray *
Pdrgpstat() const
{
return m_pdrgpstatCtxt;
}
// search stage index accessor
ULONG
UlSearchStageIndex() const
{
return m_ulSearchStageIndex;
}
// best cost context accessor
CCostContext *
PccBest() const
{
return m_pccBest;
}
// optimization job queue accessor
CJobQueue *
PjqOptimization()
{
return &m_jqOptimization;
}
// state accessor
EState
Est() const
{
return m_estate;
}
// is there a multi-stage Agg plan satisfying required properties
BOOL
FHasMultiStageAggPlan() const
{
return m_fHasMultiStageAggPlan;
}
// set optimization context id
void
SetId(ULONG id)
{
GPOS_ASSERT(m_id == GPOPT_INVALID_OPTCTXT_ID);
m_id = id;
}
// set optimization context state
void
SetState(EState estNewState)
{
GPOS_ASSERT(estNewState == (EState)(m_estate + 1));
m_estate = estNewState;
}
// set best cost context
void SetBest(CCostContext *pcc);
// comparison operator for hashtables
BOOL
operator==(const COptimizationContext &oc) const
{
return oc.Matches(this);
}
// debug print
IOstream &OsPrint(IOstream &os) const;
IOstream &OsPrintWithPrefix(IOstream &os, const CHAR *szPrefix) const;
// check equality of optimization contexts
static BOOL
Equals(const COptimizationContext &ocLeft,
const COptimizationContext &ocRight)
{
return ocLeft == ocRight;
}
// hash function for optimization context
static ULONG
HashValue(const COptimizationContext &oc)
{
GPOS_ASSERT(nullptr != oc.Prpp());
return oc.Prpp()->HashValue();
}
// equality function for cost contexts hash table
static BOOL
Equals(const OPTCTXT_PTR &pocLeft, const OPTCTXT_PTR &pocRight)
{
if (pocLeft == m_pocInvalid || pocRight == m_pocInvalid)
{
return pocLeft == m_pocInvalid && pocRight == m_pocInvalid;
}
return *pocLeft == *pocRight;
}
// hash function for cost contexts hash table
static ULONG
HashValue(const OPTCTXT_PTR &poc)
{
GPOS_ASSERT(m_pocInvalid != poc);
return HashValue(*poc);
}
// hash function used for computing stats during costing
static ULONG
UlHashForStats(const COptimizationContext *poc)
{
GPOS_ASSERT(m_pocInvalid != poc);
return HashValue(*poc);
}
// equality function used for computing stats during costing
static BOOL FEqualForStats(const COptimizationContext *pocLeft,
const COptimizationContext *pocRight);
// return true if given group expression should be optimized under given context
static BOOL FOptimize(CMemoryPool *mp, CGroupExpression *pgexprParent,
CGroupExpression *pgexprChild,
COptimizationContext *pocChild, ULONG ulSearchStages);
// compare array of contexts based on context ids
static BOOL FEqualContextIds(COptimizationContextArray *pdrgpocFst,
COptimizationContextArray *pdrgpocSnd);
// compute required properties to CTE producer based on plan properties of CTE consumer
static CReqdPropPlan *PrppCTEProducer(CMemoryPool *mp,
COptimizationContext *poc,
ULONG ulSearchStages);
// link for optimization context hash table in CGroup
SLink m_link;
// invalid optimization context, needed for hash table iteration
static const COptimizationContext m_ocInvalid;
// invalid optimization context pointer, needed for cost contexts hash table iteration
static const OPTCTXT_PTR m_pocInvalid;
}; // class COptimizationContext
} // namespace gpopt
#endif // !GPOPT_COptimizationContext_H
// EOF
相关信息
相关文章
greenplumn CColConstraintsArrayMapper 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦