greenplumn CColRefSet 源码
greenplumn CColRefSet 代码
文件路径:/src/backend/gporca/libgpopt/src/base/CColRefSet.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2009 Greenplum, Inc.
//
// @filename:
// CColRefSet.cpp
//
// @doc:
// Implementation of column reference set based on bit sets
//---------------------------------------------------------------------------
#include "gpopt/base/CColRefSet.h"
#include "gpos/base.h"
#include "gpopt/base/CAutoOptCtxt.h"
#include "gpopt/base/CColRefSetIter.h"
#include "gpopt/base/CColumnFactory.h"
using namespace gpopt;
FORCE_GENERATE_DBGSTR(CColRefSet);
//---------------------------------------------------------------------------
// @function:
// CColRefSet::CColRefSet
//
// @doc:
// ctor
//
//---------------------------------------------------------------------------
CColRefSet::CColRefSet(CMemoryPool *mp, ULONG ulSizeBits)
: CBitSet(mp, ulSizeBits)
{
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::CColRefSet
//
// @doc:
// copy ctor;
//
//---------------------------------------------------------------------------
CColRefSet::CColRefSet(CMemoryPool *mp, const CColRefSet &bs) : CBitSet(mp, bs)
{
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::CColRefSet
//
// @doc:
// ctor, copy from col refs array
//
//---------------------------------------------------------------------------
CColRefSet::CColRefSet(CMemoryPool *mp, const CColRefArray *colref_array,
ULONG size)
: CBitSet(mp, size)
{
Include(colref_array);
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::~CColRefSet
//
// @doc:
// dtor
//
//---------------------------------------------------------------------------
CColRefSet::~CColRefSet() = default;
//---------------------------------------------------------------------------
// @function:
// CColRefSet::FMember
//
// @doc:
// Check if given column ref is in the set
//
//---------------------------------------------------------------------------
BOOL
CColRefSet::FMember(const CColRef *colref) const
{
return CBitSet::Get(colref->Id());
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::PcrAny
//
// @doc:
// Return random member
//
//---------------------------------------------------------------------------
CColRef *
CColRefSet::PcrAny() const
{
// for now return the first column
return PcrFirst();
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::PcrFirst
//
// @doc:
// Return first member
//
//---------------------------------------------------------------------------
CColRef *
CColRefSet::PcrFirst() const
{
CColRefSetIter crsi(*this);
if (crsi.Advance())
{
return crsi.Pcr();
}
GPOS_ASSERT(0 == Size());
return nullptr;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Include
//
// @doc:
// Include a constant column ref in set
//
//---------------------------------------------------------------------------
void
CColRefSet::Include(const CColRef *colref)
{
CBitSet::ExchangeSet(colref->Id());
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Include
//
// @doc:
// Include column refs from an array
//
//---------------------------------------------------------------------------
void
CColRefSet::Include(const CColRefArray *colref_array)
{
ULONG length = colref_array->Size();
for (ULONG i = 0; i < length; i++)
{
Include((*colref_array)[i]);
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Include
//
// @doc:
// Include a set of columns in bitset
//
//---------------------------------------------------------------------------
void
CColRefSet::Include(const CColRefSet *pcrs)
{
CColRefSetIter crsi(*pcrs);
while (crsi.Advance())
{
Include(crsi.Pcr());
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Exclude
//
// @doc:
// Remove column from bitset
//
//---------------------------------------------------------------------------
void
CColRefSet::Exclude(const CColRef *colref)
{
CBitSet::ExchangeClear(colref->Id());
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Exclude
//
// @doc:
// Remove a set of columns from bitset
//
//---------------------------------------------------------------------------
void
CColRefSet::Exclude(const CColRefSet *pcrs)
{
CColRefSetIter crsi(*pcrs);
while (crsi.Advance())
{
Exclude(crsi.Pcr());
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Exclude
//
// @doc:
// Remove an array of columns from bitset
//
//---------------------------------------------------------------------------
void
CColRefSet::Exclude(const CColRefArray *colref_array)
{
for (ULONG i = 0; i < colref_array->Size(); i++)
{
Exclude((*colref_array)[i]);
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Replace
//
// @doc:
// Replace column with another column in bitset
//
//---------------------------------------------------------------------------
void
CColRefSet::Replace(const CColRef *pcrOut, const CColRef *pcrIn)
{
if (FMember(pcrOut))
{
Exclude(pcrOut);
Include(pcrIn);
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Replace
//
// @doc:
// Replace an array of columns with another array of columns
//
//---------------------------------------------------------------------------
void
CColRefSet::Replace(const CColRefArray *pdrgpcrOut,
const CColRefArray *pdrgpcrIn)
{
const ULONG length = pdrgpcrOut->Size();
GPOS_ASSERT(length == pdrgpcrIn->Size());
for (ULONG ul = 0; ul < length; ul++)
{
Replace((*pdrgpcrOut)[ul], (*pdrgpcrIn)[ul]);
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Pdrgpcr
//
// @doc:
// Convert set into array
//
//---------------------------------------------------------------------------
CColRefArray *
CColRefSet::Pdrgpcr(CMemoryPool *mp) const
{
CColRefArray *colref_array = GPOS_NEW(mp) CColRefArray(mp);
CColRefSetIter crsi(*this);
while (crsi.Advance())
{
colref_array->Append(crsi.Pcr());
}
return colref_array;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::Phmicr
//
// @doc:
// Convert set into map
//
//---------------------------------------------------------------------------
IntToColRefMap *
CColRefSet::Phmicr(CMemoryPool *mp) const
{
IntToColRefMap *phmicr = GPOS_NEW(mp) IntToColRefMap(mp);
CColRefSetIter crsi(*this);
while (crsi.Advance())
{
phmicr->Insert(GPOS_NEW(mp) INT(crsi.Pcr()->Id()), crsi.Pcr());
}
return phmicr;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::HashValue
//
// @doc:
// Compute hash value by combining hashes of components
//
//---------------------------------------------------------------------------
ULONG
CColRefSet::HashValue()
{
ULONG size = this->Size();
ULONG ulHash = gpos::HashValue<ULONG>(&size);
// limit the number of columns used in hash computation
ULONG length = std::min(size, (ULONG) 8);
CColRefSetIter crsi(*this);
for (ULONG i = 0; i < length; i++)
{
(void) crsi.Advance();
ulHash =
gpos::CombineHashes(ulHash, gpos::HashPtr<CColRef>(crsi.Pcr()));
}
return ulHash;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::OsPrint
//
// @doc:
// Helper function to print a colref set
//
//---------------------------------------------------------------------------
IOstream &
CColRefSet::OsPrint(IOstream &os) const
{
return OsPrint(os, gpos::ulong_max);
}
IOstream &
CColRefSet::OsPrint(IOstream &os, ULONG ulLenMax) const
{
ULONG length = Size();
ULONG ul = 0;
CColRefSetIter crsi(*this);
while (crsi.Advance() && ul < std::min(length, ulLenMax))
{
CColRef *colref = crsi.Pcr();
colref->OsPrint(os);
if (ul < length - 1)
{
os << ", ";
}
ul++;
}
if (ulLenMax < length)
{
os << "...";
}
return os;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::ExtractColIds
//
// @doc:
// Extract array of column ids from colrefset
//
//---------------------------------------------------------------------------
void
CColRefSet::ExtractColIds(CMemoryPool *mp, ULongPtrArray *colids) const
{
CColRefSetIter crsi(*this);
while (crsi.Advance())
{
CColRef *colref = crsi.Pcr();
ULONG colid = colref->Id();
colids->Append(GPOS_NEW(mp) ULONG(colid));
}
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::FContained
//
// @doc:
// Check if the current colrefset is a subset of any of the colrefsets in
// the given array
//
//---------------------------------------------------------------------------
BOOL
CColRefSet::FContained(const CColRefSetArray *pdrgpcrs)
{
GPOS_ASSERT(nullptr != pdrgpcrs);
const ULONG length = pdrgpcrs->Size();
for (ULONG ul = 0; ul < length; ul++)
{
if ((*pdrgpcrs)[ul]->ContainsAll(this))
{
return true;
}
}
return false;
}
BOOL
CColRefSet::FIntersects(const CColRefSet *pcrs)
{
GPOS_ASSERT(nullptr != pcrs);
CColRefSet *intersecting_colrefset = GPOS_NEW(m_mp) CColRefSet(m_mp, *this);
intersecting_colrefset->Intersection(pcrs);
BOOL intersects = intersecting_colrefset->Size() > 0;
intersecting_colrefset->Release();
return intersects;
}
//---------------------------------------------------------------------------
// @function:
// CColRefSet::FCovered
//
// @doc:
// Are the columns in the column reference set covered by the array of
// column ref sets
//---------------------------------------------------------------------------
BOOL
CColRefSet::FCovered(CColRefSetArray *pdrgpcrs, CColRefSet *pcrs)
{
GPOS_ASSERT(nullptr != pdrgpcrs);
GPOS_ASSERT(nullptr != pcrs);
GPOS_ASSERT(0 < pdrgpcrs->Size());
if (0 == pcrs->Size())
{
return false;
}
CColRefSetIter crsi(*pcrs);
while (crsi.Advance())
{
CColRef *colref = crsi.Pcr();
BOOL fFound = false;
const ULONG length = pdrgpcrs->Size();
for (ULONG ul = 0; ul < length && !fFound; ul++)
{
CColRefSet *pcrs = (*pdrgpcrs)[ul];
if (pcrs->FMember(colref))
{
fFound = true;
}
}
if (!fFound)
{
return false;
}
}
return true;
}
// EOF
相关信息
相关文章
greenplumn CColConstraintsArrayMapper 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦