more code
This commit is contained in:
parent
beab5f1fe3
commit
c3304c48bf
|
@ -30,7 +30,8 @@ typedef struct {
|
||||||
} SLDataIter;
|
} SLDataIter;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SRBTree tMerge;
|
SRBTreeNode *pNode;
|
||||||
|
SRBTree rbt;
|
||||||
} SDataMerger;
|
} SDataMerger;
|
||||||
|
|
||||||
static int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
|
static int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
|
||||||
|
@ -52,13 +53,59 @@ static int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
|
||||||
return tsdbRowCmprFn(&pInfo1->row, &pInfo2->row);
|
return tsdbRowCmprFn(&pInfo1->row, &pInfo2->row);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SRowInfo *tDataMergeNext(SDataMerger *pMerger) {
|
static int32_t tDataMergeNext(SDataMerger *pMerger, SRowInfo **ppInfo) {
|
||||||
SRowInfo *pRowInfo = NULL;
|
int32_t code = 0;
|
||||||
|
|
||||||
SRBTreeNode *pNode = pMerger->tMerge.minNode;
|
if (pMerger->pNode) {
|
||||||
if (pNode == NULL) return NULL;
|
// next current iter
|
||||||
|
SLDataIter *pIter = (SLDataIter *)pMerger->pNode->payload;
|
||||||
|
|
||||||
return pRowInfo;
|
pIter->iRow++;
|
||||||
|
if (pIter->iRow < pIter->bData.nRow) {
|
||||||
|
pIter->rowInfo.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow];
|
||||||
|
pIter->rowInfo.row = tsdbRowFromBlockData(&pIter->bData, pIter->iRow);
|
||||||
|
} else {
|
||||||
|
pIter->iBlockL++;
|
||||||
|
if (pIter->iBlockL < taosArrayGetSize(pIter->aBlockL)) {
|
||||||
|
code = tsdbReadLastBlock(NULL, (SBlockL *)taosArrayGet(pIter->aBlockL, pIter->iBlockL), &pIter->bData);
|
||||||
|
if (code) goto _exit;
|
||||||
|
|
||||||
|
pIter->iRow = 0;
|
||||||
|
pIter->rowInfo.suid = pIter->bData.suid;
|
||||||
|
pIter->rowInfo.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[0];
|
||||||
|
pIter->rowInfo.row = tsdbRowFromBlockData(&pIter->bData, 0);
|
||||||
|
} else {
|
||||||
|
pMerger->pNode = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMerger->pNode && pMerger->rbt.minNode) {
|
||||||
|
int32_t c = tRowInfoCmprFn(pMerger->pNode->payload, pMerger->rbt.minNode->payload);
|
||||||
|
if (c > 0) {
|
||||||
|
pMerger->pNode = tRBTreePut(&pMerger->rbt, pMerger->pNode);
|
||||||
|
ASSERT(pMerger->pNode);
|
||||||
|
pMerger->pNode = NULL;
|
||||||
|
} else {
|
||||||
|
ASSERT(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMerger->pNode == NULL) {
|
||||||
|
pMerger->pNode = pMerger->rbt.minNode;
|
||||||
|
if (pMerger->pNode) {
|
||||||
|
tRBTreeDrop(&pMerger->rbt, pMerger->pNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMerger->pNode) {
|
||||||
|
*ppInfo = &((SLDataIter *)pMerger->pNode->payload)[0].rowInfo;
|
||||||
|
} else {
|
||||||
|
*ppInfo = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================================================================
|
// ================================================================================
|
||||||
|
|
|
@ -210,6 +210,36 @@ void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// drop impl
|
// drop impl
|
||||||
|
if (pNode->left == NULL) {
|
||||||
|
// transplant right
|
||||||
|
if (pNode->parent == NULL) {
|
||||||
|
pTree->rootNode = pNode->right;
|
||||||
|
} else if (pNode == pNode->parent->left) {
|
||||||
|
pNode->parent->left = pNode->right;
|
||||||
|
} else {
|
||||||
|
pNode->parent->right = pNode->right;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNode->right) {
|
||||||
|
pNode->right->parent = pNode->parent;
|
||||||
|
}
|
||||||
|
} else if (pNode->right == NULL) {
|
||||||
|
// transplant left
|
||||||
|
if (pNode->parent == NULL) {
|
||||||
|
pTree->rootNode = pNode->left;
|
||||||
|
} else if (pNode == pNode->parent->left) {
|
||||||
|
pNode->parent->left = pNode->left;
|
||||||
|
} else {
|
||||||
|
pNode->parent->right = pNode->left;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pNode->left) {
|
||||||
|
pNode->left->parent = pNode->parent;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SRBTreeNode *y = tRBTreeSuccessor(pNode);
|
||||||
|
pNode->color = RBTREE_NODE_COLOR(y);
|
||||||
|
}
|
||||||
|
|
||||||
// fix
|
// fix
|
||||||
if (pNode->color == BLACK) {
|
if (pNode->color == BLACK) {
|
||||||
|
|
Loading…
Reference in New Issue