mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-04-20 09:07:44 +03:00
406 lines
15 KiB
C++
406 lines
15 KiB
C++
/* Copyright (C) 2014 InfiniDB, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 of
|
|
the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
/******************************************************************************************
|
|
* $Id: we_index.h 4450 2013-01-21 14:13:24Z rdempsey $
|
|
*
|
|
******************************************************************************************/
|
|
/** @file */
|
|
|
|
#pragma once
|
|
|
|
#include <bitset>
|
|
|
|
#include "we_type.h"
|
|
|
|
/** Namespace WriteEngine */
|
|
namespace WriteEngine
|
|
{
|
|
/*****************************************************
|
|
* index definition
|
|
******************************************************/
|
|
const int IDX_BITTEST_SIZE = 10; /** @brief The bit size of bit test */
|
|
const int IDX_GROUP_SIZE = 3; /** @brief The bit size of group */
|
|
const int IDX_INSTRU_SIZE = 4; /** @brief The bit size of instruction */
|
|
const int IDX_PTR_SIZE = 46; /** @brief The bit size of address pointer */
|
|
const int IDX_TYPE_SIZE = 3; /** @brief The bit size of type */
|
|
|
|
const int IDX_BITMAP_SUBBLOCK_NO = 1; /** @brief Subblock 1 of root block is for bitmap pointer*/
|
|
const int IDX_MAX_TREE_LEVEL = 128; /** @brief The maximum depth of a tree */
|
|
const int IDX_MAX_MULTI_COL_BIT = 256; /** @brief The maximum bits of a multi-column tree (256 bit)*/
|
|
const int IDX_MAX_MULTI_COL_IDX_LEVEL = 52; /** @brief The maximum depth of a multi-column tree */
|
|
const int IDX_MAX_MULTI_COL_IDX_NUM = 64; /** @brief The maximum number of columns for a multi-column index */
|
|
const int MAX_IDX_RID = 1024; /** @brief Maximum index rids for one shot */
|
|
const int IDX_DEFAULT_READ_ROW = 10000; /** @brief Default number of rows for one read for index */
|
|
|
|
// todo: need to move a higher level share file for dictionary
|
|
const int RID_SIZE = 46;
|
|
// const int OID_SIZE = 24; /** @brief The bit size of object id */
|
|
const int FBO_SIZE = 36; /** @brief The bit size of file block offset */
|
|
const int SBID_SIZE = 5; /** @brief The bit size of sub block id */
|
|
const int ENTRY_SIZE = 5; /** @brief The bit size of entry location with a sub block */
|
|
|
|
const int LIST_SIZE_TYPE = 0;
|
|
const int LIST_RID_TYPE = 3;
|
|
const int LIST_NOT_USED_TYPE = 7;
|
|
const int LIST_HDR_SIZE = 32;
|
|
const int LIST_SUBBLOCK_TYPE = 4;
|
|
const int LIST_BLOCK_TYPE = 5;
|
|
const int LIST_LLP_TYPE = 6;
|
|
const int SUBBLOCK_TOTAL_BYTES = 256;
|
|
const int LIST_SUB_LLP_POS = 31;
|
|
const int LIST_LAST_LBID_POS = 30;
|
|
const int LIST_BLOCK_LLP_POS = 1023;
|
|
const int MAX_BLOCK_ENTRY = 1024;
|
|
const int MAX_SUB_RID_CNT = 30;
|
|
const int MAX_BLK_RID_CNT = 1023;
|
|
const int MAX_BLK_NARRAY_RID_CNT = 1018;
|
|
const int LBID_SBID_ENTRY = 46;
|
|
const int RID_COUNT_SIZE = 10;
|
|
const int CUR_BLK_POS_WIDTH = 2;
|
|
const int LLP_STATUS_WIDTH = 2;
|
|
const int LIST_ENTRY_WIDTH = 8;
|
|
const int LIST_BLK_LLP_ENTRY_WIDTH = 48;
|
|
const int BEGIN_LIST_BLK_LLP_POS = 1018;
|
|
const int NEXT_BLK_PTR_OFFSET = 5;
|
|
const int PARENT_PTR_OFFSET = 4;
|
|
const int TOTAL_NUM_ARRAY_PTR = 4;
|
|
const int ARRAY_LLP_EXIST = 1;
|
|
const int LLP_NOT_FULL = 0;
|
|
const int LLP_FULL = 1;
|
|
const int TOTAL_CUR_LEVEL = 10;
|
|
const int CUR_LEVEL_POS_WIDTH = 20;
|
|
const uint64_t INVALID_KEY = -1LL; /** @brief Invalid number */
|
|
|
|
/*****************************************************
|
|
* mask definition
|
|
******************************************************/
|
|
const int BIT_MASK_ARRAY[] = {
|
|
0x0, 0x01, /** @brief 1 bit mask */
|
|
0x03, /** @brief 2 bit mask */
|
|
0x07, /** @brief 3 bit mask */
|
|
0x0F, /** @brief 4 bit mask */
|
|
0x1F, /** @brief 5 bit mask */
|
|
0x3F /** @brief 6 bit mask */
|
|
};
|
|
|
|
/************************************************************************
|
|
* Type enumerations
|
|
************************************************************************/
|
|
enum IdxTreeEntryType /** @brief Index tree entry types */
|
|
{
|
|
EMPTY_ENTRY = 0, /** @brief Empty entry */
|
|
UNIQUE_VAL = 7, /** @brief Unique value */
|
|
EMPTY_LIST = 1, /** @brief Empty list pointer entry */
|
|
EMPTY_PTR = 2, /** @brief Empty pointer entry */
|
|
BIT_TEST = 3, /** @brief Bit test entry */
|
|
LEAF_LIST = 4, /** @brief Leaf list pointer */
|
|
BITMAP_PTR = 5, /** @brief Bitmap pointer */
|
|
// SORT_LIST = 5, /** @brief Sorted list pointer */
|
|
MULTI_COL = 6 /** @brief Multi-column index pointer */
|
|
};
|
|
|
|
enum IdxTreeGroupType /** @brief Index tree group types */
|
|
{
|
|
ENTRY_1 = 0, /** @brief 1 entry per group */
|
|
ENTRY_2 = 1, /** @brief 2 entry per group */
|
|
ENTRY_4 = 2, /** @brief 4 entry per group */
|
|
ENTRY_8 = 3, /** @brief 8 entry per group */
|
|
ENTRY_16 = 4, /** @brief 16 entry per group */
|
|
ENTRY_32 = 5, /** @brief 32 entry per group */
|
|
ENTRY_BLK = 6 /** @brief 1k entry per group */
|
|
};
|
|
|
|
enum IdxBitCompareType /** @brief Index bit compare types */
|
|
{
|
|
BIT_5 = 0, /** @brief 5-bit compare */
|
|
BIT_10 = 1 /** @brief 10-bit compare */
|
|
};
|
|
|
|
enum IdxFreeMgrType /** @brief Index free manager types */
|
|
{
|
|
TREE = 0, /** @brief Index tree type */
|
|
LIST = 1 /** @brief Index list type */
|
|
};
|
|
|
|
/************************************************************************
|
|
* @brief index defintions
|
|
************************************************************************/
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 12; /** @brief spare bits */
|
|
uint64_t group : IDX_GROUP_SIZE; /** @brief entry group type */
|
|
// The following is related to ptr
|
|
uint64_t fbo : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxStartSubBlockEntry; /** @brief Index start block entry structure */
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 2; /** @brief spare bits */
|
|
uint64_t group : IDX_GROUP_SIZE; /** @brief entry group type */
|
|
// The following is related to ptr
|
|
uint64_t spare2 : 10; /** @brief spare bits */
|
|
uint64_t fbo : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxEmptyListEntry; /** @brief Index empty list entry structure */
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 15; /** @brief spare bits */
|
|
// The following is related to ptr
|
|
uint64_t fbo : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxBitmapPointerEntry; /** @brief Index bitmap pointer entry structure */
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t bitTest : IDX_BITTEST_SIZE; /** @brief index bittest */
|
|
uint64_t group : IDX_GROUP_SIZE; /** @brief entry group type */
|
|
uint64_t bitCompare : 1;
|
|
uint64_t spare : 1; /** @brief spare bits */
|
|
// The following is related to ptr
|
|
uint64_t fbo : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxBitTestEntry; /** @brief Index bit test entry structure */
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 15; /** @brief spare bits */
|
|
// The following is related to ptr
|
|
uint64_t fbo : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxTreePointerEntry; /** @brief Index tree pointer entry structure */
|
|
/************************************************************************
|
|
* @brief index list node defintions
|
|
************************************************************************/
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type 3 */
|
|
uint64_t spare : 15; /** @brief spare bits */
|
|
RID rid : RID_SIZE; /** @brief row id */
|
|
} IdxRidListEntry; /** @brief Index rid list entry structure */
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 5;
|
|
uint64_t count : RID_COUNT_SIZE; /** the count of rids on the current blk */
|
|
uint64_t llp : LBID_SBID_ENTRY; /** @brief size */
|
|
} IdxRidListPtr;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 5;
|
|
uint64_t count : RID_COUNT_SIZE; /** the count of rids on the current blk */
|
|
uint64_t lbid : FBO_SIZE; /** @brief size */
|
|
uint64_t sbid : SBID_SIZE; /** @brief sub block id */
|
|
uint64_t entry : ENTRY_SIZE; /** @brief entry within sub block */
|
|
} IdxRidLastListPtr;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 13;
|
|
uint64_t llpStat : LLP_STATUS_WIDTH; /** llp status */
|
|
uint64_t childLbid : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t spare2 : 10;
|
|
} IdxRidChildListPtr;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type 0 or 6 */
|
|
uint64_t spare : 5;
|
|
uint64_t count : RID_COUNT_SIZE; /** the count of rids on the current blk */
|
|
uint64_t nextLbid : FBO_SIZE; /** @brief file block offset */
|
|
uint64_t curLevel : TOTAL_CUR_LEVEL;
|
|
} IdxRidNextListPtr;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type 6*/
|
|
uint64_t spare : 3; /** @brief spare bits */
|
|
uint64_t curLevelPos : CUR_LEVEL_POS_WIDTH;
|
|
uint64_t curBlkPos : CUR_BLK_POS_WIDTH; /** the position of current blk */
|
|
uint64_t parentLbid : FBO_SIZE; /** @brief file block offset */
|
|
} IdxRidParentListPtr;
|
|
|
|
typedef struct
|
|
{
|
|
IdxRidChildListPtr childIdxRidListPtr[4];
|
|
IdxRidParentListPtr parentIdxListPtr;
|
|
IdxRidNextListPtr nextIdxListPtr;
|
|
} IdxRidListArrayPtr;
|
|
|
|
/************************************************************************
|
|
* @brief index list header defintions
|
|
************************************************************************/
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 15; /** @brief spare bits */
|
|
uint64_t size : RID_SIZE; /** @brief size */
|
|
} IdxRidListHdrSize;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t type : IDX_TYPE_SIZE; /** @brief entry type */
|
|
uint64_t spare : 15; /** @brief spare bits */
|
|
uint64_t llp : RID_SIZE; /** @brief size */
|
|
} IdxRidListHdrPtr;
|
|
|
|
typedef struct
|
|
{
|
|
IdxRidListHdrSize idxRidListSize;
|
|
uint64_t key;
|
|
IdxRidListEntry firstIdxRidListEntry;
|
|
IdxRidListHdrPtr nextIdxRidListPtr;
|
|
} IdxRidListHdr;
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t part1 : 15; /** @brief entry type */
|
|
uint64_t part2 : 15; /** @brief spare bits */
|
|
uint64_t spare : 34; /** @brief size */
|
|
} IdxRidListOffSet;
|
|
/************************************************************************
|
|
* @brief index tree node defintions
|
|
************************************************************************/
|
|
typedef struct
|
|
{
|
|
IdxBitTestEntry next; /** @brief next in the node */
|
|
IdxBitTestEntry current; /** @brief current addr */
|
|
uint16_t level; /** @brief tree level */
|
|
uint16_t allocCount; /** @brief allocated entry cound from free mgr */
|
|
uint16_t useCount; /** @brief actual use entry count */
|
|
uint16_t offset; /** @brief entry offset */
|
|
bool used; /** @brief used flag */
|
|
} IdxTreeNode; /** @brief Index tree node */
|
|
|
|
typedef struct
|
|
{
|
|
IdxTreeNode node[IDX_MAX_TREE_LEVEL]; /** @brief node array */
|
|
uint16_t maxLevel; /** @brief max level */
|
|
RID rid; /** @brief current row id */
|
|
uint64_t key; /** @brief current key */
|
|
uint16_t width; /** @brief current width */
|
|
} IdxTree; /** @brief Index tree */
|
|
|
|
struct IdxTreeCacheNode
|
|
{
|
|
RID rid; /** @brief RID */
|
|
uint64_t key; /** @brief Key */
|
|
IdxEmptyListEntry entry; /** @brief List pointer */
|
|
bool used; /** @brief Used flag */
|
|
IdxTreeCacheNode()
|
|
{
|
|
used = false;
|
|
}
|
|
};
|
|
|
|
struct IdxMultiColKey
|
|
{
|
|
std::bitset<IDX_MAX_MULTI_COL_BIT> bitSet; /** @brief BitArray for all bits */
|
|
std::bitset<IDX_MAX_MULTI_COL_BIT> curBitset; /** @brief Current working column */
|
|
std::bitset<IDX_MAX_MULTI_COL_BIT> curMask; /** @brief Current bitset mask */
|
|
unsigned char keyBuf[IDX_MAX_MULTI_COL_BIT / 8]; /** @brief Key buffer */
|
|
int curLevel; /** @brief Current index level */
|
|
int maxLevel; /** @brief Maximum index level */
|
|
int totalBit; /** @brief Total bits */
|
|
int testbitArray[IDX_MAX_MULTI_COL_IDX_LEVEL]; /** @brief Test bit array */
|
|
void clear()
|
|
{
|
|
bitSet.reset();
|
|
curBitset.reset();
|
|
curMask.reset();
|
|
curLevel = maxLevel = 0;
|
|
totalBit = 0;
|
|
memset(testbitArray, 0, IDX_MAX_MULTI_COL_IDX_LEVEL * sizeof(testbitArray[0]));
|
|
memset(keyBuf, 0, IDX_MAX_MULTI_COL_BIT / 8);
|
|
curMask = 0x1F;
|
|
curMask = curMask << (IDX_MAX_MULTI_COL_BIT - 5);
|
|
}
|
|
IdxMultiColKey()
|
|
{
|
|
clear();
|
|
}
|
|
};
|
|
struct IdxMultiRid
|
|
{
|
|
RID* ridArray; /** @brief RID array */
|
|
int totalRid; /** @brief Total number of row id */
|
|
IdxMultiRid()
|
|
{
|
|
totalRid = 0;
|
|
ridArray = NULL;
|
|
}
|
|
void setMultiRid(RID* rids, const int size)
|
|
{
|
|
totalRid = size;
|
|
ridArray = rids;
|
|
/* ridArray = new RID[size];
|
|
memcpy( ridArray, rids, size * sizeof( RID ) ); */
|
|
}
|
|
void clearMultiRid()
|
|
{ /*if( ridArray != NULL ) delete [] ridArray; ridArray = NULL;*/
|
|
} // we don't want to get into this mem business
|
|
};
|
|
|
|
struct IdxLoadParam
|
|
{
|
|
File sourceFile; /** @brief Source file contatin values */
|
|
|
|
OID indexTreeOid; /** @brief Target index tree oid */
|
|
OID indexListOid; /** @brief Target index list oid */
|
|
execplan::CalpontSystemCatalog::ColDataType indexColDataType; /** @brief Target index column type */
|
|
int indexWidth; /** @brief Target index width */
|
|
|
|
int maxLoadRow; /** @brief Max rows for one load */
|
|
|
|
void setIdxLoadParam(const OID treeOid, const OID listOid,
|
|
const execplan::CalpontSystemCatalog::ColDataType colDataType, const int width,
|
|
const int maxRow)
|
|
{
|
|
indexTreeOid = treeOid;
|
|
indexListOid = listOid;
|
|
indexColDataType = colDataType;
|
|
indexWidth = width;
|
|
maxLoadRow = maxRow;
|
|
}
|
|
bool isValid()
|
|
{
|
|
return indexTreeOid && indexListOid && indexWidth && maxLoadRow;
|
|
}
|
|
IdxLoadParam()
|
|
{
|
|
indexTreeOid = indexListOid = indexWidth = maxLoadRow = 0;
|
|
}
|
|
};
|
|
|
|
} // namespace WriteEngine
|