greenplumn CConstraint 源码
greenplumn CConstraint 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/base/CConstraint.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2012 EMC Corp.
//
// @filename:
// CConstraint.h
//
// @doc:
// Base class for representing constraints
//---------------------------------------------------------------------------
#ifndef GPOPT_CConstraint_H
#define GPOPT_CConstraint_H
#include "gpos/base.h"
#include "gpos/common/CDynamicPtrArray.h"
#include "gpos/common/CHashMap.h"
#include "gpos/common/CRefCount.h"
#include "gpos/types.h"
#include "gpopt/base/CColRef.h"
#include "gpopt/base/CColRefSet.h"
namespace gpopt
{
using namespace gpos;
// fwd declaration
class CExpression;
class CConstraint;
// constraint array
using CConstraintArray = CDynamicPtrArray<CConstraint, CleanupRelease>;
// hash map mapping CColRef -> CConstraintArray
using ColRefToConstraintArrayMap =
CHashMap<CColRef, CConstraintArray, CColRef::HashValue, CColRef::Equals,
CleanupNULL<CColRef>, CleanupRelease<CConstraintArray>>;
// mapping CConstraint -> BOOL to cache previous containment queries,
// we use pointer equality here for fast map lookup -- since we do shallow comparison, we do not take ownership
// of pointer values
using ConstraintContainmentMap =
CHashMap<CConstraint, BOOL, gpos::HashPtr<CConstraint>,
gpos::EqualPtr<CConstraint>, CleanupNULL<CConstraint>,
CleanupNULL<BOOL>>;
// hash map mapping ULONG -> CConstraint
using UlongToConstraintMap =
CHashMap<ULONG, CConstraint, gpos::HashValue<ULONG>, gpos::Equals<ULONG>,
CleanupDelete<ULONG>, CleanupRelease<CConstraint>>;
//---------------------------------------------------------------------------
// @class:
// CConstraint
//
// @doc:
// Base class for representing constraints
//
//---------------------------------------------------------------------------
class CConstraint : public CRefCount, public DbgPrintMixin<CConstraint>
{
public:
enum EConstraintType
{
EctInterval, // a single interval on a single columns
EctConjunction, // a set of ANDed constraints
EctDisjunction, // a set of ORed constraints
EctNegation // a negated constraint
};
private:
// containment map
ConstraintContainmentMap *m_phmcontain;
// constant true
static BOOL m_fTrue;
// constant false
static BOOL m_fFalse;
// return address of static BOOL constant based on passed BOOL value
static BOOL *
PfVal(BOOL value)
{
if (value)
{
return &m_fTrue;
}
return &m_fFalse;
}
// add column as a new equivalence class, if it is not already in one of the
// existing equivalence classes
static void AddColumnToEquivClasses(CMemoryPool *mp, const CColRef *colref,
CColRefSetArray *pdrgpcrs);
// create constraint from scalar comparison
static CConstraint *PcnstrFromScalarCmp(CMemoryPool *mp, CExpression *pexpr,
CColRefSetArray **ppdrgpcrs,
BOOL infer_nulls_as = false);
// create constraint from scalar boolean expression
static CConstraint *PcnstrFromScalarBoolOp(CMemoryPool *mp,
CExpression *pexpr,
CColRefSetArray **ppdrgpcrs,
BOOL infer_nulls_as = false);
// create conjunction/disjunction from array of constraints
static CConstraint *PcnstrConjDisj(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr,
BOOL fConj);
protected:
// memory pool -- used for local computations
CMemoryPool *m_mp;
// columns used in this constraint
CColRefSet *m_pcrsUsed;
// equivalent scalar expression
CExpression *m_pexprScalar;
// print
IOstream &PrintConjunctionDisjunction(IOstream &os,
CConstraintArray *pdrgpcnstr) const;
// construct a conjunction or disjunction scalar expression from an
// array of constraints
static CExpression *PexprScalarConjDisj(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr,
BOOL fConj);
// flatten an array of constraints to be used as constraint children
static CConstraintArray *PdrgpcnstrFlatten(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr,
EConstraintType ect);
// combine any two or more constraints that reference only one particular column
static CConstraintArray *PdrgpcnstrDeduplicate(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr,
EConstraintType ect);
// mapping between columns and arrays of constraints
static ColRefToConstraintArrayMap *Phmcolconstr(
CMemoryPool *mp, CColRefSet *pcrs, CConstraintArray *pdrgpcnstr);
// return a copy of the conjunction/disjunction constraint for a different column
static CConstraint *PcnstrConjDisjRemapForColumn(
CMemoryPool *mp, CColRef *colref, CConstraintArray *pdrgpcnstr,
BOOL fConj);
// create constraint from scalar array comparison expression originally generated for
// "scalar op ANY/ALL (array)" construct
static CConstraint *PcnstrFromScalarArrayCmp(CMemoryPool *mp,
CExpression *pexpr,
CColRef *colref,
BOOL infer_nulls_as = false);
static CColRefSet *PcrsFromConstraints(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr);
public:
CConstraint(const CConstraint &) = delete;
// ctor
explicit CConstraint(CMemoryPool *mp, CColRefSet *pcrsUsed);
// dtor
~CConstraint() override;
// constraint type accessor
virtual EConstraintType Ect() const = 0;
// is this constraint a contradiction
virtual BOOL FContradiction() const = 0;
// is this constraint unbounded
virtual BOOL
IsConstraintUnbounded() const
{
return false;
}
// does the current constraint contain the given one
virtual BOOL Contains(CConstraint *pcnstr);
// equality function
virtual BOOL Equals(CConstraint *pcnstr);
// columns in this constraint
virtual CColRefSet *
PcrsUsed() const
{
return m_pcrsUsed;
}
// scalar expression
virtual CExpression *PexprScalar(CMemoryPool *mp) = 0;
// check if there is a constraint on the given column
virtual BOOL FConstraint(const CColRef *colref) const = 0;
virtual BOOL
FConstraintOnSegmentId() const
{
return false;
}
// return a copy of the constraint with remapped columns
virtual CConstraint *PcnstrCopyWithRemappedColumns(
CMemoryPool *mp, UlongToColRefMap *colref_mapping, BOOL must_exist) = 0;
// return constraint on a given column
virtual CConstraint *
Pcnstr(CMemoryPool *, //mp,
const CColRef * //colref
)
{
return nullptr;
}
// return constraint on a given set of columns
virtual CConstraint *
Pcnstr(CMemoryPool *, //mp,
CColRefSet * //pcrs
)
{
return nullptr;
}
// return a clone of the constraint for a different column
virtual CConstraint *PcnstrRemapForColumn(CMemoryPool *mp,
CColRef *colref) const = 0;
// create constraint from scalar expression and pass back any discovered
// equivalence classes
static CConstraint *PcnstrFromScalarExpr(CMemoryPool *mp,
CExpression *pexpr,
CColRefSetArray **ppdrgpcrs,
BOOL infer_nulls_as = false);
// create conjunction from array of constraints
static CConstraint *PcnstrConjunction(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr);
// create disjunction from array of constraints
static CConstraint *PcnstrDisjunction(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr);
// merge equivalence classes coming from children of a bool op
static CColRefSetArray *PdrgpcrsMergeFromBoolOp(
CMemoryPool *mp, CExpression *pexpr, CColRefSetArray *pdrgpcrsFst,
CColRefSetArray *pdrgpcrsSnd);
// subset of the given constraints, which reference the given column
static CConstraintArray *PdrgpcnstrOnColumn(CMemoryPool *mp,
CConstraintArray *pdrgpcnstr,
CColRef *colref,
BOOL fExclusive);
virtual gpos::IOstream &OsPrint(gpos::IOstream &os) const = 0;
}; // class CConstraint
// shorthand for printing, pointer.
inline IOstream &
operator<<(IOstream &os, const CConstraint *cnstr)
{
return cnstr->OsPrint(os);
}
// shorthand for printing
inline IOstream &
operator<<(IOstream &os, const CConstraint &cnstr)
{
return cnstr.OsPrint(os);
}
} // namespace gpopt
#endif // !GPOPT_CConstraint_H
// EOF
相关信息
相关文章
greenplumn CColConstraintsArrayMapper 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦