阿里云上不完整,参考github 的Readme
https://github.com/zeromax007/gpdb-roaringbitmap
分类
概念类比:bitmap 类型类比集合, offset 指具体的元素
如集合 S = { offset1, offset2}
比如 rb_contains( rb_build(‘{1,3,5}’) 里,offset 可以是 1/3/5
提供的函数包括集合间的运算、集合和元素之间的增删改查等
操作符号是简化以上函数的,同理。
如
集合之间:【】为操作符
- 【& | # ~】集合间四大运算:rb_andrb_orrb_xorrb_andnot 交集 并集 仅在A/B 仅在A或仅在B
- 上述运算的结果集合的元素个数:加后缀_cardinality 快速得出如 rb_and_cardinality
- 【= <>】两个集合是否相等:equals
- 【@>】集合包含/被包含:rb_contains rb_becontained
- 【&&】集合是否相交:rb_intersect
集合与元素
- 集合是否空:rb_is_empty
- 【@>】集合是否包含元素:rb_contains(set, int) , 批量 (set, int a, int b) 包区间[a,b]的元素
- 【+ -】集合增加/删除元素:rb_add/remove(set,int),批量(set, int, int)
- 翻转:实际效果和删除一样,可能有区别(todo),flip
- 集合元素个数:rb_cardinary(set),(set,int,int) 范围[a,b]内的个数,(set,int,int,int) 第三个是步长,如[1,3]步长2则只有13两个元素
- 相似度计算:rb_jaccard_index(set,set) 公式 = 交集个数/并集个数
- 返回最小/大的元素:rb_minimum(set) rb_maximum(set)
- 迭代:
- 小于等于offset个数:rb_rank(set,int)
- 返回元素列表:返回集合 rb_iterate(set,int) 正序返回列表 rb_to_array, 逆序返回列表rb_iterate_decrement
Tips:返回结果是bitmap的肉眼不可观察,可以算好结果集,用equals 对比函数结果和实际结果是否一致
测试结果:
— andnot xor 异或
select1;
selectrb_build(‘{1,2,3}’);
selectrb_build(‘{1}’),rb_build(‘{1,2}’),rb_build(‘{1,2,3}’);
selectrb_build(‘{1}’), rb_and( rb_build(‘{1}’),rb_build(‘{1,2,3}’)); — 结果为1
selectrb_build(‘{2}’), rb_or( rb_build(‘{1}’),rb_build(‘{1,2,3}’)); — 结果为2
— xor 在a或在b,结果应是{2,3} 剩两个
selectrb_cardinality(rb_xor( rb_build(‘{1}’),rb_build(‘{1,2,3}’))); — 结果为{2,3}
— andnot a&(!b) ,在a不在b,结果应是{1} 剩一个
selectrb_cardinality(rb_andnot( rb_build(‘{1,4}’),rb_build(‘{1,2,3}’)));
— 基数相关操作
— and操作的基数,结果{1}
selectrb_and_cardinality(rb_build(‘{1,2}’), rb_build(‘{1,4}’));
selectrb_cardinality( rb_build(‘{1,2,3}’)); — 结果为3 , count
—判断空/相等/相交
— bool
selectrb_is_empty(rb_build(‘{1,2}’)); — true/false
selectrb_equals(rb_build(‘{1,2}’), rb_build(‘{1,2}’)); — true/false
selectrb_intersect(rb_build(‘{1,2}’), rb_build(‘{3}’)); — true/false , 返回交集 = and (andnot(a,b), a)
—删除操作 remove flip
selectrb_equals (rb_remove(rb_build(‘{1,2,3}’),2), rb_build(‘{1,3}’)); — remove
— ?flip 操作的计算公式是什么? -> 删除
selectrb_flip (rb_build(‘{1}’),1), rb_build(‘{1}’); — remove
selectrb_equals(rb_flip (rb_build(‘{1}’),1), rb_build(‘{1}’)); — remove
selectrb_cardinality(rb_flip (rb_build(‘{1,2,3}’),1)); — remove
— flip 仅翻转一个offset 等价于remove
selectrb_equals(rb_remove(rb_build(‘{1,2,3}’),2), rb_flip (rb_build(‘{1,2,3}’),2,2)); — remove
selectrb_equals(rb_build(‘{3}’), rb_flip (rb_build(‘{1,2,3}’),1,2)); — remove
selectrb_equals(rb_build(‘{3}’), rb_flip (rb_build(‘{1,2,3}’),2,1)); — remove 这种情况返回的是什么?
— end flip
— 最小最大值
selectrb_minimum(rb_build(‘{8,4,5}’)); — 返回4,最小值
selectrb_maximum(rb_build(‘{8,4,5}’)); — 返回8,最大值
—
selectrb_rank(rb_build(‘{8,4,5,1}’),5); — 返回3,为集合中<=5的数量,共3个145
selectrb_iterate(rb_build(‘{8,4,5,1}’)); — 返回set{1,4,5,8}
selectrb_contains(rb_build(‘{8,4,5,1}’),4); — 返回set{1,4,5,8};
selectrb_equals( rb_add(rb_build(‘{8,4,5,1}’),2) , rb_build(‘{1,2,4,5,8}’));
selectrb_equals( rb_add(rb_build(‘{1,1}’),2,4) , rb_build(‘{1,1,2,3,4}’));
selectrb_equals( rb_remove(rb_build(‘{1,1,2,3,4}’),1,2) , rb_build(‘{3,4}’));
— 1.交集个数/并集个数, count(a and b)/count(a xor b) 1.重复的元素仅取一个
selectrb_jaccard_index(rb_build(‘{1,2,3,4}’), rb_build(‘{3,4,4}’)); — 结果=0.5
selectrb_to_array(rb_build(‘{1,4,2,3}’));— 正序返回 int[] = {1,2,3,4}
selectrb_iterate_decrement(rb_build(‘{1,4,2,3}’));— 逆序返回 int[] = {4,3,2,1}
— 聚合
selectrb_equals( rb_build_agg(1), rb_build(‘{1}’));
selectrb_equals( rb_or_agg(rb_build(‘{1,2,1,3}’)), rb_build(‘{1,2,3}’));
— 操作符号
selectrb_equals( rb_build(‘{1,2}’) +3, rb_build(‘{1,2,3}’));
selectrb_equals( rb_build(‘{1,2}’) | rb_build(‘{3,4}’) , rb_build(‘{1,2,3,4}’));
selectrb_equals( rb_build(‘{1,2}’) & rb_build(‘{1,3,4}’) , rb_build(‘{1}’));
selectrb_build(‘{1,2,4}’) @>4;
— 阿里云文档无,githut 有的函数,主要是区间函数:
selectrb_cardinality(rb_build(‘{1,2,3,4,5,6,7}’),1,5); — 结果等于5
— 带有step步长
selectrb_cardinality(rb_build(‘{1,2,3,4,5,6,7}’),1,5,2); — 结果等于3,判断1,3,5
selectrb_cardinality(rb_build(‘{1,2,3,4,5,6,7}’),1,5,3); — 结果等于2, 判断1,4
— 带有步长?? 参数对应的是哪个?
— Retrun roaringbitmap cardinality between integer range with step, in offset range.
selectrb_cardinality(rb_build(‘{1,2,3,4,5,6,7}’),1,4,5,2,10); — 结果等于2, 判断1,4
— 区间包含判断
selectrb_contains( rb_build(‘{1,2,3,4,5}’),1,5); — true
selectrb_contains( rb_build(‘{1,2,3,5}’),1,5); — false
selectrb_contains( rb_build(‘{1,2,3,4,5}’),1,6); — false
— 区间添加, remove flip 同理
select rb_add( rb_build(‘{1,2}’),2,5); — 结果12345
select rb_equals(rb_add( rb_build(‘{1,2}’),2,5), rb_build(‘{1,2,3,4,5}’)); — true
