View Source Bitset Merge Operator
The bitset operator allows you to maintain a bitmap. You can set or unset a bit at a oisutuib in a fixed bitmap.
Ex:
{ok, Db} = rocksdb:open("/tmp/rocksdb_merge_db.test",
[{create_if_missing, true},
{merge_operator, {bitset_merge_operator, 1024}}]),
Bitmap = << 0:1024/unsigned >>,
ok = rocksdb:put(Db, <<"bitmap">>, Bitmap, []),
ok = rocksdb:merge(Db, <<"bitmap">>, <<"+2">>, []),
{ok, << 32, _/binary>> } = rocksdb:get(Db, <<"bitmap">>, []),
ok = rocksdb:merge(Db, <<"bitmap">>, <<"-2">>, []),
{ok, << 0, _/binary>> } = rocksdb:get(Db, <<"bitmap">>, []),
ok = rocksdb:merge(Db, <<"bitmap">>, <<"+11">>, []),
{ok, << 0, 16, _/binary>> } = rocksdb:get(Db, <<"bitmap">>, []),
ok = rocksdb:merge(Db, <<"bitmap">>, <<"+10">>, []),
{ok, << 0, 48, _/binary>> } = rocksdb:get(Db, <<"bitmap">>, []),
ok = rocksdb:merge(Db, <<"unsetbitmap">>, <<"+2">>, []),
{ok, << 32, _/binary>> } = rocksdb:get(Db, <<"unsetbitmap">>, []),
ok = rocksdb:merge(Db, <<"unsetbitmap">>, <<"-2">>, []),
{ok, << 0, _/binary>> } = rocksdb:get(Db, <<"unsetbitmap">>, []),
ok = rocksdb:merge(Db, <<"unsetbitmap">>, <<"+11">>, []),
{ok, << 0, 16, _/binary>> } = rocksdb:get(Db, <<"unsetbitmap">>, []),
ok = rocksdb:merge(Db, <<"unsetbitmap">>, <<"+10">>, []),
{ok, << 0, 48, _/binary>> } = rocksdb:get(Db, <<"unsetbitmap">>, []),
ok = rocksdb:close(Db),