From 06fe44cabdb27c57ca57e8f04f7f1d358904dcd4 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 22 Nov 2021 17:43:03 +0800 Subject: [PATCH] add compare --- source/libs/index/inc/index_fst.h | 2 +- source/libs/index/inc/index_fst_util.h | 2 ++ source/libs/index/src/index_fst.c | 26 +++++++++++++++++++++----- source/libs/index/src/index_fst_util.c | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/source/libs/index/inc/index_fst.h b/source/libs/index/inc/index_fst.h index 5a8138b126..cb60ef7cb8 100644 --- a/source/libs/index/inc/index_fst.h +++ b/source/libs/index/inc/index_fst.h @@ -94,7 +94,7 @@ typedef struct FstBuilderNodeUnfinished { } FstBuilderNodeUnfinished; void fstBuilderNodeUnfinishedLastCompiled(FstBuilderNodeUnfinished *node, CompiledAddr addr); -void fstBuilderNodeUnfinishedAddOutputPrefix(FstBuilderNodeUnfinished *node, CompiledAddr addr); +void fstBuilderNodeUnfinishedAddOutputPrefix(FstBuilderNodeUnfinished *node, Output out); /* * FstNode and helper function diff --git a/source/libs/index/inc/index_fst_util.h b/source/libs/index/inc/index_fst_util.h index fc7dd44637..6410df6d61 100644 --- a/source/libs/index/inc/index_fst_util.h +++ b/source/libs/index/inc/index_fst_util.h @@ -78,5 +78,7 @@ FstSlice fstSliceCopy(FstSlice *slice, uint32_t start, uint32_t end); FstSlice fstSliceCreate(uint8_t *data, uint64_t dLen); bool fstSliceEmpty(FstSlice *slice); +int fstSliceCompare(FstSlice *a, FstSlice *b); + #endif diff --git a/source/libs/index/src/index_fst.c b/source/libs/index/src/index_fst.c index a7ae3f2fb6..22cfe76de4 100644 --- a/source/libs/index/src/index_fst.c +++ b/source/libs/index/src/index_fst.c @@ -307,10 +307,10 @@ FstBuilder *fstBuilderCreate(void *w, FstType ty) { } -void fstBuilderCheckLastKey(FstBuilder *b, FstSlice bs, bool ckDupe) { - return; +bool fstBuilderCheckLastKey(FstBuilder *b, FstSlice bs, bool ckDupe) { + + return true; } - CompiledAddr fstBuilderCompile(FstBuilder *b, FstBuilderNode *bn) { if (FST_BUILDER_NODE_IS_FINAL(bn) && FST_BUILDER_NODE_TRANS_ISEMPTY(bn) @@ -336,6 +336,8 @@ CompiledAddr fstBuilderCompile(FstBuilder *b, FstBuilderNode *bn) { } + + FstSlice fstNodeAsSlice(FstNode *node) { FstSlice *slice = &node->data; FstSlice s = fstSliceCopy(slice, slice->end, slice->dLen - 1); @@ -354,11 +356,25 @@ FstLastTransition *fstLastTransitionCreate(uint8_t inp, Output out) { void fstLastTransitionDestroy(FstLastTransition *trn) { free(trn); } -void fstBuilderNodeUnfinishedLastCompiled(FstBuilderNodeUnfinished *node, CompiledAddr addr) { +void fstBuilderNodeUnfinishedLastCompiled(FstBuilderNodeUnfinished *unNode, CompiledAddr addr) { + FstLastTransition *trn = unNode->last; + FstTransition t = {.inp = trn->inp, .out = trn->out, .addr = addr}; + taosArrayPush(unNode->node->trans, &t); return; } -void fstBuilderNodeUnfinishedAddOutputPrefix(FstBuilderNodeUnfinished *node, CompiledAddr addr) { +void fstBuilderNodeUnfinishedAddOutputPrefix(FstBuilderNodeUnfinished *unNode, Output out) { + if (FST_BUILDER_NODE_IS_FINAL(unNode->node)) { + unNode->node->finalOutput += out; + } + size_t sz = taosArrayGetSize(unNode->node->trans); + for (size_t i = 0; i < sz; i++) { + FstTransition *trn = taosArrayGet(unNode->node->trans, i); + trn->out += out; + } + if (unNode->last) { + unNode->last->out += out; + } return; } diff --git a/source/libs/index/src/index_fst_util.c b/source/libs/index/src/index_fst_util.c index 20751baf5f..23e7056c64 100644 --- a/source/libs/index/src/index_fst_util.c +++ b/source/libs/index/src/index_fst_util.c @@ -113,3 +113,21 @@ bool fstSliceEmpty(FstSlice *slice) { +int fstSliceCompare(FstSlice *a, FstSlice *b) { + uint32_t aLen = (a->end - a->start + 1); + uint32_t bLen = (b->end - b->start + 1); + uint32_t mLen = (aLen < bLen ? aLen : bLen); + for (int i = 0; i < mLen; i++) { + uint8_t x = a->data[i + a->start]; + uint8_t y = b->data[i + b->start]; + if (x == y) { continue; } + else if (x < y) { return -1; } + else { return 1; } + } + if (aLen == bLen) { return 0; } + else if (aLen < bLen) { return -1; } + else { return 1; } +} + + +