未验证 提交 27f465bd 编写于 作者: dengyihao's avatar dengyihao 提交者: GitHub

Merge pull request #8839 from taosdata/origin/3.0/fst

Origin/3.0/fst
...@@ -251,8 +251,14 @@ void fstDestroy(Fst *fst); ...@@ -251,8 +251,14 @@ void fstDestroy(Fst *fst);
bool fstGet(Fst *fst, FstSlice *b, Output *out); bool fstGet(Fst *fst, FstSlice *b, Output *out);
FstNode* fstGetNode(Fst *fst, CompiledAddr); FstNode* fstGetNode(Fst *fst, CompiledAddr);
FstNode* fstGetRoot(Fst *fst);
FstType fstGetType(Fst *fst); FstType fstGetType(Fst *fst);
CompiledAddr fstGetRootAddr(Fst *fst); CompiledAddr fstGetRootAddr(Fst *fst);
Output fstEmptyFinalOutput(Fst *fst, bool *null); Output fstEmptyFinalOutput(Fst *fst, bool *null);
bool fstVerify(Fst *fst); bool fstVerify(Fst *fst);
//refactor this function
bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr);
#endif #endif
...@@ -41,7 +41,7 @@ FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src); ...@@ -41,7 +41,7 @@ FstBuilderNode *fstBuilderNodeClone(FstBuilderNode *src);
void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src); void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src);
bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr); //bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr);
void fstBuilderNodeDestroy(FstBuilderNode *node); void fstBuilderNodeDestroy(FstBuilderNode *node);
......
...@@ -733,6 +733,11 @@ bool fstNodeCompile(FstNode *node, void *w, CompiledAddr lastAddr, CompiledAddr ...@@ -733,6 +733,11 @@ bool fstNodeCompile(FstNode *node, void *w, CompiledAddr lastAddr, CompiledAddr
return true; return true;
} }
bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr) {
return fstNodeCompile(NULL, wrt, lastAddr, startAddr, b);
}
FstBuilder *fstBuilderCreate(void *w, FstType ty) { FstBuilder *fstBuilderCreate(void *w, FstType ty) {
FstBuilder *b = malloc(sizeof(FstBuilder)); FstBuilder *b = malloc(sizeof(FstBuilder));
...@@ -985,15 +990,39 @@ void fstDestroy(Fst *fst) { ...@@ -985,15 +990,39 @@ void fstDestroy(Fst *fst) {
} }
bool fstGet(Fst *fst, FstSlice *b, Output *out) { bool fstGet(Fst *fst, FstSlice *b, Output *out) {
FstNode *root = fstGetRoot(fst);
Output tOut = 0;
for (uint32_t i = 0; i < b->dLen; i++) {
uint8_t inp = b->data[i];
Output res = 0;
bool null = fstNodeFindInput(root, inp, &res);
if (null) { return false; }
FstTransition trn;
fstNodeGetTransitionAt(root, res, &trn);
tOut += trn.out;
root = fstGetNode(fst, trn.addr);
}
if (!FST_NODE_IS_FINAL(root)) {
return false;
} else {
tOut = tOut + FST_NODE_FINAL_OUTPUT(root);
}
*out = tOut;
return false; return false;
} }
FstNode *fstGetRoot(Fst *fst) {
CompiledAddr root = fstGetRootAddr(fst);
return fstGetNode(fst, root);
}
FstNode* fstGetNode(Fst *fst, CompiledAddr addr) { FstNode* fstGetNode(Fst *fst, CompiledAddr addr) {
if (fst->root != NULL) { if (fst->root != NULL) {
return fst->root; return fst->root;
} }
fst->root = fstNodeCreate(fst->meta->version, addr, fst->data); fst->root = fstNodeCreate(fst->meta->version, addr, fst->data);
return fst->root; return fst->root;
} }
...@@ -1016,15 +1045,14 @@ Output fstEmptyFinalOutput(Fst *fst, bool *null) { ...@@ -1016,15 +1045,14 @@ Output fstEmptyFinalOutput(Fst *fst, bool *null) {
return res; return res;
} }
bool fstVerify(Fst *fst) { bool fstVerify(Fst *fst) {
uint32_t checkSum = fst->meta->checkSum; uint32_t checkSum = fst->meta->checkSum;
FstSlice *data = fst->data; FstSlice *data = fst->data;
TSCKSUM initSum = 0; TSCKSUM initSum = 0;
if (taosCheckChecksumWhole(data->data, data->dLen)) { if (!taosCheckChecksumWhole(data->data, data->dLen)) {
return false; return false;
} }
return true;
} }
...@@ -59,26 +59,27 @@ void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) { ...@@ -59,26 +59,27 @@ void fstBuilderNodeCloneFrom(FstBuilderNode *dst, FstBuilderNode *src) {
src->trans = NULL; src->trans = NULL;
} }
bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr) { //bool fstBuilderNodeCompileTo(FstBuilderNode *b, FstCountingWriter *wrt, CompiledAddr lastAddr, CompiledAddr startAddr) {
size_t sz = taosArrayGetSize(b->trans);
assert(sz < 256); //size_t sz = taosArrayGetSize(b->trans);
if (FST_BUILDER_NODE_IS_FINAL(b) //assert(sz < 256);
&& FST_BUILDER_NODE_TRANS_ISEMPTY(b) //if (FST_BUILDER_NODE_IS_FINAL(b)
&& FST_BUILDER_NODE_FINALOUTPUT_ISZERO(b)) { // && FST_BUILDER_NODE_TRANS_ISEMPTY(b)
return true; // && FST_BUILDER_NODE_FINALOUTPUT_ISZERO(b)) {
} else if (sz != 1 || b->isFinal) { // return true;
// AnyTrans->Compile(w, addr, node); //} else if (sz != 1 || b->isFinal) {
} else { // // AnyTrans->Compile(w, addr, node);
FstTransition *tran = taosArrayGet(b->trans, 0); //} else {
if (tran->addr == lastAddr && tran->out == 0) { // FstTransition *tran = taosArrayGet(b->trans, 0);
//OneTransNext::compile(w, lastAddr, tran->inp); // if (tran->addr == lastAddr && tran->out == 0) {
return true; // //OneTransNext::compile(w, lastAddr, tran->inp);
} else { // return true;
//OneTrans::Compile(w, lastAddr, *tran); // } else {
return true; // //OneTrans::Compile(w, lastAddr, *tran);
} // return true;
} // }
return true; //}
} //return true;
//}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册