Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
6adc19d4
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
提交
6adc19d4
编写于
6月 25, 2022
作者:
S
slzhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: overlapping intervals problem
上级
1d7bf59f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
30 addition
and
21 deletion
+30
-21
source/libs/executor/src/timewindowoperator.c
source/libs/executor/src/timewindowoperator.c
+30
-21
未找到文件。
source/libs/executor/src/timewindowoperator.c
浏览文件 @
6adc19d4
...
...
@@ -3900,18 +3900,22 @@ _error:
// merge interval operator
typedef
struct
SMergeIntervalAggOperatorInfo
{
SIntervalAggOperatorInfo
intervalAggOperatorInfo
;
SHashObj
*
groupIntervalHash
;
void
*
groupIntervalIter
;
SList
*
groupIntervals
;
SListIter
groupIntervalsIter
;
bool
hasGroupId
;
uint64_t
groupId
;
SSDataBlock
*
prefetchedBlock
;
bool
inputBlocksFinished
;
}
SMergeIntervalAggOperatorInfo
;
typedef
struct
SGroupTimeWindow
{
uint64_t
groupId
;
STimeWindow
window
;
}
SGroupTimeWindow
;
void
destroyMergeIntervalOperatorInfo
(
void
*
param
,
int32_t
numOfOutput
)
{
SMergeIntervalAggOperatorInfo
*
miaInfo
=
(
SMergeIntervalAggOperatorInfo
*
)
param
;
t
aosHashCleanup
(
miaInfo
->
groupIntervalHash
);
t
dListFree
(
miaInfo
->
groupIntervals
);
destroyIntervalOperatorInfo
(
&
miaInfo
->
intervalAggOperatorInfo
,
numOfOutput
);
}
...
...
@@ -3940,15 +3944,22 @@ static int32_t outputPrevIntervalResult(SOperatorInfo* pOperatorInfo, uint64_t t
bool
ascScan
=
(
iaInfo
->
order
==
TSDB_ORDER_ASC
);
SExprSupp
*
pExprSup
=
&
pOperatorInfo
->
exprSupp
;
STimeWindow
*
prevWin
=
taosHashGet
(
miaInfo
->
groupIntervalHash
,
&
tableGroupId
,
sizeof
(
tableGroupId
));
if
(
prevWin
==
NULL
)
{
taosHashPut
(
miaInfo
->
groupIntervalHash
,
&
tableGroupId
,
sizeof
(
tableGroupId
),
newWin
,
sizeof
(
STimeWindow
));
return
0
;
}
SGroupTimeWindow
groupTimeWindow
=
{.
groupId
=
tableGroupId
,
.
window
=
*
newWin
};
tdListAppend
(
miaInfo
->
groupIntervals
,
&
groupTimeWindow
);
if
((
ascScan
&&
newWin
->
skey
>
prevWin
->
skey
||
(
!
ascScan
)
&&
newWin
->
skey
<
prevWin
->
skey
))
{
finalizeWindowResult
(
pOperatorInfo
,
tableGroupId
,
prevWin
,
pResultBlock
);
taosHashPut
(
miaInfo
->
groupIntervalHash
,
&
tableGroupId
,
sizeof
(
tableGroupId
),
newWin
,
sizeof
(
STimeWindow
));
SListIter
iter
=
{
0
};
tdListInitIter
(
miaInfo
->
groupIntervals
,
&
iter
,
TD_LIST_FORWARD
);
SListNode
*
listNode
=
NULL
;
while
((
listNode
=
tdListNext
(
&
iter
))
!=
NULL
)
{
SGroupTimeWindow
*
prevGrpWin
=
(
SGroupTimeWindow
*
)
listNode
->
data
;
if
(
prevGrpWin
->
groupId
!=
tableGroupId
)
{
continue
;
}
STimeWindow
*
prevWin
=
&
prevGrpWin
->
window
;
if
((
ascScan
&&
newWin
->
skey
>
prevWin
->
ekey
||
(
!
ascScan
)
&&
newWin
->
skey
<
prevWin
->
ekey
))
{
finalizeWindowResult
(
pOperatorInfo
,
tableGroupId
,
prevWin
,
pResultBlock
);
tdListPopNode
(
miaInfo
->
groupIntervals
,
listNode
);
}
}
return
0
;
...
...
@@ -4075,6 +4086,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
if
(
pBlock
==
NULL
)
{
tdListInitIter
(
miaInfo
->
groupIntervals
,
&
miaInfo
->
groupIntervalsIter
,
TD_LIST_FORWARD
);
miaInfo
->
inputBlocksFinished
=
true
;
break
;
}
...
...
@@ -4100,14 +4112,12 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
if
(
miaInfo
->
inputBlocksFinished
)
{
void
*
win
=
taosHashIterate
(
miaInfo
->
groupIntervalHash
,
miaInfo
->
groupIntervalIter
);
if
(
win
!=
NULL
)
{
miaInfo
->
groupIntervalIter
=
win
;
SListNode
*
listNode
=
tdListNext
(
&
miaInfo
->
groupIntervalsIter
);
size_t
len
=
0
;
uint64_t
*
pTableGroupId
=
taosHashGetKey
(
win
,
&
len
);
finalizeWindowResult
(
pOperator
,
*
pTableGroupId
,
win
,
pRes
);
pRes
->
info
.
groupId
=
*
pTableG
roupId
;
if
(
listNode
!=
NULL
)
{
SGroupTimeWindow
*
grpWin
=
(
SGroupTimeWindow
*
)(
listNode
->
data
);
finalizeWindowResult
(
pOperator
,
grpWin
->
groupId
,
&
grpWin
->
window
,
pRes
);
pRes
->
info
.
groupId
=
grpWin
->
g
roupId
;
}
}
...
...
@@ -4129,8 +4139,7 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprI
goto
_error
;
}
miaInfo
->
groupIntervalHash
=
taosHashInit
(
128
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
true
,
HASH_NO_LOCK
);
miaInfo
->
groupIntervalIter
=
NULL
;
miaInfo
->
groupIntervals
=
tdListNew
(
sizeof
(
SGroupTimeWindow
));
SIntervalAggOperatorInfo
*
iaInfo
=
&
miaInfo
->
intervalAggOperatorInfo
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录