update fst struct
This commit is contained in:
parent
3322eb5ffa
commit
59cc5e4212
|
@ -20,6 +20,7 @@
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "index_fst_util.h"
|
#include "index_fst_util.h"
|
||||||
#include "index_fst_registry.h"
|
#include "index_fst_registry.h"
|
||||||
|
#include "index_fst_counting_writer.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct FstNode FstNode;
|
typedef struct FstNode FstNode;
|
||||||
|
@ -35,7 +36,6 @@ typedef struct FstRange {
|
||||||
typedef enum { OneTransNext, OneTrans, AnyTrans, EmptyFinal} State;
|
typedef enum { OneTransNext, OneTrans, AnyTrans, EmptyFinal} State;
|
||||||
typedef enum { Included, Excluded, Unbounded} FstBound;
|
typedef enum { Included, Excluded, Unbounded} FstBound;
|
||||||
|
|
||||||
typedef uint32_t CheckSummer;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -60,11 +60,6 @@ void fstUnFinishedNodesAddSuffix(FstUnFinishedNodes *node, FstSlice bs, Output o
|
||||||
uint64_t fstUnFinishedNodesFindCommPrefix(FstUnFinishedNodes *node, FstSlice bs);
|
uint64_t fstUnFinishedNodesFindCommPrefix(FstUnFinishedNodes *node, FstSlice bs);
|
||||||
uint64_t FstUnFinishedNodesFindCommPreifxAndSetOutput(FstUnFinishedNodes *node, FstSlice bs, Output in, Output *out);
|
uint64_t FstUnFinishedNodesFindCommPreifxAndSetOutput(FstUnFinishedNodes *node, FstSlice bs, Output in, Output *out);
|
||||||
|
|
||||||
typedef struct FstCountingWriter {
|
|
||||||
void* wtr; // wrap any writer that counts and checksum bytes written
|
|
||||||
uint64_t count;
|
|
||||||
CheckSummer summer;
|
|
||||||
} FstCountingWriter;
|
|
||||||
|
|
||||||
typedef struct FstBuilder {
|
typedef struct FstBuilder {
|
||||||
FstCountingWriter wtr; // The FST raw data is written directly to `wtr`.
|
FstCountingWriter wtr; // The FST raw data is written directly to `wtr`.
|
||||||
|
|
|
@ -275,8 +275,6 @@ bool fstNodeCompile(FstNode *node, void *w, CompiledAddr lastAddr, CompiledAddr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FstBuilder *fstBuilderCreate(void *w, FstType ty) {
|
FstBuilder *fstBuilderCreate(void *w, FstType ty) {
|
||||||
FstBuilder *b = malloc(sizeof(FstBuilder));
|
FstBuilder *b = malloc(sizeof(FstBuilder));
|
||||||
if (NULL == b) { return b; }
|
if (NULL == b) { return b; }
|
||||||
|
|
|
@ -26,14 +26,13 @@ FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src) {
|
||||||
FstBuilderNode *node = malloc(sizeof(FstBuilderNode));
|
FstBuilderNode *node = malloc(sizeof(FstBuilderNode));
|
||||||
if (node == NULL) { return NULL; }
|
if (node == NULL) { return NULL; }
|
||||||
|
|
||||||
|
//
|
||||||
size_t sz = taosArrayGetSize(src->trans);
|
size_t sz = taosArrayGetSize(src->trans);
|
||||||
SArray *trans = taosArrayInit(sz, sizeof(FstTransition));
|
SArray *trans = taosArrayInit(sz, sizeof(FstTransition));
|
||||||
|
|
||||||
for (size_t i = 0; i < sz; i++) {
|
for (size_t i = 0; i < sz; i++) {
|
||||||
FstTransition *tran = taosArrayGet(src->trans, i);
|
FstTransition *tran = taosArrayGet(src->trans, i);
|
||||||
FstTransition t = *tran;
|
taosArrayPush(trans, tran);
|
||||||
taosArrayPush(trans, &t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
node->trans = trans;
|
node->trans = trans;
|
||||||
|
@ -48,8 +47,10 @@ void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) {
|
||||||
|
|
||||||
dst->isFinal = src->isFinal;
|
dst->isFinal = src->isFinal;
|
||||||
dst->finalOutput = src->finalOutput;
|
dst->finalOutput = src->finalOutput;
|
||||||
dst->trans = src->trans;
|
|
||||||
|
|
||||||
|
// avoid mem leak
|
||||||
|
taosArrayDestroy(dst->trans);
|
||||||
|
dst->trans = src->trans;
|
||||||
src->trans = NULL;
|
src->trans = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ uint64_t fstRegistryHash(FstRegistry *registry, FstBuilderNode *bNode) {
|
||||||
h = (h ^ (uint64_t)(trn->addr))* FNV_PRIME;
|
h = (h ^ (uint64_t)(trn->addr))* FNV_PRIME;
|
||||||
}
|
}
|
||||||
return h %(registry->tableSize);
|
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);
|
||||||
|
@ -72,10 +73,14 @@ FstRegistry* fstRegistryCreate(uint64_t tableSize, uint64_t mruSize) {
|
||||||
|
|
||||||
uint64_t nCells = tableSize * mruSize;
|
uint64_t nCells = tableSize * mruSize;
|
||||||
SArray* tb = (SArray *)taosArrayInit(nCells, sizeof(FstRegistryCell));
|
SArray* tb = (SArray *)taosArrayInit(nCells, sizeof(FstRegistryCell));
|
||||||
|
if (NULL == tb) {
|
||||||
|
free(registry);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for (uint64_t i = 0; i < nCells; i++) {
|
for (uint64_t i = 0; i < nCells; i++) {
|
||||||
FstRegistryCell *cell = taosArrayGet(tb, i);
|
FstRegistryCell cell = {.addr = NONE_ADDRESS, .node = fstBuilderNodeDefault()};
|
||||||
cell->addr = NONE_ADDRESS;
|
taosArrayPush(tb, &cell);
|
||||||
cell->node = fstBuilderNodeDefault();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
registry->table = tb;
|
registry->table = tb;
|
||||||
|
@ -101,8 +106,6 @@ FstRegistryEntry *fstRegistryGetEntry(FstRegistry *registry, FstBuilderNode *bNo
|
||||||
entry->addr = cell->addr ;
|
entry->addr = cell->addr ;
|
||||||
return entry;
|
return entry;
|
||||||
} else {
|
} else {
|
||||||
// clone from bNode, refactor later
|
|
||||||
//
|
|
||||||
fstBuilderNodeCloneFrom(cell->node, bNode);
|
fstBuilderNodeCloneFrom(cell->node, bNode);
|
||||||
entry->state = NOTFOUND;
|
entry->state = NOTFOUND;
|
||||||
entry->cell = cell; // copy or not
|
entry->cell = cell; // copy or not
|
||||||
|
|
Loading…
Reference in New Issue