阿里云上不完整,参考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