From 0f682ca20a2d162101f0bacb4f4e89632ae7d03a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 3 Dec 2021 14:16:32 +0800 Subject: [PATCH] refactor builder struct --- source/libs/index/inc/index_fst_node.h | 1 + source/libs/index/src/index_fst.c | 1 - source/libs/index/src/index_fst_node.c | 32 +++++++++++++++++++--- source/libs/index/src/index_fst_registry.c | 8 +++--- source/libs/index/test/indexTests.cpp | 7 ++++- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/source/libs/index/inc/index_fst_node.h b/source/libs/index/inc/index_fst_node.h index d1b45a16ab..87eb7cb746 100644 --- a/source/libs/index/inc/index_fst_node.h +++ b/source/libs/index/inc/index_fst_node.h @@ -46,6 +46,7 @@ FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src); void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src); //bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr); +bool fstBuilderNodeEqual(FstBuilderNode *n1, FstBuilderNode *n2); void fstBuilderNodeDestroy(FstBuilderNode *node); diff --git a/source/libs/index/src/index_fst.c b/source/libs/index/src/index_fst.c index 9e5c1f5d78..b2d21cd0b0 100644 --- a/source/libs/index/src/index_fst.c +++ b/source/libs/index/src/index_fst.c @@ -167,7 +167,6 @@ uint64_t fstUnFinishedNodesFindCommPrefixAndSetOutput(FstUnFinishedNodes *node, } if (addPrefix != 0) { fstBuilderNodeUnfinishedAddOutputPrefix(un, addPrefix); - } } return i; diff --git a/source/libs/index/src/index_fst_node.c b/source/libs/index/src/index_fst_node.c index b33b8e4428..af69f98f32 100644 --- a/source/libs/index/src/index_fst_node.c +++ b/source/libs/index/src/index_fst_node.c @@ -18,7 +18,7 @@ FstBuilderNode *fstBuilderNodeDefault() { FstBuilderNode *bn = malloc(sizeof(FstBuilderNode)); bn->isFinal = false; bn->finalOutput = 0; - bn->trans = NULL; + bn->trans = taosArrayInit(16, sizeof(FstTransition)); return bn; } void fstBuilderNodeDestroy(FstBuilderNode *node) { @@ -27,6 +27,25 @@ void fstBuilderNodeDestroy(FstBuilderNode *node) { taosArrayDestroy(node->trans); free(node); } + +bool fstBuilderNodeEqual(FstBuilderNode *n1, FstBuilderNode *n2) { + if (n1 == n2) { return true; } + + if (n1->isFinal != n2->isFinal || + n1->finalOutput != n2->finalOutput || + taosArrayGetSize(n1->trans) != taosArrayGetSize(n2->trans)) { + return false; + } + size_t sz = taosArrayGetSize(n1->trans); + for (size_t i = 0; i < sz; i++) { + FstTransition *t1 = taosArrayGet(n1->trans, i); + FstTransition *t2 = taosArrayGet(n2->trans, i); + if (t1->inp != t2->inp || t1->out != t2->out || t1->addr != t2->addr) { + return false; + } + } + return true; +} FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src) { FstBuilderNode *node = malloc(sizeof(FstBuilderNode)); if (node == NULL) { return NULL; } @@ -53,12 +72,17 @@ void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) { dst->isFinal = src->isFinal; dst->finalOutput = src->finalOutput; - // avoid mem leak + //release free avoid mem leak taosArrayDestroy(dst->trans); - dst->trans = src->trans; - src->trans = NULL; + size_t sz = taosArrayGetSize(src->trans); + dst->trans = taosArrayInit(sz, sizeof(FstTransition)); + for (size_t i = 0; i < sz; i++) { + FstTransition *trn = taosArrayGet(src->trans, i); + taosArrayPush(dst->trans, trn); + } } + //bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr) { //size_t sz = taosArrayGetSize(b->trans); diff --git a/source/libs/index/src/index_fst_registry.c b/source/libs/index/src/index_fst_registry.c index b25964e0e7..8fb0dbfcaa 100644 --- a/source/libs/index/src/index_fst_registry.c +++ b/source/libs/index/src/index_fst_registry.c @@ -112,7 +112,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo if (end - start == 1) { FstRegistryCell *cell = taosArrayGet(registry->table, start); //cell->isNode && - if (cell->addr != NONE_ADDRESS && cell->node == bNode) { + if (cell->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell->node, bNode)) { entry->state = FOUND; entry->addr = cell->addr ; return entry; @@ -123,13 +123,13 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo } } else if (end - start == 2) { FstRegistryCell *cell1 = taosArrayGet(registry->table, start); - if (cell1->addr != NONE_ADDRESS && cell1->node == bNode) { + if (cell1->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell1->node, bNode)) { entry->state = FOUND; entry->addr = cell1->addr; return entry; } FstRegistryCell *cell2 = taosArrayGet(registry->table, start + 1); - if (cell2->addr != NONE_ADDRESS && cell2->node == bNode) { + if (cell2->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell2->node, bNode)) { entry->state = FOUND; entry->addr = cell2->addr; // must swap here @@ -147,7 +147,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo uint32_t i = start; for (; i < end; i++) { FstRegistryCell *cell = (FstRegistryCell *)taosArrayGet(registry->table, i); - if (cell->addr != NONE_ADDRESS && cell->node == bNode) { + if (cell->addr != NONE_ADDRESS && fstBuilderNodeEqual(cell->node, bNode)) { entry->state = FOUND; entry->addr = cell->addr; fstRegistryCellPromote(registry->table, i, start); diff --git a/source/libs/index/test/indexTests.cpp b/source/libs/index/test/indexTests.cpp index b94a241489..9f3d1b962e 100644 --- a/source/libs/index/test/indexTests.cpp +++ b/source/libs/index/test/indexTests.cpp @@ -63,11 +63,16 @@ //} int main(int argc, char** argv) { - std::string str("Hello world"); + std::string str("abc"); FstSlice key = fstSliceCreate((uint8_t *)str.c_str(), str.size()); Output val = 10; + + std::string str1("bcd"); + FstSlice key1 = fstSliceCreate((uint8_t *)str1.c_str(), str1.size()); + Output val2 = 10; FstBuilder *b = fstBuilderCreate(NULL, 1); fstBuilderInsert(b, key, val); + fstBuilderInsert(b, key1, val2); fstBuilderFinish(b); fstBuilderDestroy(b); fstSliceDestroy(&key);