Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b62632f8
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看板
未验证
提交
b62632f8
编写于
7月 14, 2021
作者:
H
Haojun Liao
提交者:
GitHub
7月 14, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #6338 from taosdata/feature/TD-2574
[TD-2574]<enhance>: refactored algorithms for top and bottom functions.
上级
ae9eecf1
76e28e29
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
185 addition
and
105 deletion
+185
-105
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+56
-95
src/util/inc/talgo.h
src/util/inc/talgo.h
+33
-0
src/util/src/talgo.c
src/util/src/talgo.c
+86
-0
tests/script/general/parser/select_with_tags.sim
tests/script/general/parser/select_with_tags.sim
+10
-10
未找到文件。
src/query/src/qAggMain.c
浏览文件 @
b62632f8
...
...
@@ -1758,6 +1758,49 @@ static void valuePairAssign(tValuePair *dst, int16_t type, const char *val, int6
memcpy((dst)->pTags, (src)->pTags, (size_t)(__l)); \
} while (0)
static
int32_t
topBotComparFn
(
const
void
*
p1
,
const
void
*
p2
,
const
void
*
param
)
{
uint16_t
type
=
*
(
uint16_t
*
)
param
;
tValuePair
*
val1
=
*
(
tValuePair
**
)
p1
;
tValuePair
*
val2
=
*
(
tValuePair
**
)
p2
;
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
if
(
val1
->
v
.
i64
==
val2
->
v
.
i64
)
{
return
0
;
}
return
(
val1
->
v
.
i64
>
val2
->
v
.
i64
)
?
1
:
-
1
;
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
if
(
val1
->
v
.
u64
==
val2
->
v
.
u64
)
{
return
0
;
}
return
(
val1
->
v
.
u64
>
val2
->
v
.
u64
)
?
1
:
-
1
;
}
if
(
val1
->
v
.
dKey
==
val2
->
v
.
dKey
)
{
return
0
;
}
return
(
val1
->
v
.
dKey
>
val2
->
v
.
dKey
)
?
1
:
-
1
;
}
static
void
topBotSwapFn
(
void
*
dst
,
void
*
src
,
const
void
*
param
)
{
char
tag
[
32768
];
tValuePair
temp
;
uint16_t
tagLen
=
*
(
uint16_t
*
)
param
;
tValuePair
*
vdst
=
*
(
tValuePair
**
)
dst
;
tValuePair
*
vsrc
=
*
(
tValuePair
**
)
src
;
memset
(
tag
,
0
,
sizeof
(
tag
));
temp
.
pTags
=
tag
;
VALUEPAIRASSIGN
(
&
temp
,
vdst
,
tagLen
);
VALUEPAIRASSIGN
(
vdst
,
vsrc
,
tagLen
);
VALUEPAIRASSIGN
(
vsrc
,
&
temp
,
tagLen
);
}
static
void
do_top_function_add
(
STopBotInfo
*
pInfo
,
int32_t
maxLen
,
void
*
pData
,
int64_t
ts
,
uint16_t
type
,
SExtTagsInfo
*
pTagInfo
,
char
*
pTags
,
int16_t
stage
)
{
tVariant
val
=
{
0
};
...
...
@@ -1765,61 +1808,19 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
tValuePair
**
pList
=
pInfo
->
res
;
assert
(
pList
!=
NULL
);
if
(
pInfo
->
num
<
maxLen
)
{
if
(
pInfo
->
num
==
0
||
(
IS_SIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
i64
>=
pList
[
pInfo
->
num
-
1
]
->
v
.
i64
)
||
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
u64
>=
pList
[
pInfo
->
num
-
1
]
->
v
.
u64
)
||
(
IS_FLOAT_TYPE
(
type
)
&&
val
.
dKey
>=
pList
[
pInfo
->
num
-
1
]
->
v
.
dKey
))
{
valuePairAssign
(
pList
[
pInfo
->
num
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
}
else
{
int32_t
i
=
pInfo
->
num
-
1
;
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
i64
>
val
.
i64
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
u64
>
val
.
u64
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
else
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
dKey
>
val
.
dKey
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
valuePairAssign
(
pList
[
i
+
1
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
}
valuePairAssign
(
pList
[
pInfo
->
num
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
taosheapsort
((
void
*
)
pList
,
sizeof
(
tValuePair
**
),
pInfo
->
num
+
1
,
(
const
void
*
)
&
type
,
topBotComparFn
,
(
const
void
*
)
&
pTagInfo
->
tagsLen
,
topBotSwapFn
,
0
);
pInfo
->
num
++
;
}
else
{
int32_t
i
=
0
;
if
((
IS_SIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
i64
>
pList
[
0
]
->
v
.
i64
)
||
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
u64
>
pList
[
0
]
->
v
.
u64
)
||
(
IS_FLOAT_TYPE
(
type
)
&&
val
.
dKey
>
pList
[
0
]
->
v
.
dKey
))
{
// find the appropriate the slot position
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
i64
<
val
.
i64
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
u64
<
val
.
u64
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
else
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
dKey
<
val
.
dKey
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
valuePairAssign
(
pList
[
i
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
valuePairAssign
(
pList
[
0
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
taosheapadjust
((
void
*
)
pList
,
sizeof
(
tValuePair
**
),
0
,
maxLen
-
1
,
(
const
void
*
)
&
type
,
topBotComparFn
,
(
const
void
*
)
&
pTagInfo
->
tagsLen
,
topBotSwapFn
,
0
);
}
}
}
...
...
@@ -1833,57 +1834,17 @@ static void do_bottom_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pDa
assert
(
pList
!=
NULL
);
if
(
pInfo
->
num
<
maxLen
)
{
if
(
pInfo
->
num
==
0
)
{
valuePairAssign
(
pList
[
pInfo
->
num
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
}
else
{
int32_t
i
=
pInfo
->
num
-
1
;
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
i64
<
val
.
i64
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
u64
<
val
.
u64
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
else
{
while
(
i
>=
0
&&
pList
[
i
]
->
v
.
dKey
<
val
.
dKey
)
{
VALUEPAIRASSIGN
(
pList
[
i
+
1
],
pList
[
i
],
pTagInfo
->
tagsLen
);
i
-=
1
;
}
}
valuePairAssign
(
pList
[
i
+
1
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
}
valuePairAssign
(
pList
[
pInfo
->
num
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
taosheapsort
((
void
*
)
pList
,
sizeof
(
tValuePair
**
),
pInfo
->
num
+
1
,
(
const
void
*
)
&
type
,
topBotComparFn
,
(
const
void
*
)
&
pTagInfo
->
tagsLen
,
topBotSwapFn
,
1
);
pInfo
->
num
++
;
}
else
{
int32_t
i
=
0
;
if
((
IS_SIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
i64
<
pList
[
0
]
->
v
.
i64
)
||
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
u64
<
pList
[
0
]
->
v
.
u64
)
||
(
IS_FLOAT_TYPE
(
type
)
&&
val
.
dKey
<
pList
[
0
]
->
v
.
dKey
))
{
// find the appropriate the slot position
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
i64
>
val
.
i64
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
u64
>
val
.
u64
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
else
{
while
(
i
+
1
<
maxLen
&&
pList
[
i
+
1
]
->
v
.
dKey
>
val
.
dKey
)
{
VALUEPAIRASSIGN
(
pList
[
i
],
pList
[
i
+
1
],
pTagInfo
->
tagsLen
);
i
+=
1
;
}
}
valuePairAssign
(
pList
[
i
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
valuePairAssign
(
pList
[
0
],
type
,
(
const
char
*
)
&
val
.
i64
,
ts
,
pTags
,
pTagInfo
,
stage
);
taosheapadjust
((
void
*
)
pList
,
sizeof
(
tValuePair
**
),
0
,
maxLen
-
1
,
(
const
void
*
)
&
type
,
topBotComparFn
,
(
const
void
*
)
&
pTagInfo
->
tagsLen
,
topBotSwapFn
,
1
);
}
}
}
...
...
src/util/inc/talgo.h
浏览文件 @
b62632f8
...
...
@@ -34,6 +34,7 @@ typedef int (*__compar_fn_t) (const void *, const void *);
#define elePtrAt(base, size, idx) (void *)((char *)(base) + (size) * (idx))
typedef
int32_t
(
*
__ext_compar_fn_t
)(
const
void
*
p1
,
const
void
*
p2
,
const
void
*
param
);
typedef
void
(
*
__ext_swap_fn_t
)(
void
*
p1
,
void
*
p2
,
const
void
*
param
);
/**
* quick sort, with the compare function requiring additional parameters support
...
...
@@ -59,6 +60,38 @@ void taosqsort(void *src, size_t numOfElem, size_t size, const void* param, __ex
*/
void
*
taosbsearch
(
const
void
*
key
,
const
void
*
base
,
size_t
nmemb
,
size_t
size
,
__compar_fn_t
fn
,
int
flags
);
/**
* adjust heap
*
* @param base: the start address of array
* @param size: size of every item in array
* @param start: the first index
* @param end: the last index
* @param parcompar: parameters for compare function
* @param compar: user defined compare function
* @param parswap: parameters for swap function
* @param swap: user defined swap function, the default swap function doswap will be used if swap is NULL
* @param maxroot: if heap is max root heap
* @return
*/
void
taosheapadjust
(
void
*
base
,
int32_t
size
,
int32_t
start
,
int32_t
end
,
const
void
*
parcompar
,
__ext_compar_fn_t
compar
,
const
void
*
parswap
,
__ext_swap_fn_t
swap
,
bool
maxroot
);
/**
* sort heap to make sure it is a max/min root heap
*
* @param base: the start address of array
* @param size: size of every item in array
* @param len: the length of array
* @param parcompar: parameters for compare function
* @param compar: user defined compare function
* @param parswap: parameters for swap function
* @param swap: user defined swap function, the default swap function doswap will be used if swap is NULL
* @param maxroot: if heap is max root heap
* @return
*/
void
taosheapsort
(
void
*
base
,
int32_t
size
,
int32_t
len
,
const
void
*
parcompar
,
__ext_compar_fn_t
compar
,
const
void
*
parswap
,
__ext_swap_fn_t
swap
,
bool
maxroot
);
#ifdef __cplusplus
}
#endif
...
...
src/util/src/talgo.c
浏览文件 @
b62632f8
...
...
@@ -225,3 +225,89 @@ void * taosbsearch(const void *key, const void *base, size_t nmemb, size_t size,
return
NULL
;
}
void
taosheapadjust
(
void
*
base
,
int32_t
size
,
int32_t
start
,
int32_t
end
,
const
void
*
parcompar
,
__ext_compar_fn_t
compar
,
const
void
*
parswap
,
__ext_swap_fn_t
swap
,
bool
maxroot
)
{
int32_t
parent
;
int32_t
child
;
char
*
buf
;
if
(
base
&&
size
>
0
&&
compar
)
{
parent
=
start
;
child
=
2
*
parent
+
1
;
if
(
swap
==
NULL
)
{
buf
=
calloc
(
1
,
size
);
if
(
buf
==
NULL
)
{
return
;
}
}
if
(
maxroot
)
{
while
(
child
<=
end
)
{
if
(
child
+
1
<=
end
&&
(
*
compar
)(
elePtrAt
(
base
,
size
,
child
),
elePtrAt
(
base
,
size
,
child
+
1
),
parcompar
)
<
0
)
{
child
++
;
}
if
((
*
compar
)(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
parcompar
)
>
0
)
{
break
;
}
if
(
swap
==
NULL
)
{
doswap
(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
size
,
buf
);
}
else
{
(
*
swap
)(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
parswap
);
}
parent
=
child
;
child
=
2
*
parent
+
1
;
}
}
else
{
while
(
child
<=
end
)
{
if
(
child
+
1
<=
end
&&
(
*
compar
)(
elePtrAt
(
base
,
size
,
child
),
elePtrAt
(
base
,
size
,
child
+
1
),
parcompar
)
>
0
)
{
child
++
;
}
if
((
*
compar
)(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
parcompar
)
<
0
)
{
break
;
}
if
(
swap
==
NULL
)
{
doswap
(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
size
,
buf
);
}
else
{
(
*
swap
)(
elePtrAt
(
base
,
size
,
parent
),
elePtrAt
(
base
,
size
,
child
),
parswap
);
}
parent
=
child
;
child
=
2
*
parent
+
1
;
}
}
if
(
swap
==
NULL
)
{
tfree
(
buf
);
}
}
}
void
taosheapsort
(
void
*
base
,
int32_t
size
,
int32_t
len
,
const
void
*
parcompar
,
__ext_compar_fn_t
compar
,
const
void
*
parswap
,
__ext_swap_fn_t
swap
,
bool
maxroot
)
{
int32_t
i
;
if
(
base
&&
size
>
0
)
{
for
(
i
=
len
/
2
-
1
;
i
>=
0
;
i
--
)
{
taosheapadjust
(
base
,
size
,
i
,
len
-
1
,
parcompar
,
compar
,
parswap
,
swap
,
maxroot
);
}
}
/*
char *buf = calloc(1, size);
for (i = len - 1; i > 0; i--) {
doswap(elePtrAt(base, size, 0), elePtrAt(base, size, i));
taosheapadjust(base, size, 0, i - 1, parcompar, compar, parswap, swap, maxroot);
}
tfree(buf);
*/
}
tests/script/general/parser/select_with_tags.sim
浏览文件 @
b62632f8
...
...
@@ -190,32 +190,32 @@ if $rows != 12800 then
return -1
endi
sql select top(c1,
10
0), tbname, t1, t2 from select_tags_mt0;
if $rows !=
10
0 then
sql select top(c1,
8
0), tbname, t1, t2 from select_tags_mt0;
if $rows !=
8
0 then
return -1
endi
if $data00 != @70-01-01 08:03:
3
0.100@ then
if $data00 != @70-01-01 08:03:
4
0.100@ then
return -1
endi
if $data10 != @70-01-01 08:03:
3
0.200@ then
if $data10 != @70-01-01 08:03:
4
0.200@ then
return -1
endi
if $data01 != 11
0
then
if $data01 != 11
1
then
return -1
endi
if $data02 != @select_tags_tb1
1
@ then
if $data02 != @select_tags_tb1
2
@ then
return -1
endi
if $data03 != 1
1
then
if $data03 != 1
2
then
return -1
endi
if $data04 != @abc1
1
@ then
if $data04 != @abc1
2
@ then
return -1
endi
...
...
@@ -248,8 +248,8 @@ if $data04 != @abc12@ then
return -1
endi
sql select bottom(c1,
100
), tbname, t1, t2 from select_tags_mt0;
if $rows !=
100
then
sql select bottom(c1,
72
), tbname, t1, t2 from select_tags_mt0;
if $rows !=
72
then
return -1
endi
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录