Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
36ccd827
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看板
提交
36ccd827
编写于
10月 08, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-10529] move expr & arithoperator to other place.
上级
819c7fc0
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
517 addition
and
0 deletion
+517
-0
source/libs/executor/inc/texpr.h
source/libs/executor/inc/texpr.h
+106
-0
source/libs/executor/src/tarithoperator.c
source/libs/executor/src/tarithoperator.c
+411
-0
未找到文件。
source/libs/executor/inc/texpr.h
0 → 100644
浏览文件 @
36ccd827
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TD_COMMON_EXPR_H_
#define _TD_COMMON_EXPR_H_
#ifdef __cplusplus
extern
"C"
{
#endif
#include "os.h"
#include "taosmsg.h"
#include "taosdef.h"
#include "tskiplist.h"
#include "tbuffer.h"
struct
tExprNode
;
struct
SSchema
;
#define QUERY_COND_REL_PREFIX_IN "IN|"
#define QUERY_COND_REL_PREFIX_LIKE "LIKE|"
#define QUERY_COND_REL_PREFIX_MATCH "MATCH|"
#define QUERY_COND_REL_PREFIX_NMATCH "NMATCH|"
#define QUERY_COND_REL_PREFIX_IN_LEN 3
#define QUERY_COND_REL_PREFIX_LIKE_LEN 5
#define QUERY_COND_REL_PREFIX_MATCH_LEN 6
#define QUERY_COND_REL_PREFIX_NMATCH_LEN 7
typedef
bool
(
*
__result_filter_fn_t
)(
const
void
*
,
void
*
);
typedef
void
(
*
__do_filter_suppl_fn_t
)(
void
*
,
void
*
);
enum
{
TSQL_NODE_DUMMY
=
0x0
,
TSQL_NODE_EXPR
=
0x1
,
TSQL_NODE_COL
=
0x2
,
TSQL_NODE_VALUE
=
0x4
,
};
/**
* this structure is used to filter data in tags, so the offset of filtered tag column in tagdata string is required
*/
typedef
struct
tQueryInfo
{
uint8_t
optr
;
// expression operator
SSchema
sch
;
// schema of tags
char
*
q
;
__compar_fn_t
compare
;
// filter function
bool
indexed
;
// indexed columns
}
tQueryInfo
;
typedef
struct
tExprNode
{
uint8_t
nodeType
;
union
{
struct
{
uint8_t
optr
;
// filter operator
uint8_t
hasPK
;
// 0: do not contain primary filter, 1: contain
void
*
info
;
// support filter operation on this expression only available for leaf node
struct
tExprNode
*
pLeft
;
// left child pointer
struct
tExprNode
*
pRight
;
// right child pointer
}
_node
;
SSchema
*
pSchema
;
struct
SVariant
*
pVal
;
};
}
tExprNode
;
typedef
struct
SExprTraverseSupp
{
__result_filter_fn_t
nodeFilterFn
;
__do_filter_suppl_fn_t
setupInfoFn
;
void
*
pExtInfo
;
}
SExprTraverseSupp
;
void
tExprTreeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprTreeFromTableName
(
const
char
*
tbnameCond
);
tExprNode
*
exprdup
(
tExprNode
*
pTree
);
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
bool
exprTreeApplyFilter
(
tExprNode
*
pExpr
,
const
void
*
pItem
,
SExprTraverseSupp
*
param
);
void
arithmeticTreeTraverse
(
tExprNode
*
pExprs
,
int32_t
numOfRows
,
char
*
pOutput
,
void
*
param
,
int32_t
order
,
char
*
(
*
cb
)(
void
*
,
const
char
*
,
int32_t
));
void
buildFilterSetFromBinary
(
void
**
q
,
const
char
*
buf
,
int32_t
len
);
#ifdef __cplusplus
}
#endif
#endif
/*_TD_COMMON_EXPR_H_*/
source/libs/executor/src/tarithoperator.c
0 → 100644
浏览文件 @
36ccd827
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
#include "ttypes.h"
#include "tarithoperator.h"
#include "tcompare.h"
//GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i]));
void
calc_i32_i32_add
(
void
*
left
,
void
*
right
,
int32_t
numLeft
,
int32_t
numRight
,
void
*
output
,
int32_t
order
)
{
int32_t
*
pLeft
=
(
int32_t
*
)
left
;
int32_t
*
pRight
=
(
int32_t
*
)
right
;
double
*
pOutput
=
(
double
*
)
output
;
int32_t
i
=
(
order
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
numLeft
,
numRight
)
-
1
;
int32_t
step
=
(
order
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
if
(
numLeft
==
numRight
)
{
for
(;
i
>=
0
&&
i
<
numRight
;
i
+=
step
,
pOutput
+=
1
)
{
if
(
isNull
((
char
*
)
&
(
pLeft
[
i
]),
TSDB_DATA_TYPE_INT
)
||
isNull
((
char
*
)
&
(
pRight
[
i
]),
TSDB_DATA_TYPE_INT
))
{
SET_DOUBLE_NULL
(
pOutput
);
continue
;
}
*
pOutput
=
(
double
)
pLeft
[
i
]
+
pRight
[
i
];
}
}
else
if
(
numLeft
==
1
)
{
for
(;
i
>=
0
&&
i
<
numRight
;
i
+=
step
,
pOutput
+=
1
)
{
if
(
isNull
((
char
*
)(
pLeft
),
TSDB_DATA_TYPE_INT
)
||
isNull
((
char
*
)
&
(
pRight
[
i
]),
TSDB_DATA_TYPE_INT
))
{
SET_DOUBLE_NULL
(
pOutput
);
continue
;
}
*
pOutput
=
(
double
)
pLeft
[
0
]
+
pRight
[
i
];
}
}
else
if
(
numRight
==
1
)
{
for
(;
i
>=
0
&&
i
<
numLeft
;
i
+=
step
,
pOutput
+=
1
)
{
if
(
isNull
((
char
*
)
&
(
pLeft
[
i
]),
TSDB_DATA_TYPE_INT
)
||
isNull
((
char
*
)(
pRight
),
TSDB_DATA_TYPE_INT
))
{
SET_DOUBLE_NULL
(
pOutput
);
continue
;
}
*
pOutput
=
(
double
)
pLeft
[
i
]
+
pRight
[
0
];
}
}
}
typedef
double
(
*
_arithmetic_getVectorDoubleValue_fn_t
)(
void
*
src
,
int32_t
index
);
double
getVectorDoubleValue_TINYINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
int8_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_UTINYINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
uint8_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_SMALLINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
int16_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_USMALLINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
uint16_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_INT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
int32_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_UINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
uint32_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_BIGINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
int64_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_UBIGINT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
uint64_t
*
)
src
+
index
);
}
double
getVectorDoubleValue_FLOAT
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
float
*
)
src
+
index
);
}
double
getVectorDoubleValue_DOUBLE
(
void
*
src
,
int32_t
index
)
{
return
(
double
)
*
((
double
*
)
src
+
index
);
}
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFn
(
int32_t
srcType
)
{
_arithmetic_getVectorDoubleValue_fn_t
p
=
NULL
;
if
(
srcType
==
TSDB_DATA_TYPE_TINYINT
)
{
p
=
getVectorDoubleValue_TINYINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UTINYINT
)
{
p
=
getVectorDoubleValue_UTINYINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_SMALLINT
)
{
p
=
getVectorDoubleValue_SMALLINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_USMALLINT
)
{
p
=
getVectorDoubleValue_USMALLINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_INT
)
{
p
=
getVectorDoubleValue_INT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UINT
)
{
p
=
getVectorDoubleValue_UINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_BIGINT
)
{
p
=
getVectorDoubleValue_BIGINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UBIGINT
)
{
p
=
getVectorDoubleValue_UBIGINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_FLOAT
)
{
p
=
getVectorDoubleValue_FLOAT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_DOUBLE
)
{
p
=
getVectorDoubleValue_DOUBLE
;
}
else
{
assert
(
0
);
}
return
p
;
}
typedef
void
*
(
*
_arithmetic_getVectorValueAddr_fn_t
)(
void
*
src
,
int32_t
index
);
void
*
getVectorValueAddr_TINYINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
int8_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_UTINYINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
uint8_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_SMALLINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
int16_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_USMALLINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
uint16_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_INT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
int32_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_UINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
uint32_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_BIGINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
int64_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_UBIGINT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
uint64_t
*
)
src
+
index
);
}
void
*
getVectorValueAddr_FLOAT
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
float
*
)
src
+
index
);
}
void
*
getVectorValueAddr_DOUBLE
(
void
*
src
,
int32_t
index
)
{
return
(
void
*
)((
double
*
)
src
+
index
);
}
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFn
(
int32_t
srcType
)
{
_arithmetic_getVectorValueAddr_fn_t
p
=
NULL
;
if
(
srcType
==
TSDB_DATA_TYPE_TINYINT
)
{
p
=
getVectorValueAddr_TINYINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UTINYINT
)
{
p
=
getVectorValueAddr_UTINYINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_SMALLINT
)
{
p
=
getVectorValueAddr_SMALLINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_USMALLINT
)
{
p
=
getVectorValueAddr_USMALLINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_INT
)
{
p
=
getVectorValueAddr_INT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UINT
)
{
p
=
getVectorValueAddr_UINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_BIGINT
)
{
p
=
getVectorValueAddr_BIGINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_UBIGINT
)
{
p
=
getVectorValueAddr_UBIGINT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_FLOAT
)
{
p
=
getVectorValueAddr_FLOAT
;
}
else
if
(
srcType
==
TSDB_DATA_TYPE_DOUBLE
)
{
p
=
getVectorValueAddr_DOUBLE
;
}
else
{
assert
(
0
);
}
return
p
;
}
void
vectorAdd
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnLeft
=
getVectorDoubleValueFn
(
_left_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnRight
=
getVectorDoubleValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
+
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
0
)
+
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
+
getVectorDoubleValueFnRight
(
right
,
0
));
}
}
}
void
vectorSub
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnLeft
=
getVectorDoubleValueFn
(
_left_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnRight
=
getVectorDoubleValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
-
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
0
)
-
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
-
getVectorDoubleValueFnRight
(
right
,
0
));
}
}
}
void
vectorMultiply
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnLeft
=
getVectorDoubleValueFn
(
_left_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnRight
=
getVectorDoubleValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
*
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
0
)
*
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
*
getVectorDoubleValueFnRight
(
right
,
0
));
}
}
}
void
vectorDivide
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnLeft
=
getVectorDoubleValueFn
(
_left_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnRight
=
getVectorDoubleValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
i
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
/
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
i
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
0
)
/
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
0
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
/
getVectorDoubleValueFnRight
(
right
,
0
));
}
}
}
void
vectorRemainder
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
(
_ord
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
(
_ord
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnLeft
=
getVectorDoubleValueFn
(
_left_type
);
_arithmetic_getVectorDoubleValue_fn_t
getVectorDoubleValueFnRight
=
getVectorDoubleValueFn
(
_right_type
);
if
(
len1
==
(
len2
))
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
i
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
-
((
int64_t
)(
getVectorDoubleValueFnLeft
(
left
,
i
)
/
getVectorDoubleValueFnRight
(
right
,
i
)))
*
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
(
len1
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
i
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
0
)
-
((
int64_t
)(
getVectorDoubleValueFnLeft
(
left
,
0
)
/
getVectorDoubleValueFnRight
(
right
,
i
)))
*
getVectorDoubleValueFnRight
(
right
,
i
));
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
len1
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
double
v
,
u
=
0
.
0
;
GET_TYPED_DATA
(
v
,
double
,
_right_type
,
getVectorValueAddrFnRight
(
right
,
0
));
if
(
getComparFunc
(
TSDB_DATA_TYPE_DOUBLE
,
0
)(
&
v
,
&
u
)
==
0
)
{
SET_DOUBLE_NULL
(
output
);
continue
;
}
SET_DOUBLE_VAL
(
output
,
getVectorDoubleValueFnLeft
(
left
,
i
)
-
((
int64_t
)(
getVectorDoubleValueFnLeft
(
left
,
i
)
/
getVectorDoubleValueFnRight
(
right
,
0
)))
*
getVectorDoubleValueFnRight
(
right
,
0
));
}
}
}
_arithmetic_operator_fn_t
getArithmeticOperatorFn
(
int32_t
arithmeticOptr
)
{
switch
(
arithmeticOptr
)
{
case
TSDB_BINARY_OP_ADD
:
return
vectorAdd
;
case
TSDB_BINARY_OP_SUBTRACT
:
return
vectorSub
;
case
TSDB_BINARY_OP_MULTIPLY
:
return
vectorMultiply
;
case
TSDB_BINARY_OP_DIVIDE
:
return
vectorDivide
;
case
TSDB_BINARY_OP_REMAINDER
:
return
vectorRemainder
;
default:
assert
(
0
);
return
NULL
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录