Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
2a012b61
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
2a012b61
编写于
3月 28, 2022
作者:
dengyihao
提交者:
GitHub
3月 28, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #11055 from taosdata/feature/index_query
fst query
上级
09ab9cdc
0c5f2d1d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
215 addition
and
30 deletion
+215
-30
source/libs/index/inc/index_fst.h
source/libs/index/inc/index_fst.h
+7
-7
source/libs/index/src/index_fst.c
source/libs/index/src/index_fst.c
+4
-6
source/libs/index/src/index_fst_automation.c
source/libs/index/src/index_fst_automation.c
+12
-10
source/libs/index/test/fstTest.cc
source/libs/index/test/fstTest.cc
+192
-7
未找到文件。
source/libs/index/inc/index_fst.h
浏览文件 @
2a012b61
...
@@ -21,9 +21,9 @@ extern "C" {
...
@@ -21,9 +21,9 @@ extern "C" {
#endif
#endif
#include "indexInt.h"
#include "indexInt.h"
#include "index_fst_node.h"
#include "index_fst_automation.h"
#include "index_fst_automation.h"
#include "index_fst_counting_writer.h"
#include "index_fst_counting_writer.h"
#include "index_fst_node.h"
#include "index_fst_registry.h"
#include "index_fst_registry.h"
#include "index_fst_util.h"
#include "index_fst_util.h"
...
@@ -257,9 +257,9 @@ typedef struct FstMeta {
...
@@ -257,9 +257,9 @@ typedef struct FstMeta {
}
FstMeta
;
}
FstMeta
;
typedef
struct
Fst
{
typedef
struct
Fst
{
FstMeta
*
meta
;
FstMeta
*
meta
;
FstSlice
*
data
;
//
FstSlice
*
data
;
//
FstNode
*
root
;
//
FstNode
*
root
;
//
TdThreadMutex
mtx
;
TdThreadMutex
mtx
;
}
Fst
;
}
Fst
;
...
@@ -325,10 +325,10 @@ StreamWithStateResult* streamWithStateNextWith(StreamWithState* sws, StreamCallb
...
@@ -325,10 +325,10 @@ StreamWithStateResult* streamWithStateNextWith(StreamWithState* sws, StreamCallb
FstStreamBuilder
*
fstStreamBuilderCreate
(
Fst
*
fst
,
AutomationCtx
*
aut
);
FstStreamBuilder
*
fstStreamBuilderCreate
(
Fst
*
fst
,
AutomationCtx
*
aut
);
void
fstStreamBuilderDestroy
(
FstStreamBuilder
*
b
);
void
fstStreamBuilderDestroy
(
FstStreamBuilder
*
b
);
// set up bound range
// refator, simple code by marco
FstStreamBuilder
*
fstStreamBuilderRange
(
FstStreamBuilder
*
b
,
FstSlice
*
val
,
RangeType
type
);
// set up bound range
// refator later: to simple code by marco
void
fstStreamBuilderSetRange
(
FstStreamBuilder
*
b
,
FstSlice
*
val
,
RangeType
type
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/libs/index/src/index_fst.c
浏览文件 @
2a012b61
...
@@ -720,7 +720,6 @@ bool fstNodeFindInput(FstNode* node, uint8_t b, uint64_t* res) {
...
@@ -720,7 +720,6 @@ bool fstNodeFindInput(FstNode* node, uint8_t b, uint64_t* res) {
uint64_t
out
=
fstStateFindInput
(
st
,
node
,
b
,
&
null
);
uint64_t
out
=
fstStateFindInput
(
st
,
node
,
b
,
&
null
);
if
(
null
==
false
)
{
if
(
null
==
false
)
{
*
res
=
out
;
*
res
=
out
;
}
else
{
s
=
false
;
s
=
false
;
}
}
}
}
...
@@ -1184,7 +1183,7 @@ StreamWithState* streamWithStateCreate(Fst* fst, AutomationCtx* automation, FstB
...
@@ -1184,7 +1183,7 @@ StreamWithState* streamWithStateCreate(Fst* fst, AutomationCtx* automation, FstB
sws
->
aut
=
automation
;
sws
->
aut
=
automation
;
sws
->
inp
=
(
SArray
*
)
taosArrayInit
(
256
,
sizeof
(
uint8_t
));
sws
->
inp
=
(
SArray
*
)
taosArrayInit
(
256
,
sizeof
(
uint8_t
));
sws
->
emptyOutput
.
null
=
fals
e
;
sws
->
emptyOutput
.
null
=
tru
e
;
sws
->
emptyOutput
.
out
=
0
;
sws
->
emptyOutput
.
out
=
0
;
sws
->
stack
=
(
SArray
*
)
taosArrayInit
(
256
,
sizeof
(
StreamState
));
sws
->
stack
=
(
SArray
*
)
taosArrayInit
(
256
,
sizeof
(
StreamState
));
...
@@ -1317,7 +1316,7 @@ StreamWithStateResult* streamWithStateNextWith(StreamWithState* sws, StreamCallb
...
@@ -1317,7 +1316,7 @@ StreamWithStateResult* streamWithStateNextWith(StreamWithState* sws, StreamCallb
if
(
FST_NODE_ADDR
(
p
->
node
)
!=
fstGetRootAddr
(
sws
->
fst
))
{
if
(
FST_NODE_ADDR
(
p
->
node
)
!=
fstGetRootAddr
(
sws
->
fst
))
{
taosArrayPop
(
sws
->
inp
);
taosArrayPop
(
sws
->
inp
);
}
}
streamStateDestroy
(
p
);
//
streamStateDestroy(p);
continue
;
continue
;
}
}
FstTransition
trn
;
FstTransition
trn
;
...
@@ -1425,9 +1424,9 @@ void fstStreamBuilderDestroy(FstStreamBuilder* b) {
...
@@ -1425,9 +1424,9 @@ void fstStreamBuilderDestroy(FstStreamBuilder* b) {
taosMemoryFreeClear
(
b
->
max
);
taosMemoryFreeClear
(
b
->
max
);
taosMemoryFree
(
b
);
taosMemoryFree
(
b
);
}
}
FstStreamBuilder
*
fstStreamBuilder
Range
(
FstStreamBuilder
*
b
,
FstSlice
*
val
,
RangeType
type
)
{
void
fstStreamBuilderSet
Range
(
FstStreamBuilder
*
b
,
FstSlice
*
val
,
RangeType
type
)
{
if
(
b
==
NULL
)
{
if
(
b
==
NULL
)
{
return
NULL
;
return
;
}
}
if
(
type
==
GE
)
{
if
(
type
==
GE
)
{
b
->
min
->
type
=
Included
;
b
->
min
->
type
=
Included
;
...
@@ -1446,5 +1445,4 @@ FstStreamBuilder* fstStreamBuilderRange(FstStreamBuilder* b, FstSlice* val, Rang
...
@@ -1446,5 +1445,4 @@ FstStreamBuilder* fstStreamBuilderRange(FstStreamBuilder* b, FstSlice* val, Rang
fstSliceDestroy
(
&
(
b
->
max
->
data
));
fstSliceDestroy
(
&
(
b
->
max
->
data
));
b
->
max
->
data
=
fstSliceDeepCopy
(
val
,
0
,
FST_SLICE_LEN
(
val
)
-
1
);
b
->
max
->
data
=
fstSliceDeepCopy
(
val
,
0
,
FST_SLICE_LEN
(
val
)
-
1
);
}
}
return
b
;
}
}
source/libs/index/src/index_fst_automation.c
浏览文件 @
2a012b61
...
@@ -85,10 +85,20 @@ static void* prefixStart(AutomationCtx* ctx) {
...
@@ -85,10 +85,20 @@ static void* prefixStart(AutomationCtx* ctx) {
};
};
static
bool
prefixIsMatch
(
AutomationCtx
*
ctx
,
void
*
sv
)
{
static
bool
prefixIsMatch
(
AutomationCtx
*
ctx
,
void
*
sv
)
{
StartWithStateValue
*
ssv
=
(
StartWithStateValue
*
)
sv
;
StartWithStateValue
*
ssv
=
(
StartWithStateValue
*
)
sv
;
return
ssv
->
val
==
strlen
(
ctx
->
data
);
if
(
ssv
==
NULL
)
{
return
false
;
}
if
(
ssv
->
type
==
FST_INT
)
{
return
ssv
->
val
==
strlen
(
ctx
->
data
);
}
else
{
return
false
;
}
}
}
static
bool
prefixCanMatch
(
AutomationCtx
*
ctx
,
void
*
sv
)
{
static
bool
prefixCanMatch
(
AutomationCtx
*
ctx
,
void
*
sv
)
{
StartWithStateValue
*
ssv
=
(
StartWithStateValue
*
)
sv
;
StartWithStateValue
*
ssv
=
(
StartWithStateValue
*
)
sv
;
if
(
ssv
==
NULL
)
{
return
false
;
}
return
ssv
->
val
>=
0
;
return
ssv
->
val
>=
0
;
}
}
static
bool
prefixWillAlwaysMatch
(
AutomationCtx
*
ctx
,
void
*
state
)
{
return
true
;
}
static
bool
prefixWillAlwaysMatch
(
AutomationCtx
*
ctx
,
void
*
state
)
{
return
true
;
}
...
@@ -154,15 +164,7 @@ AutomationCtx* automCtxCreate(void* data, AutomationType atype) {
...
@@ -154,15 +164,7 @@ AutomationCtx* automCtxCreate(void* data, AutomationType atype) {
// add more search type
// add more search type
}
}
char
*
dst
=
NULL
;
ctx
->
data
=
(
data
!=
NULL
?
strdup
((
char
*
)
data
)
:
NULL
);
if
(
data
!=
NULL
)
{
char
*
src
=
(
char
*
)
data
;
size_t
len
=
strlen
(
src
);
dst
=
(
char
*
)
taosMemoryCalloc
(
1
,
len
*
sizeof
(
char
)
+
1
);
memcpy
(
dst
,
src
,
len
);
}
ctx
->
data
=
dst
;
ctx
->
type
=
atype
;
ctx
->
type
=
atype
;
ctx
->
stdata
=
(
void
*
)
sv
;
ctx
->
stdata
=
(
void
*
)
sv
;
return
ctx
;
return
ctx
;
...
...
source/libs/index/test/fstTest.cc
浏览文件 @
2a012b61
...
@@ -96,11 +96,36 @@ class FstReadMemory {
...
@@ -96,11 +96,36 @@ class FstReadMemory {
char
*
ch
=
(
char
*
)
fstSliceData
(
s
,
&
sz
);
char
*
ch
=
(
char
*
)
fstSliceData
(
s
,
&
sz
);
std
::
string
key
(
ch
,
sz
);
std
::
string
key
(
ch
,
sz
);
printf
(
"key: %s, val: %"
PRIu64
"
\n
"
,
key
.
c_str
(),
(
uint64_t
)(
rt
->
out
.
out
));
printf
(
"key: %s, val: %"
PRIu64
"
\n
"
,
key
.
c_str
(),
(
uint64_t
)(
rt
->
out
.
out
));
result
.
push_back
(
rt
->
out
.
out
);
swsResultDestroy
(
rt
);
swsResultDestroy
(
rt
);
}
}
for
(
size_t
i
=
0
;
i
<
result
.
size
();
i
++
)
{
return
true
;
}
bool
SearchRange
(
AutomationCtx
*
ctx
,
const
std
::
string
&
low
,
const
std
::
string
&
high
,
std
::
vector
<
uint64_t
>&
result
)
{
FstStreamBuilder
*
sb
=
fstSearch
(
_fst
,
ctx
);
FstSlice
l
=
fstSliceCreate
((
uint8_t
*
)
low
.
c_str
(),
low
.
size
());
FstSlice
h
=
fstSliceCreate
((
uint8_t
*
)
high
.
c_str
(),
high
.
size
());
// range [low, high);
fstStreamBuilderSetRange
(
sb
,
&
l
,
GE
);
fstStreamBuilderSetRange
(
sb
,
&
h
,
LT
);
fstSliceDestroy
(
&
l
);
fstSliceDestroy
(
&
h
);
StreamWithState
*
st
=
streamBuilderIntoStream
(
sb
);
StreamWithStateResult
*
rt
=
NULL
;
while
((
rt
=
streamWithStateNextWith
(
st
,
NULL
))
!=
NULL
)
{
// result.push_back((uint64_t)(rt->out.out));
FstSlice
*
s
=
&
rt
->
data
;
int32_t
sz
=
0
;
char
*
ch
=
(
char
*
)
fstSliceData
(
s
,
&
sz
);
std
::
string
key
(
ch
,
sz
);
printf
(
"key: %s, val: %"
PRIu64
"
\n
"
,
key
.
c_str
(),
(
uint64_t
)(
rt
->
out
.
out
));
result
.
push_back
(
rt
->
out
.
out
);
swsResultDestroy
(
rt
);
}
}
std
::
cout
<<
std
::
endl
;
return
true
;
return
true
;
}
}
bool
SearchWithTimeCostUs
(
AutomationCtx
*
ctx
,
std
::
vector
<
uint64_t
>&
result
)
{
bool
SearchWithTimeCostUs
(
AutomationCtx
*
ctx
,
std
::
vector
<
uint64_t
>&
result
)
{
...
@@ -233,7 +258,7 @@ void checkFstLongTerm() {
...
@@ -233,7 +258,7 @@ void checkFstLongTerm() {
// taosMemoryFree(ctx);
// taosMemoryFree(ctx);
// delete m;
// delete m;
}
}
void
checkFstCheckIterator
()
{
void
checkFstCheckIterator
1
()
{
FstWriter
*
fw
=
new
FstWriter
;
FstWriter
*
fw
=
new
FstWriter
;
int64_t
s
=
taosGetTimestampUs
();
int64_t
s
=
taosGetTimestampUs
();
int
count
=
2
;
int
count
=
2
;
...
@@ -243,8 +268,7 @@ void checkFstCheckIterator() {
...
@@ -243,8 +268,7 @@ void checkFstCheckIterator() {
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
fw
->
Put
(
"Hello world"
,
1
);
fw
->
Put
(
"Hello world"
,
1
);
fw
->
Put
(
"hello world"
,
2
);
fw
->
Put
(
"Hello worle"
,
2
);
fw
->
Put
(
"hello worle"
,
3
);
fw
->
Put
(
"hello worlf"
,
4
);
fw
->
Put
(
"hello worlf"
,
4
);
delete
fw
;
delete
fw
;
...
@@ -258,7 +282,7 @@ void checkFstCheckIterator() {
...
@@ -258,7 +282,7 @@ void checkFstCheckIterator() {
// prefix search
// prefix search
std
::
vector
<
uint64_t
>
result
;
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"H
"
,
AUTOMATION_PREFIX
);
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"H
e"
,
AUTOMATION_ALWAYS
);
m
->
Search
(
ctx
,
result
);
m
->
Search
(
ctx
,
result
);
std
::
cout
<<
"size: "
<<
result
.
size
()
<<
std
::
endl
;
std
::
cout
<<
"size: "
<<
result
.
size
()
<<
std
::
endl
;
// assert(result.size() == count);
// assert(result.size() == count);
...
@@ -269,6 +293,163 @@ void checkFstCheckIterator() {
...
@@ -269,6 +293,163 @@ void checkFstCheckIterator() {
taosMemoryFree
(
ctx
);
taosMemoryFree
(
ctx
);
delete
m
;
delete
m
;
}
}
void
checkFstCheckIterator2
()
{
FstWriter
*
fw
=
new
FstWriter
;
int64_t
s
=
taosGetTimestampUs
();
int
count
=
2
;
// Performance_fstWriteRecords(fw);
int64_t
e
=
taosGetTimestampUs
();
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
fw
->
Put
(
"a"
,
1
);
fw
->
Put
(
"b"
,
2
);
fw
->
Put
(
"c"
,
4
);
delete
fw
;
FstReadMemory
*
m
=
new
FstReadMemory
(
1024
*
64
);
if
(
m
->
init
()
==
false
)
{
std
::
cout
<<
"init readMemory failed"
<<
std
::
endl
;
delete
m
;
return
;
}
// prefix search
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"He"
,
AUTOMATION_ALWAYS
);
m
->
Search
(
ctx
,
result
);
std
::
cout
<<
"size: "
<<
result
.
size
()
<<
std
::
endl
;
// assert(result.size() == count);
for
(
int
i
=
0
;
i
<
result
.
size
();
i
++
)
{
// assert(result[i] == i); // check result
}
taosMemoryFree
(
ctx
);
delete
m
;
}
void
checkFstCheckIteratorPrefix
()
{
FstWriter
*
fw
=
new
FstWriter
;
int64_t
s
=
taosGetTimestampUs
();
int
count
=
2
;
// Performance_fstWriteRecords(fw);
int64_t
e
=
taosGetTimestampUs
();
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
fw
->
Put
(
"Hello world"
,
1
);
fw
->
Put
(
"Hello worle"
,
2
);
fw
->
Put
(
"hello worlf"
,
4
);
fw
->
Put
(
"ja"
,
4
);
fw
->
Put
(
"jb"
,
4
);
fw
->
Put
(
"jc"
,
4
);
fw
->
Put
(
"jddddddddd"
,
4
);
fw
->
Put
(
"jefffffff"
,
4
);
delete
fw
;
FstReadMemory
*
m
=
new
FstReadMemory
(
1024
*
64
);
if
(
m
->
init
()
==
false
)
{
std
::
cout
<<
"init readMemory failed"
<<
std
::
endl
;
delete
m
;
return
;
}
{
// prefix search
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"he"
,
AUTOMATION_PREFIX
);
m
->
Search
(
ctx
,
result
);
assert
(
result
.
size
()
==
1
);
taosMemoryFree
(
ctx
);
}
{
// prefix search
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"Hello"
,
AUTOMATION_PREFIX
);
m
->
Search
(
ctx
,
result
);
assert
(
result
.
size
()
==
2
);
taosMemoryFree
(
ctx
);
}
{
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"jddd"
,
AUTOMATION_PREFIX
);
m
->
Search
(
ctx
,
result
);
assert
(
result
.
size
()
==
1
);
taosMemoryFree
(
ctx
);
}
delete
m
;
}
void
checkFstCheckIteratorRange1
()
{
FstWriter
*
fw
=
new
FstWriter
;
int64_t
s
=
taosGetTimestampUs
();
int
count
=
2
;
// Performance_fstWriteRecords(fw);
int64_t
e
=
taosGetTimestampUs
();
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
fw
->
Put
(
"a"
,
1
);
fw
->
Put
(
"b"
,
2
);
fw
->
Put
(
"c"
,
3
);
fw
->
Put
(
"d"
,
4
);
fw
->
Put
(
"e"
,
5
);
delete
fw
;
FstReadMemory
*
m
=
new
FstReadMemory
(
1024
*
64
);
if
(
m
->
init
()
==
false
)
{
std
::
cout
<<
"init readMemory failed"
<<
std
::
endl
;
delete
m
;
return
;
}
{
// prefix search
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"he"
,
AUTOMATION_ALWAYS
);
// [b, e)
m
->
SearchRange
(
ctx
,
"b"
,
"e"
,
result
);
assert
(
result
.
size
()
==
3
);
taosMemoryFree
(
ctx
);
}
}
void
checkFstCheckIteratorRange2
()
{
FstWriter
*
fw
=
new
FstWriter
;
int64_t
s
=
taosGetTimestampUs
();
int
count
=
2
;
// Performance_fstWriteRecords(fw);
int64_t
e
=
taosGetTimestampUs
();
std
::
cout
<<
"insert data count : "
<<
count
<<
"elapas time: "
<<
e
-
s
<<
std
::
endl
;
fw
->
Put
(
"ab"
,
1
);
fw
->
Put
(
"bd"
,
2
);
fw
->
Put
(
"cdd"
,
3
);
fw
->
Put
(
"cde"
,
3
);
fw
->
Put
(
"ddd"
,
4
);
fw
->
Put
(
"ed"
,
5
);
delete
fw
;
FstReadMemory
*
m
=
new
FstReadMemory
(
1024
*
64
);
if
(
m
->
init
()
==
false
)
{
std
::
cout
<<
"init readMemory failed"
<<
std
::
endl
;
delete
m
;
return
;
}
{
// prefix search
std
::
vector
<
uint64_t
>
result
;
AutomationCtx
*
ctx
=
automCtxCreate
((
void
*
)
"he"
,
AUTOMATION_ALWAYS
);
// [b, e)
m
->
SearchRange
(
ctx
,
"b"
,
"ed"
,
result
);
assert
(
result
.
size
()
==
4
);
taosMemoryFree
(
ctx
);
}
}
void
fst_get
(
Fst
*
fst
)
{
void
fst_get
(
Fst
*
fst
)
{
for
(
int
i
=
0
;
i
<
10000
;
i
++
)
{
for
(
int
i
=
0
;
i
<
10000
;
i
++
)
{
...
@@ -332,7 +513,11 @@ int main(int argc, char* argv[]) {
...
@@ -332,7 +513,11 @@ int main(int argc, char* argv[]) {
// path suid colName ver
// path suid colName ver
// iterTFileReader(argv[1], argv[2], argv[3], argv[4]);
// iterTFileReader(argv[1], argv[2], argv[3], argv[4]);
//}
//}
checkFstCheckIterator
();
// checkFstCheckIterator1();
// checkFstCheckIterator2();
// checkFstCheckIteratorPrefix();
checkFstCheckIteratorRange1
();
checkFstCheckIteratorRange2
();
// checkFstLongTerm();
// checkFstLongTerm();
// checkFstPrefixSearch();
// checkFstPrefixSearch();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录