greenplumn CLogical 源码
greenplumn CLogical 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/operators/CLogical.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2009 Greenplum, Inc.
//
// @filename:
// CLogical.h
//
// @doc:
// Base class for all logical operators
//---------------------------------------------------------------------------
#ifndef GPOPT_CLogical_H
#define GPOPT_CLogical_H
#include "gpos/base.h"
#include "gpopt/base/CDrvdProp.h"
#include "gpopt/base/CMaxCard.h"
#include "gpopt/base/CPartInfo.h"
#include "gpopt/base/CPropConstraint.h"
#include "gpopt/base/CReqdProp.h"
#include "gpopt/base/CUtils.h"
#include "gpopt/operators/COperator.h"
#include "gpopt/xforms/CXform.h"
// fwd declarataion
namespace gpnaucrates
{
class IStatistics;
}
namespace gpopt
{
using namespace gpos;
// forward declaration
class CColRefSet;
class CKeyCollection;
//---------------------------------------------------------------------------
// @class:
// CLogical
//
// @doc:
// base class for all logical operators
//
//---------------------------------------------------------------------------
class CLogical : public COperator
{
public:
// statistics derivation promise levels;
// used for prioritizing operators within the same Memo group for statistics derivation
enum EStatPromise
{
EspNone, // operator must not be used for stat derivation
EspLow, // operator has low priority for stat derivation
EspMedium, // operator has medium priority for stat derivation
EspHigh // operator has high priority for stat derivation
};
private:
// private copy ctor
CLogical(const CLogical &);
protected:
// set of locally used columns
CColRefSet *m_pcrsLocalUsed;
// output column generation given a list of column descriptors
static CColRefArray *PdrgpcrCreateMapping(
CMemoryPool *mp, const CColumnDescriptorArray *pdrgpcoldesc,
ULONG ulOpSourceId, IMDId *mdid_table = nullptr);
// initialize the array of partition columns
static CColRef2dArray *PdrgpdrgpcrCreatePartCols(
CMemoryPool *mp, CColRefArray *colref_array,
const ULongPtrArray *pdrgpulPart);
// derive dummy statistics
IStatistics *PstatsDeriveDummy(CMemoryPool *mp, CExpressionHandle &exprhdl,
CDouble rows) const;
// helper for common case of output derivation from outer child
static CColRefSet *PcrsDeriveOutputPassThru(CExpressionHandle &exprhdl);
// helper for common case of not nullable columns derivation from outer child
static CColRefSet *PcrsDeriveNotNullPassThruOuter(
CExpressionHandle &exprhdl);
// helper for common case of output derivation from all logical children
static CColRefSet *PcrsDeriveOutputCombineLogical(
CMemoryPool *mp, CExpressionHandle &exprhdl);
// helper for common case of combining not nullable columns from all logical children
static CColRefSet *PcrsDeriveNotNullCombineLogical(
CMemoryPool *mp, CExpressionHandle &exprhdl);
// helper for common case of stat columns computation
static CColRefSet *PcrsReqdChildStats(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CColRefSet *pcrsInput,
CColRefSet *pcrsUsed,
ULONG child_index);
// helper for common case of passing through required stat columns
static CColRefSet *PcrsStatsPassThru(CColRefSet *pcrsInput);
// helper for common case of passing through derived stats
static IStatistics *PstatsPassThruOuter(CExpressionHandle &exprhdl);
// shorthand to addref and pass through keys from n-th child
static CKeyCollection *PkcDeriveKeysPassThru(CExpressionHandle &exprhdl,
ULONG ulInput);
// shorthand to combine keys from first n - 1 children
static CKeyCollection *PkcCombineKeys(CMemoryPool *mp,
CExpressionHandle &exprhdl);
// helper function for computing the keys in a base relation
static CKeyCollection *PkcKeysBaseTable(CMemoryPool *mp,
const CBitSetArray *pdrgpbsKeys,
const CColRefArray *pdrgpcrOutput);
// helper for the common case of passing through partition consumer info
static CPartInfo *PpartinfoPassThruOuter(CExpressionHandle &exprhdl);
// helper for common case of combining partition consumer info from logical children
static CPartInfo *PpartinfoDeriveCombine(CMemoryPool *mp,
CExpressionHandle &exprhdl);
// derive constraint property from a table/index get
static CPropConstraint *PpcDeriveConstraintFromTable(
CMemoryPool *mp, const CTableDescriptor *ptabdesc,
const CColRefArray *pdrgpcrOutput);
// derive constraint property from a table/index get with predicates
static CPropConstraint *PpcDeriveConstraintFromTableWithPredicates(
CMemoryPool *mp, CExpressionHandle &exprhdl,
const CTableDescriptor *ptabdesc, const CColRefArray *pdrgpcrOutput);
// shorthand to addref and pass through constraint from a given child
static CPropConstraint *PpcDeriveConstraintPassThru(
CExpressionHandle &exprhdl, ULONG ulChild);
// derive constraint property only on the given columns
static CPropConstraint *PpcDeriveConstraintRestrict(
CMemoryPool *mp, CExpressionHandle &exprhdl, CColRefSet *pcrsOutput);
// default max card for join and apply operators
static CMaxCard MaxcardDef(CExpressionHandle &exprhdl);
// compute max card given scalar child and constraint property
static CMaxCard Maxcard(CExpressionHandle &exprhdl, ULONG ulScalarIndex,
CMaxCard maxcard);
// compute order spec based on an index
static COrderSpec *PosFromIndex(CMemoryPool *mp, const IMDIndex *pmdindex,
CColRefArray *colref_array,
const CTableDescriptor *ptabdesc);
// derive function properties using data access property of scalar child
static CFunctionProp *PfpDeriveFromScalar(CMemoryPool *mp,
CExpressionHandle &exprhdl);
// derive outer references
static CColRefSet *DeriveOuterReferences(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CColRefSet *pcrsUsedAdditional);
public:
// ctor
explicit CLogical(CMemoryPool *mp);
// dtor
~CLogical() override;
// type of operator
BOOL
FLogical() const override
{
GPOS_ASSERT(!FPhysical() && !FScalar() && !FPattern());
return true;
}
// return the locally used columns
CColRefSet *
PcrsLocalUsed() const
{
return m_pcrsLocalUsed;
}
//-------------------------------------------------------------------------------------
// Derived Relational Properties
//-------------------------------------------------------------------------------------
// create derived properties container
CDrvdProp *PdpCreate(CMemoryPool *mp) const override;
// derive output columns
virtual CColRefSet *DeriveOutputColumns(CMemoryPool *mp,
CExpressionHandle &exprhdl) = 0;
// derive outer references
virtual CColRefSet *
DeriveOuterReferences(CMemoryPool *mp, CExpressionHandle &exprhdl)
{
return DeriveOuterReferences(mp, exprhdl,
nullptr /*pcrsUsedAdditional*/);
}
// derive outer references for index get and dynamic index get operators
virtual CColRefSet *PcrsDeriveOuterIndexGet(CMemoryPool *mp,
CExpressionHandle &exprhdl);
// derive not nullable output columns
virtual CColRefSet *
DeriveNotNullColumns(CMemoryPool *mp,
CExpressionHandle & // exprhdl
) const
{
// by default, return an empty set
return GPOS_NEW(mp) CColRefSet(mp);
}
// derive columns from the inner child of a correlated-apply expression that can be used above the apply expression
virtual CColRefSet *DeriveCorrelatedApplyColumns(
CMemoryPool *mp, CExpressionHandle &exprhdl) const;
// derive key collections
virtual CKeyCollection *DeriveKeyCollection(
CMemoryPool *mp, CExpressionHandle &exprhdl) const;
// derive max card
virtual CMaxCard DeriveMaxCard(CMemoryPool *mp,
CExpressionHandle &exprhdl) const;
// derive join depth
virtual ULONG DeriveJoinDepth(CMemoryPool *mp,
CExpressionHandle &exprhdl) const;
// derive partition information
virtual CPartInfo *DerivePartitionInfo(
CMemoryPool *mp, CExpressionHandle &exprhdl) const = 0;
// derive constraint property
virtual CPropConstraint *DerivePropertyConstraint(
CMemoryPool *mp, CExpressionHandle &exprhdl) const = 0;
// derive function properties
virtual CFunctionProp *DeriveFunctionProperties(
CMemoryPool *mp, CExpressionHandle &exprhdl) const;
virtual CTableDescriptor *DeriveTableDescriptor(
CMemoryPool *mp, CExpressionHandle &exprhdl) const;
//-------------------------------------------------------------------------------------
// Derived Stats
//-------------------------------------------------------------------------------------
// derive statistics
virtual IStatistics *PstatsDerive(CMemoryPool *mp,
CExpressionHandle &exprhdl,
IStatisticsArray *stats_ctxt) const = 0;
// promise level for stat derivation
virtual EStatPromise Esp(CExpressionHandle &) const = 0;
//-------------------------------------------------------------------------------------
// Required Relational Properties
//-------------------------------------------------------------------------------------
// create required properties container
CReqdProp *PrpCreate(CMemoryPool *mp) const override;
// compute required stat columns of the n-th child
virtual CColRefSet *PcrsStat(CMemoryPool *mp, CExpressionHandle &exprhdl,
CColRefSet *pcrsInput,
ULONG child_index) const = 0;
// compute partition predicate to pass down to n-th child
virtual CExpression *PexprPartPred(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CExpression *pexprInput,
ULONG child_index) const;
//-------------------------------------------------------------------------------------
// Transformations
//-------------------------------------------------------------------------------------
// candidate set of xforms
virtual CXformSet *PxfsCandidates(CMemoryPool *mp) const = 0;
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
// return true if operator can select a subset of input tuples based on some predicate,
// for example, a Join is a SelectionOp, but a Project is not
virtual BOOL
FSelectionOp() const
{
return false;
}
// return true if we can pull projections up past this operator from its given child
virtual BOOL FCanPullProjectionsUp(ULONG //child_index
) const
{
return true;
}
// helper for deriving statistics on a base table
static IStatistics *PstatsBaseTable(CMemoryPool *mp,
CExpressionHandle &exprhdl,
CTableDescriptor *ptabdesc,
CColRefSet *pcrsStatExtra = nullptr);
// conversion function
static CLogical *
PopConvert(COperator *pop)
{
GPOS_ASSERT(nullptr != pop);
GPOS_ASSERT(pop->FLogical());
return dynamic_cast<CLogical *>(pop);
}
// returns the table descriptor for (Dynamic)(BitmapTable)Get operators
static CTableDescriptor *PtabdescFromTableGet(COperator *pop);
// returns the output columns for selected operator
static CColRefArray *PoutputColsFromTableGet(COperator *pop);
// extract the output columns descriptor from a logical get or dynamic get operator
static CColRefArray *PdrgpcrOutputFromLogicalGet(CLogical *pop);
// extract the table name from a logical get or dynamic get operator
static const CName &NameFromLogicalGet(CLogical *pop);
// return the set of distribution columns
static CColRefSet *PcrsDist(CMemoryPool *mp,
const CTableDescriptor *ptabdesc,
const CColRefArray *colref_array);
// derive constraint property when expression has relational children and predicates
static CPropConstraint *PpcDeriveConstraintFromPredicates(
CMemoryPool *mp, CExpressionHandle &exprhdl);
}; // class CLogical
} // namespace gpopt
#endif // !GPOPT_CLogical_H
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
greenplumn CHashedDistributions 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦