分析函数
SmartEDB 提供了一个专门用于处理序列的 C 语言函数库。这些函数使用特定类型 mco_seq_iterator_t
作为“句柄”来管理序列字段,其第一个参数始终为结果序列迭代器,在应用其他函数参数后,该迭代器将接收函数的输出结果。这些函数针对特定类型的序列进行操作。例如,二元函数 mco_seq_add_int4()
可以将两个元素类型为 int4
的序列相加。为了简化文档描述,我们使用术语“TYPE”作为以下实际类型之一的占位符。
类型 | 说明 |
---|---|
int1 | 有符号的单字节整数 |
int2 | 有符号双字节整数 |
int4 | 有符号四字节整数 |
int8 | 有符号的 8 字节整数 |
uint1 | 无符号单字节整数 |
uint2 | 无符号双字节整数 |
uint4 | 无符号四字节整数 |
uint8 | 无符号 8 字节整数 |
float | 四字节浮点 |
double | 八字节浮点 |
datetime | 八字节日期时间 |
因此,函数签名 mco_seq_add_TYPE()
指的是序列“加法”函数 mco_seq_add_int1()
、mco_seq_add_int2()
、……、mco_seq_add_double()
或 mco_seq_add_datetime()
;即适用于上述任何类型的元素。
为了记录操作细节和用法,这些函数被划分为“类别”。请参阅下文[按类别划分的 C 分析函数](#按类别划分的 C 分析函数),查看各个函数的解释和示例。
SQL 等效形式
值得注意的是,所有的公共 C 序列函数都有对应的 SQL 函数。这些 SQL 函数返回结果序列,这使得能够以更紧凑的形式表达 SQL 函数的“流水线”。
例如,以下由四个 C 函数调用组成的管道会对历史收盘价进行拆股影响的调整。(假设序列 trade_date
和 closing_price
包含交易日期与收盘价配对的时间序列,而 split_date
则包含所关注交易“IBM”的拆股日期序列。)
mco_seq_iterator_t split;
mco_seq_iterator_t prd_split_factor;
mco_seq_iterator_t price_adjustment;
mco_seq_iterator_t trade_date;
mco_seq_iterator_t split_date;
mco_seq_iterator_t closing_price;
mco_seq_iterator_t adjusted_price;
...
rc = mco_seq_cum_agg_prd_float(&prd_split_factor, &split);
mco_seq_reverse_double(&rev_prd_split_factor, &prd_split_factor);
mco_seq_stretch_uint4_double(&price_adjustment, &trade_date, &split_date, &rev_prd_split_factor, 1.0);
mco_seq_mul_double(&adjusted_price, &closing_price, &price_adjustment);
可以使用以下 SQL 选择语句计算出相同的结果序列:
SELECT seq_mul(ClosePrice, seq_stretch(TradeDate, SplitDate,
seq_reverse(seq_cum_agg_prd(SplitFactor)))) as AdjustedClose
FROM Security
WHERE Security.Symbol = ‘IBM’
SQL 中的函数与 C API 中的函数之间的关系:在选择语句中内层最嵌套的函数是 C API 函数序列中首先被调用的函数。下一个最内层的函数 seq_reverse()
是 C API 中第二个被调用的函数,依此类推。
序列中的 Null 值
生成的函数 classname_fieldname_append_nullable()
和 classname_fieldname_insert_nullable()
可用于向序列中插入空值。函数 mco_seq_get_nullable_TYPE()
和 mco_seq_unget_nullable_TYPE()
可用于将序列转换为可为空的数组,反之亦然。
按类别划分的 C 分析函数
示例对股票报价数据库使用以下模式定义:
#define uint4 unsigned<4>
#define MAX_SYMBOL_LEN 21
declare database stockdb;
class Quote
{
char<MAX_SYMBOL_LEN> symbol;
sequence<date asc> day;
sequence<float> low;
sequence<float> high;
sequence<float> open;
sequence<float> close;
sequence<uint4> volume;
sequence<char<15>> day_str;
unique tree<symbol> by_sym;
};
请注意,此表的主键是字段 symbol
上的唯一索引 by_sym
,除 day_str
字段外,所有其他字段均为序列类型,其中字段 day
是有序序列。添加 day_str
字段是为了提供存储在字段 day
中的日期类型的方便的字符数组表示形式。
通常,分析操作是在从 Quote 对象中提取的一个或多个序列字段上执行的,Quote 对象实际上是从“结果集”游标中获取的“行”。例如,以下代码片段遍历整个数据库,打印出 Quote 字符字段 symbol
和序列字段 day
和 high
的值:
mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &trans);
/* 遍历所有对象*/
Quote_by_sym_index_cursor(trans, "e_cursor);
for (rc = mco_cursor_first(trans, "e_cursor);
rc != MCO_S_CURSOR_END;
rc = mco_cursor_next(trans, "e_cursor))
{
/* 获得当前对象 */
Quote_from_cursor(trans, "e_cursor, "e);
/* 获取符号名称 */
Quote_symbol_get("e, symbol, sizeof symbol);
/* 初始化迭代器 */
Quote_high_iterator("e, &high_iterator);
Quote_day_iterator("e, &day_iterator);
Quote_day_str_iterator("e, &day_str_iterator);
while ((rc = mco_seq_next_uint4(&day_iterator, &day)) != MCO_S_CURSOR_END)
{
mco_seq_next_float(&high_iterator, &high);
mco_seq_next_char(&day_str_iterator, buff);
printf("%s[(%s)]: %f\n", symbol, buff, high);
}
}
mco_trans_commit(trans);
请使用下面的链接按类别查看这些功能的描述和示例:
函数 | 说明 |
---|---|
一元函数 | 采用单个输入序列并生成值的结果序列的函数,例如:abs、neg、match |
二进制函数 | 采用两个输入序列并生成值的结果序列的函数,例如:add、sub、mul、div、mod、max、min |
比较函数 | 采用两个输入序列并为比较运算符生成布尔值结果序列的函数:==、!=、>、>=、<、<= |
逻辑函数 | 采用两个输入序列并从以下逻辑运算符生成布尔值的结果序列的函数:not、and、or、xor |
转换函数 | 将输入序列的值转换为所需的类型,或将数据打印到结果序列中 |
折叠函数 | 将两个序列折叠为标量值的函数,例如:加权和、加权平均值、协方差、相关性 |
条件函数 | 根据条件对一个或两个输入序列执行操作的函数,例如:if、iif、filter filter_pos |
序列操纵器 | 对输入序列执行各种操作的函数 |
迭代函数 | 从序列迭代器中提取值并重置序列迭代器的函数,例如:next、reset |
顶部函数 | 返回输入序列的顶部元素(或其位置)的函数:top_max、top_min、top_pos_max top_pos_minn |
运行长度加密函数 | 执行运行长度加密 (RLE) 操作的函数 |
大集合函数 | 采用单个输入序列迭代器参数并在结果序列中生成标量值的函数 |
组聚合函数 | 根据参数的值将输入序列拆分为组的函数group_by |
网格聚合函数 | 将输入序列拆分为 interval 参数指定的区间的函数,该参数确定组中的最大元素数 |
窗口聚合函数 | 然而,就像上面所示的 “Grid” 函数一样,interval 参数表示输入序列中的下 N 个元素 |
哈希聚合函数 | 通过对未排序的序列进行分组来对结果序列进行分组的函数 |
累积聚合函数 | 对结果序列中所有前面元素的 average, sum, product, etc. 进行累加的函数 |
其他函数 | 提供排序、排名和直方图功能的函数 |
生成函数 | 生成的函数,用于对数据库对象的序列字段执行操作,例如:first、last、append、insert、delete、search、join、count、map、subseq、iterator、from_cursor、project、store |