Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
3696d625
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看板
提交
3696d625
编写于
12月 11, 2020
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-2129]<fix>: fix the bug that twa query result is incorrect while the value is less than 0.
上级
9493b194
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
79 addition
and
68 deletion
+79
-68
src/client/src/tscFunctionImpl.c
src/client/src/tscFunctionImpl.c
+76
-66
src/query/inc/tsqlfunction.h
src/query/inc/tsqlfunction.h
+3
-2
未找到文件。
src/client/src/tscFunctionImpl.c
浏览文件 @
3696d625
...
...
@@ -3648,11 +3648,21 @@ static bool twa_function_setup(SQLFunctionCtx *pCtx) {
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
STwaInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
pInfo
->
lastKey
=
INT64_MIN
;
pInfo
->
p
.
key
=
INT64_MIN
;
pInfo
->
win
=
TSWINDOW_INITIALIZER
;
return
true
;
}
static
double
twa_get_area
(
SPoint1
s
,
SPoint1
e
)
{
if
((
s
.
val
>=
0
&&
e
.
val
>=
0
)
||
(
s
.
val
<=
0
&&
e
.
val
<=
0
))
{
return
(
s
.
val
+
e
.
val
)
*
(
e
.
key
-
s
.
key
)
/
2
;
}
double
x
=
(
s
.
val
-
s
.
key
)
*
e
.
key
/
(
s
.
val
-
e
.
key
);
double
val
=
(
s
.
val
*
(
x
-
s
.
key
)
+
e
.
val
*
(
e
.
key
-
x
))
/
2
;
return
val
;
}
static
int32_t
twa_function_impl
(
SQLFunctionCtx
*
pCtx
,
int32_t
tsIndex
,
int32_t
index
,
int32_t
size
)
{
int32_t
notNullElems
=
0
;
TSKEY
*
primaryKey
=
pCtx
->
ptsList
;
...
...
@@ -3663,28 +3673,29 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
int32_t
i
=
index
;
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pCtx
->
order
);
SPoint1
*
last
=
&
pInfo
->
p
;
if
(
pCtx
->
start
.
key
!=
INT64_MIN
)
{
assert
((
pCtx
->
start
.
key
<
primaryKey
[
tsIndex
+
i
]
&&
pCtx
->
order
==
TSDB_ORDER_ASC
)
||
(
pCtx
->
start
.
key
>
primaryKey
[
tsIndex
+
i
]
&&
pCtx
->
order
==
TSDB_ORDER_DESC
));
assert
(
pInfo
->
lastK
ey
==
INT64_MIN
);
assert
(
last
->
k
ey
==
INT64_MIN
);
pInfo
->
lastK
ey
=
primaryKey
[
tsIndex
+
i
];
GET_TYPED_DATA
(
pInfo
->
lastValue
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
last
->
k
ey
=
primaryKey
[
tsIndex
+
i
];
GET_TYPED_DATA
(
last
->
val
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
pInfo
->
dOutput
+=
((
pInfo
->
lastValue
+
pCtx
->
start
.
val
)
/
2
)
*
(
pInfo
->
lastKey
-
pCtx
->
start
.
key
);
pInfo
->
dOutput
+=
twa_get_area
(
pCtx
->
start
,
*
last
);
pInfo
->
hasResult
=
DATA_SET_FLAG
;
pInfo
->
win
.
skey
=
pCtx
->
start
.
key
;
notNullElems
++
;
i
+=
step
;
}
else
if
(
pInfo
->
lastK
ey
==
INT64_MIN
)
{
pInfo
->
lastK
ey
=
primaryKey
[
tsIndex
+
i
];
GET_TYPED_DATA
(
pInfo
->
lastValue
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
}
else
if
(
pInfo
->
p
.
k
ey
==
INT64_MIN
)
{
last
->
k
ey
=
primaryKey
[
tsIndex
+
i
];
GET_TYPED_DATA
(
last
->
val
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
pInfo
->
hasResult
=
DATA_SET_FLAG
;
pInfo
->
win
.
skey
=
pInfo
->
lastK
ey
;
pInfo
->
win
.
skey
=
last
->
k
ey
;
notNullElems
++
;
i
+=
step
;
}
...
...
@@ -3698,9 +3709,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3711,9 +3722,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3724,9 +3735,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3737,9 +3748,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
(
double
)
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3750,9 +3761,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3763,9 +3774,9 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
tsIndex
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
tsIndex
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
tsIndex
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3774,20 +3785,19 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t tsIndex, int32_t
// the last interpolated time window value
if
(
pCtx
->
end
.
key
!=
INT64_MIN
)
{
pInfo
->
dOutput
+=
((
pInfo
->
lastValue
+
pCtx
->
end
.
val
)
/
2
)
*
(
pCtx
->
end
.
key
-
pInfo
->
lastKey
);
pInfo
->
lastValue
=
pCtx
->
end
.
val
;
pInfo
->
lastKey
=
pCtx
->
end
.
key
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
pCtx
->
end
);
pInfo
->
p
=
pCtx
->
end
;
}
pInfo
->
win
.
ekey
=
pInfo
->
lastK
ey
;
pInfo
->
win
.
ekey
=
pInfo
->
p
.
k
ey
;
return
notNullElems
;
}
static
void
twa_function
(
SQLFunctionCtx
*
pCtx
)
{
void
*
data
=
GET_INPUT_CHAR
(
pCtx
);
void
*
data
=
GET_INPUT_CHAR
(
pCtx
);
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
STwaInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
STwaInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
// skip null value
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pCtx
->
order
);
...
...
@@ -3808,6 +3818,7 @@ static void twa_function(SQLFunctionCtx *pCtx) {
}
}
//TODO refactor
static
void
twa_function_f
(
SQLFunctionCtx
*
pCtx
,
int32_t
index
)
{
void
*
pData
=
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
);
if
(
pCtx
->
hasNull
&&
isNull
(
pData
,
pCtx
->
inputType
))
{
...
...
@@ -3824,23 +3835,23 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
int32_t
size
=
pCtx
->
size
;
if
(
pCtx
->
start
.
key
!=
INT64_MIN
)
{
assert
(
pInfo
->
lastK
ey
==
INT64_MIN
);
assert
(
pInfo
->
p
.
k
ey
==
INT64_MIN
);
pInfo
->
lastK
ey
=
primaryKey
[
index
];
GET_TYPED_DATA
(
pInfo
->
lastValue
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
pInfo
->
p
.
k
ey
=
primaryKey
[
index
];
GET_TYPED_DATA
(
pInfo
->
p
.
val
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
pInfo
->
dOutput
+=
((
pInfo
->
lastValue
+
pCtx
->
start
.
val
)
/
2
)
*
(
pInfo
->
lastKey
-
pCtx
->
start
.
key
);
pInfo
->
dOutput
+=
twa_get_area
(
pCtx
->
start
,
pInfo
->
p
);
pInfo
->
hasResult
=
DATA_SET_FLAG
;
pInfo
->
win
.
skey
=
pCtx
->
start
.
key
;
notNullElems
++
;
i
+=
1
;
}
else
if
(
pInfo
->
lastK
ey
==
INT64_MIN
)
{
pInfo
->
lastK
ey
=
primaryKey
[
index
];
GET_TYPED_DATA
(
pInfo
->
lastValue
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
}
else
if
(
pInfo
->
p
.
k
ey
==
INT64_MIN
)
{
pInfo
->
p
.
k
ey
=
primaryKey
[
index
];
GET_TYPED_DATA
(
pInfo
->
p
.
val
,
double
,
pCtx
->
inputType
,
GET_INPUT_CHAR_INDEX
(
pCtx
,
index
));
pInfo
->
hasResult
=
DATA_SET_FLAG
;
pInfo
->
win
.
skey
=
pInfo
->
lastK
ey
;
pInfo
->
win
.
skey
=
pInfo
->
p
.
k
ey
;
notNullElems
++
;
i
+=
1
;
}
...
...
@@ -3854,9 +3865,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3867,9 +3878,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3880,9 +3891,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3893,9 +3904,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
(
double
)
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3906,9 +3917,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
);
//((val[i] + pInfo->p.val) / 2) * (primaryKey[i + index] - pInfo->p.key)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3919,9 +3930,9 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
continue
;
}
pInfo
->
dOutput
+=
((
val
[
i
]
+
pInfo
->
lastValue
)
/
2
)
*
(
primaryKey
[
i
+
index
]
-
pInfo
->
lastKey
)
;
pInfo
->
lastValue
=
val
[
i
]
;
pInfo
->
lastKey
=
primaryKey
[
i
+
index
]
;
SPoint1
st
=
{.
key
=
primaryKey
[
i
+
index
],
.
val
=
val
[
i
]}
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
st
);
//((val[i] + pInfo->p.val) / 2) * (primaryKey[i + index] - pInfo->p.key)
;
pInfo
->
p
=
st
;
}
break
;
}
...
...
@@ -3930,12 +3941,11 @@ static void twa_function_f(SQLFunctionCtx *pCtx, int32_t index) {
// the last interpolated time window value
if
(
pCtx
->
end
.
key
!=
INT64_MIN
)
{
pInfo
->
dOutput
+=
((
pInfo
->
lastValue
+
pCtx
->
end
.
val
)
/
2
)
*
(
pCtx
->
end
.
key
-
pInfo
->
lastKey
);
pInfo
->
lastValue
=
pCtx
->
end
.
val
;
pInfo
->
lastKey
=
pCtx
->
end
.
key
;
pInfo
->
dOutput
+=
twa_get_area
(
pInfo
->
p
,
pCtx
->
end
);
//((pInfo->p.val + pCtx->end.val) / 2) * (pCtx->end.key - pInfo->p.key);
pInfo
->
p
=
pCtx
->
end
;
}
pInfo
->
win
.
ekey
=
pInfo
->
lastK
ey
;
pInfo
->
win
.
ekey
=
pInfo
->
p
.
k
ey
;
SET_VAL
(
pCtx
,
notNullElems
,
1
);
...
...
@@ -3966,7 +3976,7 @@ static void twa_func_merge(SQLFunctionCtx *pCtx) {
pBuf
->
dOutput
+=
pInput
->
dOutput
;
pBuf
->
win
=
pInput
->
win
;
pBuf
->
lastKey
=
pInput
->
lastKey
;
pBuf
->
p
=
pInput
->
p
;
}
SET_VAL
(
pCtx
,
numOfNotNull
,
1
);
...
...
@@ -3998,9 +4008,9 @@ void twa_function_finalizer(SQLFunctionCtx *pCtx) {
return
;
}
assert
(
pInfo
->
win
.
ekey
==
pInfo
->
lastK
ey
&&
pInfo
->
hasResult
==
pResInfo
->
hasResult
);
assert
(
pInfo
->
win
.
ekey
==
pInfo
->
p
.
k
ey
&&
pInfo
->
hasResult
==
pResInfo
->
hasResult
);
if
(
pInfo
->
win
.
ekey
==
pInfo
->
win
.
skey
)
{
*
(
double
*
)
pCtx
->
aOutputBuf
=
pInfo
->
lastValue
;
*
(
double
*
)
pCtx
->
aOutputBuf
=
pInfo
->
p
.
val
;
}
else
{
*
(
double
*
)
pCtx
->
aOutputBuf
=
pInfo
->
dOutput
/
(
pInfo
->
win
.
ekey
-
pInfo
->
win
.
skey
);
}
...
...
src/query/inc/tsqlfunction.h
浏览文件 @
3696d625
...
...
@@ -250,10 +250,11 @@ enum {
};
typedef
struct
STwaInfo
{
TSKEY
lastKey
;
//
TSKEY lastKey;
int8_t
hasResult
;
// flag to denote has value
double
dOutput
;
double
lastValue
;
// double lastValue;
SPoint1
p
;
STimeWindow
win
;
}
STwaInfo
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录