Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
1fe4cd22
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
1fe4cd22
编写于
12月 08, 2021
作者:
dengyihao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add test case
上级
67e40f88
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
83 addition
and
29 deletion
+83
-29
source/libs/index/inc/index_fst_counting_writer.h
source/libs/index/inc/index_fst_counting_writer.h
+5
-3
source/libs/index/src/index_fst.c
source/libs/index/src/index_fst.c
+14
-12
source/libs/index/src/index_fst_counting_writer.c
source/libs/index/src/index_fst_counting_writer.c
+28
-12
source/libs/index/src/index_fst_util.c
source/libs/index/src/index_fst_util.c
+1
-1
source/libs/index/test/indexTests.cpp
source/libs/index/test/indexTests.cpp
+35
-1
未找到文件。
source/libs/index/inc/index_fst_counting_writer.h
浏览文件 @
1fe4cd22
...
...
@@ -45,7 +45,7 @@ static int writeCtxDoWrite(WriterCtx *ctx, uint8_t *buf, int len);
static
int
writeCtxDoRead
(
WriterCtx
*
ctx
,
uint8_t
*
buf
,
int
len
);
static
int
writeCtxDoFlush
(
WriterCtx
*
ctx
);
WriterCtx
*
writerCtxCreate
(
WriterType
type
);
WriterCtx
*
writerCtxCreate
(
WriterType
type
,
bool
readOnly
);
void
writerCtxDestroy
(
WriterCtx
*
w
);
typedef
uint32_t
CheckSummer
;
...
...
@@ -57,14 +57,16 @@ typedef struct FstCountingWriter {
CheckSummer
summer
;
}
FstCountingWriter
;
int
fstCountingWriterWrite
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
bufLen
);
int
fstCountingWriterWrite
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
len
);
int
fstCountingWriterRead
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
len
);
int
fstCountingWriterFlush
(
FstCountingWriter
*
write
);
uint32_t
fstCountingWriterMaskedCheckSum
(
FstCountingWriter
*
write
);
FstCountingWriter
*
fstCountingWriterCreate
(
void
*
wtr
);
FstCountingWriter
*
fstCountingWriterCreate
(
void
*
wtr
,
bool
readOnly
);
void
fstCountingWriterDestroy
(
FstCountingWriter
*
w
);
...
...
source/libs/index/src/index_fst.c
浏览文件 @
1fe4cd22
...
...
@@ -404,7 +404,7 @@ CompiledAddr fstStateTransAddr(FstState *s, FstNode *node) {
assert
(
s
->
state
==
OneTransNext
||
s
->
state
==
OneTrans
);
FstSlice
*
slice
=
&
node
->
data
;
if
(
s
->
state
==
OneTransNext
)
{
return
(
CompiledAddr
)(
node
->
end
);
return
(
CompiledAddr
)(
node
->
end
)
-
1
;
}
else
{
PackSizes
sizes
=
node
->
sizes
;
uint8_t
tSizes
=
FST_GET_TRANSITION_PACK_SIZE
(
sizes
);
...
...
@@ -459,7 +459,7 @@ Output fstStateOutput(FstState *s, FstNode *node) {
uint8_t
tSizes
=
FST_GET_TRANSITION_PACK_SIZE
(
node
->
sizes
);
uint64_t
i
=
node
->
start
-
fstStateInputLen
(
s
)
;
-
fstStateInputLen
(
s
)
-
1
-
tSizes
-
oSizes
;
...
...
@@ -620,7 +620,7 @@ FstNode *fstNodeCreate(int64_t version, CompiledAddr addr, FstSlice *slice) {
n
->
version
=
version
;
n
->
state
=
st
;
n
->
start
=
addr
;
n
->
end
=
fstStateEndAddrForOneTransNext
(
&
st
,
slice
);
//? s.end_addr(data);
n
->
end
=
fstStateEndAddrForOneTransNext
(
&
st
,
&
n
->
data
);
//? s.end_addr(data);
n
->
isFinal
=
false
;
n
->
sizes
=
0
;
n
->
nTrans
=
1
;
...
...
@@ -632,23 +632,24 @@ FstNode *fstNodeCreate(int64_t version, CompiledAddr addr, FstSlice *slice) {
n
->
version
=
version
;
n
->
state
=
st
;
n
->
start
=
addr
;
n
->
end
=
fstStateEndAddrForOneTrans
(
&
st
,
slice
,
sz
);
// s.end_addr(data, sz);
n
->
end
=
fstStateEndAddrForOneTrans
(
&
st
,
&
data
,
sz
);
// s.end_addr(data, sz);
n
->
isFinal
=
false
;
n
->
nTrans
=
1
;
n
->
sizes
=
sz
;
n
->
finalOutput
=
0
;
}
else
{
uint64_t
sz
=
fstStateSizes
(
&
st
,
slice
);
// s.sizes(data)
uint32_t
nTrans
=
fstStateNtrans
(
&
st
,
slice
);
// s.ntrans(data)
n
->
data
=
*
slice
;
FstSlice
data
=
fstSliceCopy
(
slice
,
0
,
addr
);
uint64_t
sz
=
fstStateSizes
(
&
st
,
&
data
);
// s.sizes(data)
uint32_t
nTrans
=
fstStateNtrans
(
&
st
,
&
data
);
// s.ntrans(data)
n
->
data
=
data
;
n
->
version
=
version
;
n
->
state
=
st
;
n
->
start
=
addr
;
n
->
end
=
fstStateEndAddrForAnyTrans
(
&
st
,
version
,
slice
,
sz
,
nTrans
);
// s.end_addr(version, data, sz, ntrans);
n
->
end
=
fstStateEndAddrForAnyTrans
(
&
st
,
version
,
&
data
,
sz
,
nTrans
);
// s.end_addr(version, data, sz, ntrans);
n
->
isFinal
=
fstStateIsFinalState
(
&
st
);
// s.is_final_state();
n
->
nTrans
=
nTrans
;
n
->
sizes
=
sz
;
n
->
finalOutput
=
fstStateFinalOutput
(
&
st
,
version
,
slice
,
sz
,
nTrans
);
// s.final_output(version, data, sz, ntrans);
n
->
finalOutput
=
fstStateFinalOutput
(
&
st
,
version
,
&
data
,
sz
,
nTrans
);
// s.final_output(version, data, sz, ntrans);
}
return
n
;
}
...
...
@@ -771,7 +772,7 @@ FstBuilder *fstBuilderCreate(void *w, FstType ty) {
if
(
NULL
==
b
)
{
return
b
;
}
b
->
wrt
=
fstCountingWriterCreate
(
w
);
b
->
wrt
=
fstCountingWriterCreate
(
w
,
false
);
b
->
unfinished
=
fstUnFinishedNodesCreate
();
b
->
registry
=
fstRegistryCreate
(
10000
,
2
)
;
b
->
last
=
fstSliceCreate
(
NULL
,
0
);
...
...
@@ -1043,8 +1044,9 @@ bool fstGet(Fst *fst, FstSlice *b, Output *out) {
for
(
uint32_t
i
=
0
;
i
<
len
;
i
++
)
{
uint8_t
inp
=
data
[
i
];
Output
res
=
0
;
bool
null
=
fstNodeFindInput
(
root
,
inp
,
&
res
);
if
(
null
)
{
return
false
;
}
if
(
false
==
fstNodeFindInput
(
root
,
inp
,
&
res
))
{
return
false
;
}
FstTransition
trn
;
fstNodeGetTransitionAt
(
root
,
res
,
&
trn
);
...
...
source/libs/index/src/index_fst_counting_writer.c
浏览文件 @
1fe4cd22
...
...
@@ -31,17 +31,19 @@ static int writeCtxDoWrite(WriterCtx *ctx, uint8_t *buf, int len) {
return
len
;
}
static
int
writeCtxDoRead
(
WriterCtx
*
ctx
,
uint8_t
*
buf
,
int
len
)
{
int
nRead
=
0
;
if
(
ctx
->
type
==
TFile
)
{
tfRead
(
ctx
->
fd
,
buf
,
len
);
nRead
=
tfRead
(
ctx
->
fd
,
buf
,
len
);
}
else
{
memcpy
(
buf
,
ctx
->
mem
+
ctx
->
offset
,
len
);
}
ctx
->
offset
+=
len
;
ctx
->
offset
+=
nRead
;
return
1
;
return
nRead
;
}
static
int
writeCtxDoFlush
(
WriterCtx
*
ctx
)
{
if
(
ctx
->
type
==
TFile
)
{
//tfFsync(ctx->fd);
//tfFlush(ctx->fd);
}
else
{
// do nothing
...
...
@@ -49,14 +51,19 @@ static int writeCtxDoFlush(WriterCtx *ctx) {
return
1
;
}
WriterCtx
*
writerCtxCreate
(
WriterType
type
)
{
WriterCtx
*
writerCtxCreate
(
WriterType
type
,
bool
readOnly
)
{
WriterCtx
*
ctx
=
calloc
(
1
,
sizeof
(
WriterCtx
));
if
(
ctx
==
NULL
)
{
return
NULL
;
}
ctx
->
type
=
type
;
if
(
ctx
->
type
==
TFile
)
{
tfInit
();
ctx
->
fd
=
tfOpenCreateWriteAppend
(
tmpFile
);
// ugly code, refactor later
if
(
readOnly
==
false
)
{
ctx
->
fd
=
tfOpenCreateWriteAppend
(
tmpFile
);
}
else
{
ctx
->
fd
=
tfOpenReadWrite
(
tmpFile
);
}
if
(
ctx
->
fd
<
0
)
{
indexError
(
"open file error %d"
,
errno
);
}
...
...
@@ -76,35 +83,44 @@ void writerCtxDestroy(WriterCtx *ctx) {
if
(
ctx
->
type
==
TMemory
)
{
free
(
ctx
->
mem
);
}
else
{
tfCleanup
();
tfClose
(
ctx
->
fd
);
tfCleanup
();
}
free
(
ctx
);
}
FstCountingWriter
*
fstCountingWriterCreate
(
void
*
wrt
)
{
FstCountingWriter
*
fstCountingWriterCreate
(
void
*
wrt
,
bool
readOnly
)
{
FstCountingWriter
*
cw
=
calloc
(
1
,
sizeof
(
FstCountingWriter
));
if
(
cw
==
NULL
)
{
return
NULL
;
}
cw
->
wrt
=
(
void
*
)(
writerCtxCreate
(
TFile
));
cw
->
wrt
=
(
void
*
)(
writerCtxCreate
(
TFile
,
readOnly
));
return
cw
;
}
void
fstCountingWriterDestroy
(
FstCountingWriter
*
cw
)
{
// free wrt object: close fd or free mem
fstCountingWriterFlush
(
cw
);
writerCtxDestroy
((
WriterCtx
*
)(
cw
->
wrt
));
free
(
cw
);
}
int
fstCountingWriterWrite
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
bufL
en
)
{
int
fstCountingWriterWrite
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
l
en
)
{
if
(
write
==
NULL
)
{
return
0
;
}
// update checksum
// write data to file/socket or mem
WriterCtx
*
ctx
=
write
->
wrt
;
int
nWrite
=
ctx
->
write
(
ctx
,
buf
,
bufLen
);
write
->
count
+=
nWrite
;
return
bufLen
;
int
nWrite
=
ctx
->
write
(
ctx
,
buf
,
len
);
assert
(
nWrite
==
len
);
write
->
count
+=
len
;
return
len
;
}
int
fstCountingWriterRead
(
FstCountingWriter
*
write
,
uint8_t
*
buf
,
uint32_t
len
)
{
if
(
write
==
NULL
)
{
return
0
;
}
WriterCtx
*
ctx
=
write
->
wrt
;
int
nRead
=
ctx
->
read
(
ctx
,
buf
,
len
);
//assert(nRead == len);
return
nRead
;
}
uint32_t
fstCountingWriterMaskedCheckSum
(
FstCountingWriter
*
write
)
{
...
...
source/libs/index/src/index_fst_util.c
浏览文件 @
1fe4cd22
...
...
@@ -67,7 +67,7 @@ uint8_t packSize(uint64_t n) {
}
uint64_t
unpackUint64
(
uint8_t
*
ch
,
uint8_t
sz
)
{
uint64_t
n
;
uint64_t
n
=
0
;
for
(
uint8_t
i
=
0
;
i
<
sz
;
i
++
)
{
n
=
n
|
(
ch
[
i
]
<<
(
8
*
i
));
}
...
...
source/libs/index/test/indexTests.cpp
浏览文件 @
1fe4cd22
...
...
@@ -63,6 +63,7 @@
//}
int
main
(
int
argc
,
char
**
argv
)
{
// test write
FstBuilder
*
b
=
fstBuilderCreate
(
NULL
,
0
);
{
std
::
string
str
(
"aaa"
);
...
...
@@ -87,9 +88,42 @@ int main(int argc, char** argv) {
}
}
//fstBuilderInsert(b, key1, val2);
fstBuilderFinish
(
b
);
fstBuilderDestroy
(
b
);
char
buf
[
64
*
1024
]
=
{
0
};
FstSlice
s
;
FstCountingWriter
*
w
=
fstCountingWriterCreate
(
NULL
,
true
);
int
nRead
=
fstCountingWriterRead
(
w
,
(
uint8_t
*
)
buf
,
sizeof
(
buf
));
assert
(
nRead
<=
sizeof
(
buf
));
s
=
fstSliceCreate
((
uint8_t
*
)
buf
,
nRead
);
fstCountingWriterDestroy
(
w
);
// test reader
Fst
*
fst
=
fstCreate
(
&
s
);
{
std
::
string
str
(
"aaa"
);
uint64_t
out
;
FstSlice
key
=
fstSliceCreate
((
uint8_t
*
)
str
.
c_str
(),
str
.
size
());
bool
ok
=
fstGet
(
fst
,
&
key
,
&
out
);
if
(
ok
==
true
)
{
//indexInfo("Get key-value success, %s, %d", str.c_str(), out);
}
else
{
//indexError("Get key-value failed, %s", str.c_str());
}
}
fstSliceDestroy
(
&
s
);
return
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录