Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
哥们要飞
TDengine
提交
bc2c2c07
T
TDengine
项目概览
哥们要飞
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bc2c2c07
编写于
6月 01, 2021
作者:
X
xywang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-2574]<enhance>: refactored algorithms for top and bottom functions.
上级
43fd9b58
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
107 addition
and
94 deletion
+107
-94
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+107
-94
未找到文件。
src/query/src/qAggMain.c
浏览文件 @
bc2c2c07
...
...
@@ -2201,6 +2201,101 @@ static void valuePairAssign(tValuePair *dst, int16_t type, const char *val, int6
memcpy((dst)->pTags, (src)->pTags, (size_t)(__l)); \
} while (0)
static
void
heapSwap
(
tValuePair
*
a
,
tValuePair
*
b
,
const
int16_t
tagLen
)
{
char
tag
[
32768
];
tValuePair
temp
;
memset
(
tag
,
0
,
sizeof
(
tag
));
temp
.
pTags
=
tag
;
VALUEPAIRASSIGN
(
&
temp
,
a
,
tagLen
);
VALUEPAIRASSIGN
(
a
,
b
,
tagLen
);
VALUEPAIRASSIGN
(
b
,
&
temp
,
tagLen
);
}
static
void
heapAdjust
(
tValuePair
**
pList
,
uint16_t
type
,
int16_t
tagLen
,
int32_t
start
,
int32_t
end
,
bool
minRoot
)
{
int32_t
parent
=
start
;
int32_t
child
=
2
*
parent
+
1
;
while
(
child
<=
end
)
{
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
if
(
minRoot
)
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
i64
<
pList
[
child
+
1
]
->
v
.
i64
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
i64
>
pList
[
child
]
->
v
.
i64
)
{
break
;
}
}
else
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
i64
>=
pList
[
child
+
1
]
->
v
.
i64
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
i64
<=
pList
[
child
]
->
v
.
i64
)
{
break
;
}
}
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
))
{
if
(
minRoot
)
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
u64
<
pList
[
child
+
1
]
->
v
.
u64
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
u64
>
pList
[
child
]
->
v
.
u64
)
{
break
;
}
}
else
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
u64
>=
pList
[
child
+
1
]
->
v
.
u64
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
u64
<=
pList
[
child
]
->
v
.
u64
)
{
break
;
}
}
}
else
{
if
(
minRoot
)
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
dKey
<
pList
[
child
+
1
]
->
v
.
dKey
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
dKey
>
pList
[
child
]
->
v
.
dKey
)
{
break
;
}
}
else
{
if
(
child
+
1
<=
end
&&
pList
[
child
]
->
v
.
dKey
>=
pList
[
child
+
1
]
->
v
.
dKey
)
{
child
++
;
}
if
(
pList
[
parent
]
->
v
.
dKey
<=
pList
[
child
]
->
v
.
dKey
)
{
break
;
}
}
}
heapSwap
(
pList
[
parent
],
pList
[
child
],
tagLen
);
parent
=
child
;
child
=
parent
*
2
+
1
;
}
}
void
heapSort
(
tValuePair
**
pList
,
uint16_t
type
,
int16_t
tagLen
,
int32_t
len
,
bool
minRoot
)
{
int32_t
i
;
for
(
i
=
len
/
2
-
1
;
i
>=
0
;
i
--
)
{
heapAdjust
(
pList
,
type
,
i
,
tagLen
,
len
-
1
,
minRoot
);
}
/*
for (i = len - 1; i > 0; i--) {
heapSwap(pList[0], pList[i], tagsLen);
heapAdjust(pList, type, tagsLen, i - 1, minRoot);
}
*/
}
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
};
...
...
@@ -2210,59 +2305,17 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
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
);
heapSort
(
pList
,
type
,
pTagInfo
->
tagsLen
,
pInfo
->
num
+
1
,
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
);
heapAdjust
(
pList
,
type
,
pTagInfo
->
tagsLen
,
0
,
maxLen
-
1
,
0
);
}
}
}
...
...
@@ -2276,57 +2329,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
);
heapSort
(
pList
,
type
,
pTagInfo
->
tagsLen
,
pInfo
->
num
+
1
,
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
);
heapAdjust
(
pList
,
type
,
pTagInfo
->
tagsLen
,
0
,
maxLen
-
1
,
1
);
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录