more code
This commit is contained in:
parent
66177fb9f1
commit
f95c0013ef
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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;
|
||||||
|
};
|
|
@ -36,6 +36,7 @@
|
||||||
#include "tlosertree.h"
|
#include "tlosertree.h"
|
||||||
#include "tlrucache.h"
|
#include "tlrucache.h"
|
||||||
#include "tmsgcb.h"
|
#include "tmsgcb.h"
|
||||||
|
#include "trbtree.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "tskiplist.h"
|
#include "tskiplist.h"
|
||||||
#include "tstream.h"
|
#include "tstream.h"
|
||||||
|
|
|
@ -28,6 +28,20 @@ typedef struct {
|
||||||
int32_t iRow;
|
int32_t iRow;
|
||||||
} SLDataIter;
|
} 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 {
|
typedef struct {
|
||||||
STsdb *pTsdb;
|
STsdb *pTsdb;
|
||||||
int8_t maxLast;
|
int8_t maxLast;
|
||||||
|
|
|
@ -13,30 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "os.h"
|
#include "trbtree.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;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
|
#define RBTREE_NODE_COLOR(N) ((N) ? (N)->color : BLACK)
|
||||||
|
|
||||||
|
@ -51,7 +28,7 @@ static void tRBTreeRotateLeft(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
|
|
||||||
right->parent = pNode->parent;
|
right->parent = pNode->parent;
|
||||||
if (pNode->parent == NULL) {
|
if (pNode->parent == NULL) {
|
||||||
pTree->root = right;
|
pTree->rootNode = right;
|
||||||
} else if (pNode == pNode->parent->left) {
|
} else if (pNode == pNode->parent->left) {
|
||||||
pNode->parent->left = right;
|
pNode->parent->left = right;
|
||||||
} else {
|
} else {
|
||||||
|
@ -72,7 +49,7 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
|
|
||||||
left->parent = pNode->parent;
|
left->parent = pNode->parent;
|
||||||
if (pNode->parent == NULL) {
|
if (pNode->parent == NULL) {
|
||||||
pTree->root = left;
|
pTree->rootNode = left;
|
||||||
} else if (pNode == pNode->parent->left) {
|
} else if (pNode == pNode->parent->left) {
|
||||||
pNode->parent->left = left;
|
pNode->parent->left = left;
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,20 +60,17 @@ static void tRBTreeRotateRight(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
pNode->parent = left;
|
pNode->parent = left;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define tRBTreeCreate(compare) \
|
|
||||||
(SRBTree) { .cmprFn = (compare), .root = NULL }
|
|
||||||
|
|
||||||
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
|
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
|
||||||
pNew->left = NULL;
|
pNew->left = NULL;
|
||||||
pNew->right = NULL;
|
pNew->right = NULL;
|
||||||
pNew->color = RED;
|
pNew->color = RED;
|
||||||
|
|
||||||
// insert
|
// insert
|
||||||
if (pTree->root == NULL) {
|
if (pTree->rootNode == NULL) {
|
||||||
pNew->parent = NULL;
|
pNew->parent = NULL;
|
||||||
pTree->root = pNew;
|
pTree->rootNode = pNew;
|
||||||
} else {
|
} else {
|
||||||
SRBTreeNode *pNode = pTree->root;
|
SRBTreeNode *pNode = pTree->rootNode;
|
||||||
while (true) {
|
while (true) {
|
||||||
ASSERT(pNode);
|
ASSERT(pNode);
|
||||||
|
|
||||||
|
@ -165,12 +139,16 @@ SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *pNew) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pTree->root->color = BLACK;
|
pTree->rootNode->color = BLACK;
|
||||||
return pNew;
|
return pNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
|
void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *pNode) {
|
||||||
SRBTreeNode *pNode = pTree->root;
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey) {
|
||||||
|
SRBTreeNode *pNode = pTree->rootNode;
|
||||||
|
|
||||||
while (pNode) {
|
while (pNode) {
|
||||||
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
||||||
|
@ -185,14 +163,14 @@ SRBTreeNode *tRBTreeDrop(SRBTree *pTree, void *pKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pNode) {
|
if (pNode) {
|
||||||
// TODO
|
tRBTreeDrop(pTree, pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pNode;
|
return pNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) {
|
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey) {
|
||||||
SRBTreeNode *pNode = pTree->root;
|
SRBTreeNode *pNode = pTree->rootNode;
|
||||||
|
|
||||||
while (pNode) {
|
while (pNode) {
|
||||||
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
int32_t c = pTree->cmprFn(pKey, pNode->payload);
|
||||||
|
|
Loading…
Reference in New Issue