From 077b89db174fc4a9f77b61269f6d663a2ac642b3 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sun, 21 Nov 2021 19:01:08 +0800 Subject: [PATCH] add fst_registry --- source/libs/index/inc/index_fst_node.h | 2 + source/libs/index/inc/index_fst_registry.h | 10 ++-- source/libs/index/src/index_fst_node.c | 11 +++++ source/libs/index/src/index_fst_registry.c | 54 ++++++++++------------ 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/source/libs/index/inc/index_fst_node.h b/source/libs/index/inc/index_fst_node.h index 3eec97e3d8..09dcd223b1 100644 --- a/source/libs/index/inc/index_fst_node.h +++ b/source/libs/index/inc/index_fst_node.h @@ -33,4 +33,6 @@ typedef struct FstBuilderNode { FstBuilderNode *fstBuilderNodeDefault(); +void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src); + #endif diff --git a/source/libs/index/inc/index_fst_registry.h b/source/libs/index/inc/index_fst_registry.h index 80c0194f00..d54d73683f 100644 --- a/source/libs/index/inc/index_fst_registry.h +++ b/source/libs/index/inc/index_fst_registry.h @@ -26,11 +26,11 @@ typedef struct FstRegistryCell { -typedef struct FstRegistryCache { - SArray *cells; - uint32_t start; - uint32_t end; -} FstRegistryCache; +//typedef struct FstRegistryCache { +// SArray *cells; +// uint32_t start; +// uint32_t end; +//} FstRegistryCache; typedef enum {FOUND, NOTFOUND, REJECTED} FstRegistryEntryState; diff --git a/source/libs/index/src/index_fst_node.c b/source/libs/index/src/index_fst_node.c index 3e8e7c12a2..1511781719 100644 --- a/source/libs/index/src/index_fst_node.c +++ b/source/libs/index/src/index_fst_node.c @@ -22,3 +22,14 @@ FstBuilderNode *fstBuilderNodeDefault() { return bn; } +// not destroy src, User's bussiness +void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) { + if (dst == NULL || src == NULL) { return; } + + dst->isFinal = src->isFinal; + dst->finalOutput = src->finalOutput ; + dst->trans = src->trans; + + src->trans = NULL; +} + diff --git a/source/libs/index/src/index_fst_registry.c b/source/libs/index/src/index_fst_registry.c index 7b4ef9da19..5d6c7b1712 100644 --- a/source/libs/index/src/index_fst_registry.c +++ b/source/libs/index/src/index_fst_registry.c @@ -16,6 +16,23 @@ #include "index_fst_registry.h" +uint64_t fstRegistryHash(FstRegistry *registry, FstBuilderNode *bNode) { + //TODO(yihaoDeng): refactor later + const uint64_t FNV_PRIME = 1099511628211; + uint64_t h = 14695981039346656037u; + + h = (h ^ (uint64_t)bNode->isFinal) * FNV_PRIME; + h = (h ^ (bNode)->finalOutput) * FNV_PRIME; + + uint32_t sz = (uint32_t)taosArrayGetSize(bNode->trans); + for (uint32_t i = 0; i < sz; i++) { + FstTransition *trn = taosArrayGet(bNode->trans, i); + h = (h ^ (uint64_t)(trn->inp)) * FNV_PRIME; + h = (h ^ (uint64_t)(trn->out)) * FNV_PRIME; + h = (h ^ (uint64_t)(trn->addr))* FNV_PRIME; + } + return h %(registry->tableSize); +} static void fstRegistryCellSwap(SArray *arr, uint32_t a, uint32_t b) { size_t sz = taosArrayGetSize(arr); if (a >= sz || b >= sz) { return; } @@ -46,6 +63,9 @@ static void fstRegistryCellPromote(SArray *arr, uint32_t start, uint32_t end) { s -= 1; } } +#define FST_REGISTRY_CELL_IS_EMPTY(cell) (cell->addr == NONE_ADDRESS) +#define FST_REGISTRY_CELL_INSERT(cell, addr) do {cell->addr = addr;} while(0) + FstRegistry* fstRegistryCreate(uint64_t tableSize, uint64_t mruSize) { FstRegistry *registry = malloc(sizeof(FstRegistry)); if (registry == NULL) { return NULL ;} @@ -82,11 +102,8 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo return entry; } else { // clone from bNode, refactor later - cell->node->isFinal = bNode->isFinal; - cell->node->finalOutput = bNode->finalOutput; - cell->node->trans = bNode->trans; - bNode->trans = NULL; - + // + fstBuilderNodeCloneFrom(cell->node, bNode); entry->state = NOTFOUND; entry->cell = cell; // copy or not } @@ -106,10 +123,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo return entry; } //clone from bNode, refactor later - cell1->node->isFinal = bNode->isFinal; - cell1->node->finalOutput = bNode->finalOutput; - cell1->node->trans = bNode->trans; - bNode->trans = NULL; + fstBuilderNodeCloneFrom(cell2->node, bNode); fstRegistryCellSwap(registry->table, start, start + 1); FstRegistryCell *cCell = taosArrayGet(registry->table, start); @@ -130,10 +144,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo uint64_t last = end - 1; FstRegistryCell *cell = (FstRegistryCell *)taosArrayGet(registry->table, last); //clone from bNode, refactor later - cell->node->isFinal = bNode->isFinal; - cell->node->finalOutput = bNode->finalOutput; - cell->node->trans = bNode->trans; - bNode->trans = NULL; + fstBuilderNodeCloneFrom(cell->node, bNode); fstRegistryCellPromote(registry->table, last, start); FstRegistryCell *cCell = taosArrayGet(registry->table, start); @@ -144,21 +155,4 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo return entry; } -uint64_t fstRegistryHash(FstRegistry *registry, FstBuilderNode *bNode) { - //TODO(yihaoDeng): refactor later - const uint64_t FNV_PRIME = 1099511628211; - uint64_t h = 14695981039346656037u; - - h = (h ^ (uint64_t)bNode->isFinal) * FNV_PRIME; - h = (h ^ (bNode)->finalOutput) * FNV_PRIME; - - uint32_t sz = (uint32_t)taosArrayGetSize(bNode->trans); - for (uint32_t i = 0; i < sz; i++) { - FstTransition *trn = taosArrayGet(bNode->trans, i); - h = (h ^ (uint64_t)(trn->inp)) * FNV_PRIME; - h = (h ^ (uint64_t)(trn->out)) * FNV_PRIME; - h = (h ^ (uint64_t)(trn->addr))* FNV_PRIME; - } - return h %(registry->tableSize); -} -- GitLab