fix(query): set fetch block info.
This commit is contained in:
parent
2c896012df
commit
407a3453ca
|
@ -95,17 +95,20 @@ typedef struct SColMatchInfo {
|
||||||
int32_t matchType; // determinate the source according to col id or slot id
|
int32_t matchType; // determinate the source according to col id or slot id
|
||||||
} SColMatchInfo;
|
} SColMatchInfo;
|
||||||
|
|
||||||
|
// If the numOfOutputGroups is 1, the data blocks that belongs to different groups will be provided randomly
|
||||||
|
// The numOfOutputGroups is specified by physical plan. and will not be affect by numOfGroups
|
||||||
typedef struct STableListInfo {
|
typedef struct STableListInfo {
|
||||||
bool oneTableForEachGroup;
|
bool oneTableForEachGroup;
|
||||||
int32_t numOfGroups;
|
int32_t numOfOuputGroups; // the data block will be generated one by one
|
||||||
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
||||||
SArray* pTableList;
|
SArray* pTableList;
|
||||||
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
||||||
uint64_t suid;
|
uint64_t suid;
|
||||||
} STableListInfo;
|
} STableListInfo;
|
||||||
|
|
||||||
void destroyTableList(STableListInfo* pTableList);
|
void destroyTableList(STableListInfo* pTableList);
|
||||||
int32_t getNumOfGroups(const STableListInfo* pTableList);
|
int32_t getNumOfOutputGroups(const STableListInfo* pTableList);
|
||||||
|
bool oneTableForEachGroup(const STableListInfo* pTableList);
|
||||||
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid);
|
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid);
|
||||||
int32_t addTableIntoTableList(STableListInfo* pTableList, uint64_t uid, uint64_t gid);
|
int32_t addTableIntoTableList(STableListInfo* pTableList, uint64_t uid, uint64_t gid);
|
||||||
int32_t getTablesOfGroup(const STableListInfo* pTableList, int32_t ordinalIndex, STableKeyInfo** pKeyInfo, int32_t* num);
|
int32_t getTablesOfGroup(const STableListInfo* pTableList, int32_t ordinalIndex, STableKeyInfo** pKeyInfo, int32_t* num);
|
||||||
|
|
|
@ -62,7 +62,7 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
||||||
pInfo->pUidList = taosArrayInit(4, sizeof(int64_t));
|
pInfo->pUidList = taosArrayInit(4, sizeof(int64_t));
|
||||||
|
|
||||||
// partition by tbname, todo opt perf
|
// partition by tbname, todo opt perf
|
||||||
if (getNumOfGroups(pTableList) == getTotalTables(pTableList)) {
|
if (oneTableForEachGroup(pTableList)) {
|
||||||
pInfo->retrieveType =
|
pInfo->retrieveType =
|
||||||
CACHESCAN_RETRIEVE_TYPE_ALL | (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
|
CACHESCAN_RETRIEVE_TYPE_ALL | (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
size_t totalGroups = getNumOfGroups(pTableList);
|
size_t totalGroups = getNumOfOutputGroups(pTableList);
|
||||||
|
|
||||||
while (pInfo->currentGroupIndex < totalGroups) {
|
while (pInfo->currentGroupIndex < totalGroups) {
|
||||||
|
|
||||||
|
|
|
@ -1665,6 +1665,11 @@ uint64_t getTotalTables(const STableListInfo* pTableList) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid) {
|
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid) {
|
||||||
|
if (pTableList->oneTableForEachGroup) {
|
||||||
|
ASSERT(pTableList->map == NULL);
|
||||||
|
return tableUid;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t* groupId = taosHashGet(pTableList->map, &tableUid, sizeof(tableUid));
|
uint64_t* groupId = taosHashGet(pTableList->map, &tableUid, sizeof(tableUid));
|
||||||
if (groupId != NULL) {
|
if (groupId != NULL) {
|
||||||
return *groupId;
|
return *groupId;
|
||||||
|
@ -1677,25 +1682,25 @@ int32_t addTableIntoTableList(STableListInfo* pTableList, uint64_t uid, uint64_t
|
||||||
STableKeyInfo keyInfo = {.uid = uid, .groupId = gid};
|
STableKeyInfo keyInfo = {.uid = uid, .groupId = gid};
|
||||||
|
|
||||||
taosArrayPush(pTableList->pTableList, &keyInfo);
|
taosArrayPush(pTableList->pTableList, &keyInfo);
|
||||||
if (pTableList->oneTableForEachGroup || pTableList->numOfGroups > 1) {
|
if (pTableList->oneTableForEachGroup || pTableList->numOfOuputGroups > 1) {
|
||||||
taosHashPut(pTableList->map, &uid, sizeof(uid), &keyInfo.groupId, sizeof(keyInfo.groupId));
|
taosHashPut(pTableList->map, &uid, sizeof(uid), &keyInfo.groupId, sizeof(keyInfo.groupId));
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getTablesOfGroup(const STableListInfo* pTableList, int32_t ordinalGroupIndex, STableKeyInfo** pKeyInfo, int32_t* size) {
|
int32_t getTablesOfGroup(const STableListInfo* pTableList, int32_t ordinalGroupIndex, STableKeyInfo** pKeyInfo, int32_t* size) {
|
||||||
int32_t total = getNumOfGroups(pTableList);
|
int32_t total = getNumOfOutputGroups(pTableList);
|
||||||
if (ordinalGroupIndex < 0 || ordinalGroupIndex >= total) {
|
if (ordinalGroupIndex < 0 || ordinalGroupIndex >= total) {
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
// here handle two special cases:
|
// here handle two special cases:
|
||||||
// 1. only one group exists, and 2. one table exists for each group.
|
// 1. only one group exists, and 2. one table exists for each group.
|
||||||
if (pTableList->numOfGroups == 1) {
|
if (total == 1) {
|
||||||
*size = getTotalTables(pTableList);
|
*size = getTotalTables(pTableList);
|
||||||
*pKeyInfo = taosArrayGet(pTableList->pTableList, 0);
|
*pKeyInfo = taosArrayGet(pTableList->pTableList, 0);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else if (pTableList->numOfGroups == getTotalTables(pTableList)) {
|
} else if (total == getTotalTables(pTableList)) {
|
||||||
*size = 1;
|
*size = 1;
|
||||||
*pKeyInfo = taosArrayGet(pTableList->pTableList, ordinalGroupIndex);
|
*pKeyInfo = taosArrayGet(pTableList->pTableList, ordinalGroupIndex);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1712,8 +1717,12 @@ int32_t getTablesOfGroup(const STableListInfo* pTableList, int32_t ordinalGroupI
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getNumOfGroups(const STableListInfo* pTableList) {
|
int32_t getNumOfOutputGroups(const STableListInfo* pTableList) {
|
||||||
return pTableList->numOfGroups;
|
return pTableList->numOfOuputGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool oneTableForEachGroup(const STableListInfo* pTableList) {
|
||||||
|
return pTableList->oneTableForEachGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyTableList(STableListInfo* pTableqinfoList) {
|
void destroyTableList(STableListInfo* pTableqinfoList) {
|
||||||
|
|
|
@ -3397,9 +3397,9 @@ static int32_t sortTableGroup(STableListInfo* pTableListInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableListInfo->numOfGroups = taosArrayGetSize(pList);
|
pTableListInfo->numOfOuputGroups = taosArrayGetSize(pList);
|
||||||
pTableListInfo->groupOffset = taosMemoryMalloc(sizeof(int32_t) * pTableListInfo->numOfGroups);
|
pTableListInfo->groupOffset = taosMemoryMalloc(sizeof(int32_t) * pTableListInfo->numOfOuputGroups);
|
||||||
memcpy(pTableListInfo->groupOffset, taosArrayGet(pList, 0), sizeof(int32_t) * pTableListInfo->numOfGroups);
|
memcpy(pTableListInfo->groupOffset, taosArrayGet(pList, 0), sizeof(int32_t) * pTableListInfo->numOfOuputGroups);
|
||||||
taosArrayDestroy(pList);
|
taosArrayDestroy(pList);
|
||||||
|
|
||||||
# if 0
|
# if 0
|
||||||
|
@ -3490,13 +3490,15 @@ bool groupbyTbname(SNodeList* pGroupList) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* group, bool groupSort) {
|
int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* group, bool groupSort) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (group == NULL) {
|
if (group == NULL) {
|
||||||
return TDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableListInfo->map = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
|
pTableListInfo->map = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
|
||||||
if (pTableListInfo->map == NULL) {
|
if (pTableListInfo->map == NULL) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool assignUid = groupbyTbname(group);
|
bool assignUid = groupbyTbname(group);
|
||||||
|
@ -3508,21 +3510,23 @@ int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle,
|
||||||
info->groupId = info->uid;
|
info->groupId = info->uid;
|
||||||
taosHashPut(pTableListInfo->map, &(info->uid), sizeof(uint64_t), &info->groupId, sizeof(uint64_t));
|
taosHashPut(pTableListInfo->map, &(info->uid), sizeof(uint64_t), &info->groupId, sizeof(uint64_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableListInfo->oneTableForEachGroup = true;
|
pTableListInfo->oneTableForEachGroup = true;
|
||||||
pTableListInfo->numOfGroups = numOfTables;
|
if (groupSort) {
|
||||||
|
pTableListInfo->numOfOuputGroups = numOfTables;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int32_t code = getColInfoResultForGroupby(pHandle->meta, group, pTableListInfo);
|
code = getColInfoResultForGroupby(pHandle->meta, group, pTableListInfo);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (groupSort) {
|
if (groupSort) {
|
||||||
return sortTableGroup(pTableListInfo);
|
code = sortTableGroup(pTableListInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("-------------------, %d", (int) taosHashGetSize(pTableListInfo->map));
|
return code;
|
||||||
return TDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
|
static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pCond) {
|
||||||
|
|
|
@ -746,7 +746,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
} else { // scan table group by group sequentially
|
} else { // scan table group by group sequentially
|
||||||
if (pInfo->currentGroupId == -1) {
|
if (pInfo->currentGroupId == -1) {
|
||||||
if ((++pInfo->currentGroupId) >= getNumOfGroups(&pTaskInfo->tableqinfoList)) {
|
if ((++pInfo->currentGroupId) >= getNumOfOutputGroups(&pTaskInfo->tableqinfoList)) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -768,7 +768,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((++pInfo->currentGroupId) >= getNumOfGroups(&pTaskInfo->tableqinfoList)) {
|
if ((++pInfo->currentGroupId) >= getNumOfOutputGroups(&pTaskInfo->tableqinfoList)) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1094,7 +1094,9 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
|
||||||
cond.twindows = (STimeWindow){.skey = startTs, .ekey = endTs};
|
cond.twindows = (STimeWindow){.skey = startTs, .ekey = endTs};
|
||||||
|
|
||||||
SExecTaskInfo* pTaskInfo = pTableScanOp->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pTableScanOp->pTaskInfo;
|
||||||
blockDataCleanup(pTableScanInfo->pResBlock);
|
|
||||||
|
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
||||||
|
blockDataCleanup(pBlock);
|
||||||
|
|
||||||
STsdbReader* pReader = NULL;
|
STsdbReader* pReader = NULL;
|
||||||
int32_t code = tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &cond, &tblInfo, 1, (STsdbReader**)&pReader,
|
int32_t code = tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &cond, &tblInfo, 1, (STsdbReader**)&pReader,
|
||||||
|
@ -1106,14 +1108,25 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
|
||||||
|
|
||||||
bool hasBlock = tsdbNextDataBlock(pReader);
|
bool hasBlock = tsdbNextDataBlock(pReader);
|
||||||
if (hasBlock) {
|
if (hasBlock) {
|
||||||
SArray* pCols = tsdbRetrieveDataBlock(pTableScanInfo->dataReader, NULL);
|
SDataBlockInfo binfo = {0};
|
||||||
relocateColumnData(pTableScanInfo->pResBlock, pTableScanInfo->matchInfo.pList, pCols, true);
|
tsdbRetrieveDataBlockInfo(pReader, &binfo);
|
||||||
doSetTagColumnData(pTableScanInfo, pTableScanInfo->pResBlock, pTaskInfo);
|
|
||||||
|
SArray* pCols = tsdbRetrieveDataBlock(pReader, NULL);
|
||||||
|
blockDataEnsureCapacity(pBlock, binfo.rows);
|
||||||
|
|
||||||
|
pBlock->info.window = binfo.window;
|
||||||
|
pBlock->info.uid = binfo.uid;
|
||||||
|
pBlock->info.rows = binfo.rows;
|
||||||
|
|
||||||
|
relocateColumnData(pBlock, pTableScanInfo->matchInfo.pList, pCols, true);
|
||||||
|
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbReaderClose(pReader);
|
tsdbReaderClose(pReader);
|
||||||
|
qDebug("retrieve prev rows:%d, skey:%" PRId64 ", ekey:%" PRId64 " uid:%" PRIu64 ", max ver:%" PRId64
|
||||||
|
", suid:%" PRIu64, pBlock->info.rows, startTs, endTs, tbUid, maxVersion, cond.suid);
|
||||||
|
|
||||||
return pTableScanInfo->pResBlock->info.rows > 0? pTableScanInfo->pResBlock:NULL;
|
return pBlock->info.rows > 0 ? pBlock : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t getGroupIdByCol(SStreamScanInfo* pInfo, uint64_t uid, TSKEY ts, int64_t maxVersion) {
|
static uint64_t getGroupIdByCol(SStreamScanInfo* pInfo, uint64_t uid, TSKEY ts, int64_t maxVersion) {
|
||||||
|
@ -2371,7 +2384,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
// set the extract column id to streamHandle
|
// set the extract column id to streamHandle
|
||||||
tqReaderSetColIdList(pInfo->tqReader, pColIds);
|
tqReaderSetColIdList(pInfo->tqReader, pColIds);
|
||||||
SArray* tableIdList = extractTableIdList(&pTaskInfo->tableqinfoList);
|
SArray* tableIdList = extractTableIdList(&pTaskInfo->tableqinfoList);
|
||||||
int32_t code = tqReaderSetTbUidList(pInfo->tqReader, tableIdList);
|
code = tqReaderSetTbUidList(pInfo->tqReader, tableIdList);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
taosArrayDestroy(tableIdList);
|
taosArrayDestroy(tableIdList);
|
||||||
goto _error;
|
goto _error;
|
||||||
|
@ -4152,7 +4165,7 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableListInfo->numOfGroups = 1;
|
pTableListInfo->numOfOuputGroups = 1;
|
||||||
code = generateGroupIdMap(pTableListInfo, pHandle, pGroupTags, groupSort);
|
code = generateGroupIdMap(pTableListInfo, pHandle, pGroupTags, groupSort);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -654,6 +654,7 @@ SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pData
|
||||||
colDataAssign(pDst, pSrc, p->info.rows, &pDataBlock->info);
|
colDataAssign(pDst, pSrc, p->info.rows, &pDataBlock->info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pInfo->limitInfo.numOfOutputRows += p->info.rows;
|
||||||
pDataBlock->info.rows = p->info.rows;
|
pDataBlock->info.rows = p->info.rows;
|
||||||
pDataBlock->info.groupId = pInfo->groupId;
|
pDataBlock->info.groupId = pInfo->groupId;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue