位图构造函数
位图构造函 数用于构建新的位图数据类型。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])
参数说明如下:
| 参数 | 数据类型 | 默认值 | 描述 | 必选 |
|---|---|---|---|---|
| rb | RoaringBitmap | 需要输入的位图数据。 | 是 | |
| limit | uint64 | 限制输出的元素数量。 | 是 | |
| offset | uint64 | 0 | 开始输出的位置偏移量。 | 否 |
| reverse | bool | false | 是否是逆序输出。 | 否 |
| range_start | uint64 | 0 | 输出范围的开始值。 | 否 |
| range_end | uint64 | UINT64_MAX | 输出范围的结束值。 | 否 |
计算顺序如下:
-
如果指定了范围,则先筛选出范围在
[range_start,range_end)内的所有元素。 -
如果
reverse为false,则按照正序选取值;如果为true,则逆序选取。rb_select()函数会根据 reverse 的方向,从筛选出来的元素中计算出输出的起始位置。 -
计算
offset。 -
计算
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)