提交 1c89972f 编写于 作者: H Haojun Liao

fix(query): add multiple blockdata structure.

上级 957550c4
...@@ -24,7 +24,8 @@ typedef struct SLDataIter { ...@@ -24,7 +24,8 @@ typedef struct SLDataIter {
int8_t backward; int8_t backward;
SArray *aSstBlk; SArray *aSstBlk;
int32_t iSstBlk; int32_t iSstBlk;
SBlockData bData; SBlockData bData[2];
int32_t loadIndex;
int32_t iRow; int32_t iRow;
SRowInfo rInfo; SRowInfo rInfo;
uint64_t uid; uint64_t uid;
...@@ -32,6 +33,15 @@ typedef struct SLDataIter { ...@@ -32,6 +33,15 @@ typedef struct SLDataIter {
SVersionRange verRange; SVersionRange verRange;
} SLDataIter; } SLDataIter;
static SBlockData* getCurrentBlock(SLDataIter* pIter) {
return &pIter->bData[pIter->loadIndex];
}
static SBlockData* getNextBlock(SLDataIter* pIter) {
pIter->loadIndex ^= 1;
return getCurrentBlock(pIter);
}
int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t iSst, int8_t backward, uint64_t uid, int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t iSst, int8_t backward, uint64_t uid,
STimeWindow *pTimeWindow, SVersionRange *pRange) { STimeWindow *pTimeWindow, SVersionRange *pRange) {
int32_t code = 0; int32_t code = 0;
...@@ -53,7 +63,12 @@ int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t ...@@ -53,7 +63,12 @@ int32_t tLDataIterOpen(struct SLDataIter **pIter, SDataFReader *pReader, int32_t
goto _exit; goto _exit;
} }
code = tBlockDataCreate(&(*pIter)->bData); code = tBlockDataCreate(&(*pIter)->bData[0]);
if (code) {
goto _exit;
}
code = tBlockDataCreate(&(*pIter)->bData[1]);
if (code) { if (code) {
goto _exit; goto _exit;
} }
...@@ -95,7 +110,8 @@ _exit: ...@@ -95,7 +110,8 @@ _exit:
} }
void tLDataIterClose(SLDataIter *pIter) { void tLDataIterClose(SLDataIter *pIter) {
tBlockDataDestroy(&pIter->bData, 1); tBlockDataDestroy(&pIter->bData[0], 1);
tBlockDataDestroy(&pIter->bData[1], 1);
taosArrayDestroy(pIter->aSstBlk); taosArrayDestroy(pIter->aSstBlk);
taosMemoryFree(pIter); taosMemoryFree(pIter);
} }
...@@ -136,24 +152,26 @@ static void findNextValidRow(SLDataIter *pIter) { ...@@ -136,24 +152,26 @@ static void findNextValidRow(SLDataIter *pIter) {
bool hasVal = false; bool hasVal = false;
int32_t i = pIter->iRow; int32_t i = pIter->iRow;
for (; i < pIter->bData.nRow && i >= 0; i += step) { SBlockData* pBlockData = getCurrentBlock(pIter);
if (pIter->bData.aUid != NULL) {
for (; i < pBlockData->nRow && i >= 0; i += step) {
if (pBlockData->aUid != NULL) {
if (!pIter->backward) { if (!pIter->backward) {
if (pIter->bData.aUid[i] < pIter->uid) { if (pBlockData->aUid[i] < pIter->uid) {
continue; continue;
} else if (pIter->bData.aUid[i] > pIter->uid) { } else if (pBlockData->aUid[i] > pIter->uid) {
break; break;
} }
} else { } else {
if (pIter->bData.aUid[i] > pIter->uid) { if (pBlockData->aUid[i] > pIter->uid) {
continue; continue;
} else if (pIter->bData.aUid[i] < pIter->uid) { } else if (pBlockData->aUid[i] < pIter->uid) {
break; break;
} }
} }
} }
int64_t ts = pIter->bData.aTSKEY[i]; int64_t ts = pBlockData->aTSKEY[i];
if (!pIter->backward) { // asc if (!pIter->backward) { // asc
if (ts > pIter->timeWindow.ekey) { // no more data if (ts > pIter->timeWindow.ekey) { // no more data
break; break;
...@@ -168,7 +186,7 @@ static void findNextValidRow(SLDataIter *pIter) { ...@@ -168,7 +186,7 @@ static void findNextValidRow(SLDataIter *pIter) {
} }
} }
int64_t ver = pIter->bData.aVersion[i]; int64_t ver = pBlockData->aVersion[i];
if (ver < pIter->verRange.minVer) { if (ver < pIter->verRange.minVer) {
continue; continue;
} }
...@@ -203,14 +221,16 @@ bool tLDataIterNextRow(SLDataIter *pIter) { ...@@ -203,14 +221,16 @@ bool tLDataIterNextRow(SLDataIter *pIter) {
} }
int32_t iBlockL = pIter->iSstBlk; int32_t iBlockL = pIter->iSstBlk;
SBlockData* pBlockData = getCurrentBlock(pIter);
if (pIter->bData.nRow == 0 && pIter->pSstBlk != NULL) { // current block not loaded yet if (pBlockData->nRow == 0 && pIter->pSstBlk != NULL) { // current block not loaded yet
code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, &pIter->bData); pBlockData = getNextBlock(pIter);
code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, pBlockData);
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
goto _exit; goto _exit;
} }
pIter->iRow = (pIter->backward) ? pIter->bData.nRow : -1; pIter->iRow = (pIter->backward) ? pBlockData->nRow : -1;
} }
pIter->iRow += step; pIter->iRow += step;
...@@ -218,7 +238,7 @@ bool tLDataIterNextRow(SLDataIter *pIter) { ...@@ -218,7 +238,7 @@ bool tLDataIterNextRow(SLDataIter *pIter) {
while (1) { while (1) {
findNextValidRow(pIter); findNextValidRow(pIter);
if (pIter->iRow >= pIter->bData.nRow || pIter->iRow < 0) { if (pIter->iRow >= pBlockData->nRow || pIter->iRow < 0) {
tLDataIterNextBlock(pIter); tLDataIterNextBlock(pIter);
if (pIter->pSstBlk == NULL) { // no more data if (pIter->pSstBlk == NULL) { // no more data
goto _exit; goto _exit;
...@@ -228,17 +248,18 @@ bool tLDataIterNextRow(SLDataIter *pIter) { ...@@ -228,17 +248,18 @@ bool tLDataIterNextRow(SLDataIter *pIter) {
} }
if (iBlockL != pIter->iSstBlk) { if (iBlockL != pIter->iSstBlk) {
code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, &pIter->bData); pBlockData = getNextBlock(pIter);
code = tsdbReadSstBlockEx(pIter->pReader, pIter->iSst, pIter->pSstBlk, pBlockData);
if (code) { if (code) {
goto _exit; goto _exit;
} }
pIter->iRow = pIter->backward ? (pIter->bData.nRow - 1) : 0; pIter->iRow = pIter->backward ? (pBlockData->nRow - 1) : 0;
} }
} }
pIter->rInfo.suid = pIter->bData.suid; pIter->rInfo.suid = pBlockData->suid;
pIter->rInfo.uid = pIter->bData.uid; pIter->rInfo.uid = pBlockData->uid;
pIter->rInfo.row = tsdbRowFromBlockData(&pIter->bData, pIter->iRow); pIter->rInfo.row = tsdbRowFromBlockData(pBlockData, pIter->iRow);
_exit: _exit:
if (code != TSDB_CODE_SUCCESS) { if (code != TSDB_CODE_SUCCESS) {
...@@ -322,7 +343,7 @@ bool tMergeTreeNext(SMergeTree *pMTree) { ...@@ -322,7 +343,7 @@ bool tMergeTreeNext(SMergeTree *pMTree) {
// compare with min in RB Tree // compare with min in RB Tree
pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt); pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt);
if (pMTree->pIter && pIter) { if (pMTree->pIter && pIter) {
int32_t c = pMTree->rbt.cmprFn(pMTree->pIter->node.payload, &pIter->node.payload); int32_t c = pMTree->rbt.cmprFn(pMTree->pIter->node.payload, pIter->node.payload);
if (c > 0) { if (c > 0) {
tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter); tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter);
pMTree->pIter = NULL; pMTree->pIter = NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册