From f95c0013ef20b3905ef10fda97c8afb3a309805c Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Wed, 24 Aug 2022 17:29:28 +0800 Subject: [PATCH] more code --- include/util/trbtree.h | 56 +++++++++++++++++++++++++ source/dnode/vnode/src/inc/vnodeInt.h | 1 + source/dnode/vnode/src/tsdb/tsdbMerge.c | 14 +++++++ source/util/src/trbtree.c | 52 +++++++---------------- 4 files changed, 86 insertions(+), 37 deletions(-) create mode 100644 include/util/trbtree.h diff --git a/include/util/trbtree.h b/include/util/trbtree.h new file mode 100644 index 0000000000..17739b7977 --- /dev/null +++ b/include/util/trbtree.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "os.h" + +typedef struct SRBTree SRBTree; +typedef struct SRBTreeNode SRBTreeNode; +typedef struct SRBTreeIter SRBTreeIter; + +typedef int32_t (*tRBTreeCmprFn)(void *, void *); + +// SRBTree +#define tRBTreeCreate(compare) \ + (SRBTree) { .cmprFn = (compare), .root = NULL, .minNode = NULL, .maxNode = NULL } + +SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew); +void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode); +SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey); +SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey); + +// SRBTreeIter +#define tRBTreeIterCreate(tree) \ + (SRBTreeIter) { .pTree = (tree) } + +SRBTreeNode *tRBTreeIterNext(SRBTreeIter *pIter); + +struct SRBTreeNode { + enum { RED, BLACK } color; + SRBTreeNode *parent; + SRBTreeNode *left; + SRBTreeNode *right; + uint8_t payload[]; +}; + +struct SRBTree { + tRBTreeCmprFn cmprFn; + SRBTreeNode *rootNode; + SRBTreeNode *minNode; + SRBTreeNode *maxNode; +}; + +struct SRBTreeIter { + SRBTree *pTree; +}; diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 39c5f3873e..2de3b2b88b 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -36,6 +36,7 @@ #include "tlosertree.h" #include "tlrucache.h" #include "tmsgcb.h" +#include "trbtree.h" #include "tref.h" #include "tskiplist.h" #include "tstream.h" diff --git a/source/dnode/vnode/src/tsdb/tsdbMerge.c b/source/dnode/vnode/src/tsdb/tsdbMerge.c index e975abd482..34c883296e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMerge.c +++ b/source/dnode/vnode/src/tsdb/tsdbMerge.c @@ -28,6 +28,20 @@ typedef struct { int32_t iRow; } SLDataIter; +typedef struct { + SRBTree tMerge; +} SDataMerger; + +SRowInfo *tDataMergeNext(SDataMerger *pMerger) { + SRowInfo *pRowInfo = NULL; + + SRBTreeNode *pNode = pMerger->tMerge.minNode; + if (pNode == NULL) return NULL; + + return pRowInfo; +} + +// ================================================================================ typedef struct { STsdb *pTsdb; int8_t maxLast; diff --git a/source/util/src/trbtree.c b/source/util/src/trbtree.c index 0970485dad..e21dcacc37 100644 --- a/source/util/src/trbtree.c +++ b/source/util/src/trbtree.c @@ -13,30 +13,7 @@ * along with this program. If not, see . */ -#include "os.h" - -typedef int32_t (*tRBTreeCmprFn)(void *, void *); - -typedef struct SRBTree SRBTree; -typedef struct SRBTreeNode SRBTreeNode; -typedef struct SRBTreeIter SRBTreeIter; - -struct SRBTreeNode { - enum { RED, BLACK } color; - SRBTreeNode *parent; - SRBTreeNode *left; - SRBTreeNode *right; - uint8_t payload[]; -}; - -struct SRBTree { - tRBTreeCmprFn cmprFn; - SRBTreeNode *root; -}; - -struct SRBTreeIter { - SRBTree *pTree; -}; +#include "trbtree.h" #define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK) @@ -51,7 +28,7 @@ static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) { right->parent = pNode->parent; if (pNode->parent == NULL) { - pTree->root = right; + pTree->rootNode = right; } else if (pNode == pNode->parent->left) { pNode->parent->left = right; } else { @@ -72,7 +49,7 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) { left->parent = pNode->parent; if (pNode->parent == NULL) { - pTree->root = left; + pTree->rootNode = left; } else if (pNode == pNode->parent->left) { pNode->parent->left = left; } else { @@ -83,20 +60,17 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) { pNode->parent = left; } -#define tRBTreeCreate(compare) \ - (SRBTree) { .cmprFn = (compare), .root = NULL } - SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) { pNew->left = NULL; pNew->right = NULL; pNew->color = RED; // insert - if (pTree->root == NULL) { + if (pTree->rootNode == NULL) { pNew->parent = NULL; - pTree->root = pNew; + pTree->rootNode = pNew; } else { - SRBTreeNode *pNode = pTree->root; + SRBTreeNode *pNode = pTree->rootNode; while (true) { ASSERT(pNode); @@ -165,12 +139,16 @@ SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) { } } - pTree->root->color = BLACK; + pTree->rootNode->color = BLACK; return pNew; } -SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { - SRBTreeNode *pNode = pTree->root; +void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode) { + // TODO +} + +SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey) { + SRBTreeNode *pNode = pTree->rootNode; while (pNode) { int32_t c = pTree->cmprFn(pKey, pNode->payload); @@ -185,14 +163,14 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) { } if (pNode) { - // TODO + tRBTreeDrop(pTree, pNode); } return pNode; } SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) { - SRBTreeNode *pNode = pTree->root; + SRBTreeNode *pNode = pTree->rootNode; while (pNode) { int32_t c = pTree->cmprFn(pKey, pNode->payload); -- GitLab