add fst_registry
This commit is contained in:
parent
d56dbb15ff
commit
077b89db17
|
@ -33,4 +33,6 @@ typedef struct FstBuilderNode {
|
||||||
|
|
||||||
FstBuilderNode *fstBuilderNodeDefault();
|
FstBuilderNode *fstBuilderNodeDefault();
|
||||||
|
|
||||||
|
void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,11 +26,11 @@ typedef struct FstRegistryCell {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct FstRegistryCache {
|
//typedef struct FstRegistryCache {
|
||||||
SArray *cells;
|
// SArray *cells;
|
||||||
uint32_t start;
|
// uint32_t start;
|
||||||
uint32_t end;
|
// uint32_t end;
|
||||||
} FstRegistryCache;
|
//} FstRegistryCache;
|
||||||
|
|
||||||
typedef enum {FOUND, NOTFOUND, REJECTED} FstRegistryEntryState;
|
typedef enum {FOUND, NOTFOUND, REJECTED} FstRegistryEntryState;
|
||||||
|
|
||||||
|
|
|
@ -22,3 +22,14 @@ FstBuilderNode *fstBuilderNodeDefault() {
|
||||||
return bn;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,23 @@
|
||||||
#include "index_fst_registry.h"
|
#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) {
|
static void fstRegistryCellSwap(SArray *arr, uint32_t a, uint32_t b) {
|
||||||
size_t sz = taosArrayGetSize(arr);
|
size_t sz = taosArrayGetSize(arr);
|
||||||
if (a >= sz || b >= sz) { return; }
|
if (a >= sz || b >= sz) { return; }
|
||||||
|
@ -46,6 +63,9 @@ static void fstRegistryCellPromote(SArray *arr, uint32_t start, uint32_t end) {
|
||||||
s -= 1;
|
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* fstRegistryCreate(uint64_t tableSize, uint64_t mruSize) {
|
||||||
FstRegistry *registry = malloc(sizeof(FstRegistry));
|
FstRegistry *registry = malloc(sizeof(FstRegistry));
|
||||||
if (registry == NULL) { return NULL ;}
|
if (registry == NULL) { return NULL ;}
|
||||||
|
@ -82,11 +102,8 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
||||||
return entry;
|
return entry;
|
||||||
} else {
|
} else {
|
||||||
// clone from bNode, refactor later
|
// clone from bNode, refactor later
|
||||||
cell->node->isFinal = bNode->isFinal;
|
//
|
||||||
cell->node->finalOutput = bNode->finalOutput;
|
fstBuilderNodeCloneFrom(cell->node, bNode);
|
||||||
cell->node->trans = bNode->trans;
|
|
||||||
bNode->trans = NULL;
|
|
||||||
|
|
||||||
entry->state = NOTFOUND;
|
entry->state = NOTFOUND;
|
||||||
entry->cell = cell; // copy or not
|
entry->cell = cell; // copy or not
|
||||||
}
|
}
|
||||||
|
@ -106,10 +123,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
//clone from bNode, refactor later
|
//clone from bNode, refactor later
|
||||||
cell1->node->isFinal = bNode->isFinal;
|
fstBuilderNodeCloneFrom(cell2->node, bNode);
|
||||||
cell1->node->finalOutput = bNode->finalOutput;
|
|
||||||
cell1->node->trans = bNode->trans;
|
|
||||||
bNode->trans = NULL;
|
|
||||||
|
|
||||||
fstRegistryCellSwap(registry->table, start, start + 1);
|
fstRegistryCellSwap(registry->table, start, start + 1);
|
||||||
FstRegistryCell *cCell = taosArrayGet(registry->table, start);
|
FstRegistryCell *cCell = taosArrayGet(registry->table, start);
|
||||||
|
@ -130,10 +144,7 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
||||||
uint64_t last = end - 1;
|
uint64_t last = end - 1;
|
||||||
FstRegistryCell *cell = (FstRegistryCell *)taosArrayGet(registry->table, last);
|
FstRegistryCell *cell = (FstRegistryCell *)taosArrayGet(registry->table, last);
|
||||||
//clone from bNode, refactor later
|
//clone from bNode, refactor later
|
||||||
cell->node->isFinal = bNode->isFinal;
|
fstBuilderNodeCloneFrom(cell->node, bNode);
|
||||||
cell->node->finalOutput = bNode->finalOutput;
|
|
||||||
cell->node->trans = bNode->trans;
|
|
||||||
bNode->trans = NULL;
|
|
||||||
|
|
||||||
fstRegistryCellPromote(registry->table, last, start);
|
fstRegistryCellPromote(registry->table, last, start);
|
||||||
FstRegistryCell *cCell = taosArrayGet(registry->table, start);
|
FstRegistryCell *cCell = taosArrayGet(registry->table, start);
|
||||||
|
@ -144,21 +155,4 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
||||||
return entry;
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue