From 260588b6922a1251503cc23386731dc0abee873c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 22 Nov 2021 23:07:07 +0800 Subject: [PATCH] update fst build struct --- source/libs/index/inc/index_fst.h | 2 ++ source/libs/index/inc/index_fst_util.h | 3 ++- source/libs/index/src/index_fst.c | 37 +++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/source/libs/index/inc/index_fst.h b/source/libs/index/inc/index_fst.h index 6fbf9ded57..0a75f33bac 100644 --- a/source/libs/index/inc/index_fst.h +++ b/source/libs/index/inc/index_fst.h @@ -75,6 +75,8 @@ typedef struct FstBuilder { FstBuilder *fstBuilderCreate(void *w, FstType ty); +void fstBuilderDestroy(FstBuilder *b); +void fstBuilderInsertOutput(FstBuilder *b, FstSlice bs, Output in); OrderType fstBuilderCheckLastKey(FstBuilder *b, FstSlice bs, bool ckDup); void fstBuilderCompileFrom(FstBuilder *b, uint64_t istate); CompiledAddr fstBuilderCompile(FstBuilder *b, FstBuilderNode *bn); diff --git a/source/libs/index/inc/index_fst_util.h b/source/libs/index/inc/index_fst_util.h index 36639af6f3..6490054b91 100644 --- a/source/libs/index/inc/index_fst_util.h +++ b/source/libs/index/inc/index_fst_util.h @@ -77,8 +77,9 @@ typedef struct FstSlice { FstSlice fstSliceCopy(FstSlice *slice, int32_t start, int32_t end); FstSlice fstSliceCreate(uint8_t *data, uint64_t dLen); bool fstSliceEmpty(FstSlice *slice); - int fstSliceCompare(FstSlice *a, FstSlice *b); +#define FST_SLICE_LEN(s) (s->end - s->start + 1) + #endif diff --git a/source/libs/index/src/index_fst.c b/source/libs/index/src/index_fst.c index 4b6fdeb079..4b96915941 100644 --- a/source/libs/index/src/index_fst.c +++ b/source/libs/index/src/index_fst.c @@ -29,7 +29,7 @@ void unFinishedNodeDestroyElem(void* elem) { fstBuilderNodeDestroy(b->node); free(b->last); } -void fstUnFinishedNodeDestroy(FstUnFinishedNodes *nodes) { +void fstUnFinishedNodesDestroy(FstUnFinishedNodes *nodes) { if (nodes == NULL) { return; } taosArrayDestroyEx(nodes->stack, unFinishedNodeDestroyElem); @@ -305,7 +305,42 @@ FstBuilder *fstBuilderCreate(void *w, FstType ty) { b->len = 0; return b; } +void fstBuilderDestroy(FstBuilder *b) { + if (b == NULL) { return; } + fstCountingWriterDestroy(b->wrt); + fstUnFinishedNodesDestroy(b->unfinished); + fstRegistryDestroy(b->registry); + free(b); +} +void fstBuilderInsertOutput(FstBuilder *b, FstSlice bs, Output in) { + FstSlice *s = &bs; + if (fstSliceEmpty(s)) { + b->len = 1; + fstUnFinishedNodesSetRootOutput(b->unfinished, in); + return; + } + Output out; + uint64_t prefixLen; + if (in != 0) { //if let Some(in) = in + prefixLen = fstUnFinishedNodesFindCommPrefixAndSetOutput(b->unfinished, bs, in, &out); + } else { + prefixLen = fstUnFinishedNodesFindCommPrefix(b->unfinished, bs); + out = 0; + } + + if (prefixLen == FST_SLICE_LEN(s)) { + assert(out != 0); + return; + } + + b->len += 1; + fstBuilderCompileFrom(b, prefixLen); + + FstSlice sub = fstSliceCopy(s, prefixLen, s->end); + fstUnFinishedNodesAddSuffix(b->unfinished, sub, out); + return; + } OrderType fstBuilderCheckLastKey(FstBuilder *b, FstSlice bs, bool ckDup) { FstSlice *input = &bs;