跳到主要内容

位图构造函数

位图构造函数用于构建新的位图数据类型。seekdb 当前所支持的位图判断函数包括 rb_build()rb_build_empty()rb_build_varbinary()rb_from_string()

信息

返回可视化的十六进制查询结果需了解的注意事项请见 创建高效压缩位图列

rb_build

rb_build() 函数用于将基础类型为整数的数组数据转换为高效压缩位图数据(RoaringBitmap)。语法如下:

rb_build(arr)

输入参数说明如下:

  • arr 传入的类型必须是一个数组类型。

返回值是包含了数组所有元素的 RoaringBitmap。

约束如下:

  • 数组不可包含空元素。
  • 若数组为嵌套数组,递归取出每个子数组的基础元素,并插入到 Roaringbitmap 中。
  • Roaringbitmap 支持插入无符号 64 位整数(uint64)和有符号 32 位整数(int32)数据。与下文 rb_from_string 的行为一致,输入的有符号 32 位整数负数,将被先转换为无符号 32 位整数,再插入到 RoaringBitmap 中。因此允许输入的整数范围是从有符号 32 位整数的最小值到无符号 64 位整数的最大值,即 [INT32_MIN, UINT64_MAX]

示例如下:

SELECT rb_to_string(rb_build([1.2]));
ERROR 5083 (22000): Invalid data type for the operation
SELECT rb_to_string(rb_build([0,1,2]));
+---------------------------------+
| rb_to_string(rb_build([0,1,2])) |
+---------------------------------+
| 0,1,2 |
+---------------------------------+
1 row in set (0.001 sec)
SELECT rb_to_string(rb_build([[0,1],[2],[2,3]]));
+-------------------------------------------+
| rb_to_string(rb_build([[0,1],[2],[2,3]])) |
+-------------------------------------------+
| 0,1,2,3 |
+-------------------------------------------+
1 row in set (0.001 sec)

rb_build_empty

rb_build_empty() 函数用于构建一个空的位图数据。语法如下:

rb_build_empty()

该函数无需输入参数。

示例如下:

SELECT rb_build_empty();
+------------------------------------+
| rb_build_empty() |
+------------------------------------+
| 0x0100 |
+------------------------------------+
1 row in set (0.001 sec)
SELECT rb_is_empty(rb_build_empty());
+-------------------------------+
| rb_is_empty(rb_build_empty()) |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.001 sec)

rb_build_varbinary

rb_build_varbinary() 函数通过 varbinary 来构建位图数据。Varbinary 为 seekdb 私有格式,是由 version 信息、type 信息、data 等部分组成的二进制格式。语法如下:

rb_build_varbinary(bin_str)

输入的参数为 varbinary 字符串。

示例如下:

SELECT rb_to_string(rb_build_varbinary(x'0100'));
+-------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0100')) |
+-------------------------------------------+
| |
+-------------------------------------------+
1 row in set (0.001 sec)
SELECT rb_to_string(rb_build_varbinary(x'0103020100000002000000'));
+-------------------------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0103020100000002000000')) |
+-------------------------------------------------------------+
| 1,2 |
+-------------------------------------------------------------+
1 row in set (0.001 sec)

rb_from_string

rb_from_string() 函数通过特定格式的字符串来构建位图数据。字符串格式为需要构建的位图数据的每一个元素,并通过逗号隔开,如 1,2,3,4。语法如下:

rb_from_string(str)

输入的字符串值支持 INT32 和 INT64 两种格式,seekdb 支持的合法的值范围是 [0, UINT64_MAX]。但是为了兼容 PG,也支持 [INT32_MIN,0) 范围的负整数的输入,在输出时负整数会转换为 UINT32 的值输出,比如输入 -1,输出是 4294967295

示例如下:

SELECT rb_from_string('1,2,3');
+--------------------------------------------------+
| rb_from_string('1,2,3') |
+--------------------------------------------------+
| 0x010303010000000200000003000000 |
+--------------------------------------------------+
1 row in set (0.001 sec)
SELECT rb_to_string(rb_from_string('-1'));
+------------------------------------+
| rb_to_string(rb_from_string('-1')) |
+------------------------------------+
| 4294967295 |
+------------------------------------+
1 row in set (0.001 sec)

rb_select

位图数据储存一组非负整数。rb_select() 函数可以根据指定条件,从位图数据值选取局部范围,保存为新的位图数据并返回其值。语法如下:

res_rb = rb_select(rb, limit [, offset] [, reverse] [, range_start] [, range_end])

参数说明如下:

参数数据类型默认值描述必选
rbRoaringBitmap需要输入的位图数据。
limituint64限制输出的元素数量。
offsetuint640开始输出的位置偏移量。
reverseboolfalse是否是逆序输出。
range_startuint640输出范围的开始值。
range_enduint64UINT64_MAX输出范围的结束值。

计算顺序如下:

  1. 如果指定了范围,则先筛选出范围在 [range_start,range_end) 内的所有元素。

  2. 如果 reversefalse,则按照正序选取值;如果为 true,则逆序选取。rb_select() 函数会根据 reverse 的方向,从筛选出来的元素中计算出输出的起始位置。

  3. 计算 offset

  4. 计算 limit,最多输出 limit 个范围内的数据,如果范围内的数据小于 limit,则输出范围内全部数据。

返回值为位图数据类型。

示例如下:

返回 '10, 20, 30, 40, 50, 60, 70' 的前 3 个值:

SELECT rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3));
+--------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3)) |
+--------------------------------------------------------------------------+
| 10,20,30 |
+--------------------------------------------------------------------------+
1 row in set (0.001 sec)

偏移 2 个值并返回 '1,2,3,4,5,6,7' 的前 2 个值:

SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2));
+----------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2)) |
+----------------------------------------------------------------+
| 3,4 |
+----------------------------------------------------------------+
1 row in set (0.001 sec)

从 [2, 6) 之间正序选取前 2 个值:

SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6));
+-----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6)) |
+-----------------------------------------------------------------------------+
| 2,3 |
+-----------------------------------------------------------------------------+
1 row in set (0.001 sec)

限定范围为 [2, 6) 的基础上,逆序偏移 1 个值计算结果,最终返回前 2 个值:

SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6));
+----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6)) |
+----------------------------------------------------------------------------+
| 3,4 |
+----------------------------------------------------------------------------+
1 row in set (0.001 sec)

限定范围为 [2, 6) 的基础上,正序偏移 1 个值计算结果,最终返回前 10 个值(实际返回了 3 个值):

SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6));
+------------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6)) |
+------------------------------------------------------------------------------+
| 3,4,5 |
+------------------------------------------------------------------------------+
1 row in set (0.001 sec)