greenplumn CPartKeys 源码
greenplumn CPartKeys 代码
文件路径:/src/backend/gporca/libgpopt/src/base/CPartKeys.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2014 VMware, Inc. or its affiliates.
//
// @filename:
// CPartKeys.cpp
//
// @doc:
// Implementation of partitioning keys
//---------------------------------------------------------------------------
#include "gpopt/base/CPartKeys.h"
#include "gpos/base.h"
#include "gpos/error/CAutoTrace.h"
#include "gpopt/base/CColRefSet.h"
#include "gpopt/base/CUtils.h"
using namespace gpopt;
FORCE_GENERATE_DBGSTR(CPartKeys);
//---------------------------------------------------------------------------
// @function:
// CPartKeys::CPartKeys
//
// @doc:
// Ctor
//
//---------------------------------------------------------------------------
CPartKeys::CPartKeys(CColRef2dArray *pdrgpdrgpcr) : m_pdrgpdrgpcr(pdrgpdrgpcr)
{
GPOS_ASSERT(nullptr != pdrgpdrgpcr);
m_num_of_part_levels = pdrgpdrgpcr->Size();
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::~CPartKeys
//
// @doc:
// Dtor
//
//---------------------------------------------------------------------------
CPartKeys::~CPartKeys()
{
m_pdrgpdrgpcr->Release();
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::PcrKey
//
// @doc:
// Return key at a given level
//
//---------------------------------------------------------------------------
CColRef *
CPartKeys::PcrKey(ULONG ulLevel) const
{
GPOS_ASSERT(ulLevel < m_num_of_part_levels);
CColRefArray *colref_array = (*m_pdrgpdrgpcr)[ulLevel];
return (*colref_array)[0];
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::FOverlap
//
// @doc:
// Check whether the key columns overlap the given column
//
//---------------------------------------------------------------------------
BOOL
CPartKeys::FOverlap(CColRefSet *pcrs) const
{
for (ULONG ul = 0; ul < m_num_of_part_levels; ul++)
{
CColRef *colref = PcrKey(ul);
if (pcrs->FMember(colref))
{
return true;
}
}
return false;
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::PpartkeysCopy
//
// @doc:
// Copy part key into the given memory pool
//
//---------------------------------------------------------------------------
CPartKeys *
CPartKeys::PpartkeysCopy(CMemoryPool *mp)
{
CColRef2dArray *pdrgpdrgpcrCopy = GPOS_NEW(mp) CColRef2dArray(mp);
const ULONG length = m_pdrgpdrgpcr->Size();
for (ULONG ul = 0; ul < length; ul++)
{
CColRefArray *colref_array = (*m_pdrgpdrgpcr)[ul];
CColRefArray *pdrgpcrCopy = GPOS_NEW(mp) CColRefArray(mp);
const ULONG num_cols = colref_array->Size();
for (ULONG ulCol = 0; ulCol < num_cols; ulCol++)
{
pdrgpcrCopy->Append((*colref_array)[ulCol]);
}
pdrgpdrgpcrCopy->Append(pdrgpcrCopy);
}
return GPOS_NEW(mp) CPartKeys(pdrgpdrgpcrCopy);
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::PdrgppartkeysCopy
//
// @doc:
// Copy array of part keys into given memory pool
//
//---------------------------------------------------------------------------
CPartKeysArray *
CPartKeys::PdrgppartkeysCopy(CMemoryPool *mp,
const CPartKeysArray *pdrgppartkeys)
{
GPOS_ASSERT(nullptr != pdrgppartkeys);
CPartKeysArray *pdrgppartkeysCopy = GPOS_NEW(mp) CPartKeysArray(mp);
const ULONG length = pdrgppartkeys->Size();
for (ULONG ul = 0; ul < length; ul++)
{
pdrgppartkeysCopy->Append((*pdrgppartkeys)[ul]->PpartkeysCopy(mp));
}
return pdrgppartkeysCopy;
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::PpartkeysRemap
//
// @doc:
// Create a new PartKeys object from the current one by remapping the
// keys using the given hashmap
//
//---------------------------------------------------------------------------
CPartKeys *
CPartKeys::PpartkeysRemap(CMemoryPool *mp,
UlongToColRefMap *colref_mapping) const
{
GPOS_ASSERT(nullptr != colref_mapping);
CColRef2dArray *pdrgpdrgpcr = GPOS_NEW(mp) CColRef2dArray(mp);
for (ULONG ul = 0; ul < m_num_of_part_levels; ul++)
{
CColRef *colref =
CUtils::PcrRemap(PcrKey(ul), colref_mapping, false /*must_exist*/);
CColRefArray *colref_array = GPOS_NEW(mp) CColRefArray(mp);
colref_array->Append(colref);
pdrgpdrgpcr->Append(colref_array);
}
return GPOS_NEW(mp) CPartKeys(pdrgpdrgpcr);
}
//---------------------------------------------------------------------------
// @function:
// CPartKeys::OsPrint
//
// @doc:
// Debug print
//
//---------------------------------------------------------------------------
IOstream &
CPartKeys::OsPrint(IOstream &os) const
{
os << "(";
for (ULONG ul = 0; ul < m_num_of_part_levels; ul++)
{
CColRef *colref = PcrKey(ul);
os << *colref;
// separator
os << (ul == m_num_of_part_levels - 1 ? "" : ", ");
}
os << ")";
return os;
}
// EOF
相关信息
相关文章
greenplumn CColConstraintsArrayMapper 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦