175 lines
6.9 KiB
Erlang
175 lines
6.9 KiB
Erlang
%%----------------------------------------------------------------
|
|
%% Copyright (c) 2013-2016 Klarna AB
|
|
%%
|
|
%% This file is provided to you under the Apache License,
|
|
%% Version 2.0 (the "License"); you may not use this file
|
|
%% except in compliance with the License. You may obtain
|
|
%% a copy of the License at
|
|
%%
|
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
|
%%
|
|
%% Unless required by applicable law or agreed to in writing,
|
|
%% software distributed under the License is distributed on an
|
|
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
%% KIND, either express or implied. See the License for the
|
|
%% specific language governing permissions and limitations
|
|
%% under the License.
|
|
%%----------------------------------------------------------------
|
|
|
|
-module(mnesia_rocksdb_indexes).
|
|
|
|
-export([run/0,
|
|
r1/0]).
|
|
|
|
run() ->
|
|
mnesia:stop(),
|
|
ok = mnesia_rocksdb_tlib:start_mnesia(reset),
|
|
test(1, ram_copies, r1),
|
|
test(1, disc_copies, d1),
|
|
fail(test, [1, disc_only_copies, do1]), % doesn't support ordered
|
|
test(2, disc_only_copies, do1),
|
|
fail(test, [1, rdb, l1]), % doesn't support bag
|
|
test(3, rdb, l1),
|
|
add_del_indexes(),
|
|
{atomic,ok} = mnesia_schema:add_index_plugin(
|
|
{pfx},mnesia_rocksdb, ix_prefixes),
|
|
test_index_plugin(pr1, ram_copies, ordered),
|
|
test_index_plugin(pr2, ram_copies, bag),
|
|
test_index_plugin(pd1, disc_copies, ordered),
|
|
fail(test_index_plugin, [pd2, disc_only_copies, ordered]),
|
|
test_index_plugin(pd2, disc_copies, bag),
|
|
test_index_plugin(pl2, rdb, ordered),
|
|
test_index_plugin_mgmt(),
|
|
ok.
|
|
|
|
r1() ->
|
|
mnesia:stop(),
|
|
ok = mnesia_rocksdb_tlib:start_mnesia(reset),
|
|
{atomic,ok} = mnesia_schema:add_index_plugin(
|
|
{pfx},mnesia_rocksdb, ix_prefixes),
|
|
dbg:tracer(),
|
|
dbg:tpl(mnesia_schema,x),
|
|
dbg:tpl(mnesia_index,x),
|
|
dbg:p(all,[c]),
|
|
test_index_plugin(pd2, disc_only_copies, ordered).
|
|
|
|
fail(F, Args) ->
|
|
try apply(?MODULE, F, Args),
|
|
error(should_fail)
|
|
catch
|
|
error:_ ->
|
|
io:fwrite("apply(~p, ~p, ~p) -> fails as expected~n",
|
|
[?MODULE, F, Args])
|
|
end.
|
|
|
|
test(N, Type, T) ->
|
|
{atomic, ok} = mnesia:create_table(T, [{Type,[node()]},
|
|
{attributes,[k,a,b,c]},
|
|
{index, indexes(N)}]),
|
|
ok = test_index(N, T).
|
|
|
|
add_del_indexes() ->
|
|
{atomic, ok} = mnesia:del_table_index(r1, a),
|
|
{aborted, _} = mnesia:del_table_index(r1, a),
|
|
{atomic, ok} = mnesia:add_table_index(r1, a),
|
|
{aborted, _} = mnesia:add_table_index(r1, a),
|
|
{atomic, ok} = mnesia:del_table_index(d1, a),
|
|
{atomic, ok} = mnesia:add_table_index(d1, a),
|
|
{atomic, ok} = mnesia:del_table_index(do1, a),
|
|
{atomic, ok} = mnesia:add_table_index(do1, a),
|
|
{atomic, ok} = mnesia:del_table_index(l1, a),
|
|
{atomic, ok} = mnesia:add_table_index(l1, a),
|
|
io:fwrite("add_del_indexes() -> ok~n", []).
|
|
|
|
test_index_plugin(Tab, Type, IxType) ->
|
|
{atomic, ok} = mnesia:create_table(Tab, [{Type, [node()]},
|
|
{index, [{{pfx}, IxType}]}]),
|
|
mnesia:dirty_write({Tab, "foobar", "sentence"}),
|
|
mnesia:dirty_write({Tab, "yellow", "sensor"}),
|
|
mnesia:dirty_write({Tab, "truth", "white"}),
|
|
mnesia:dirty_write({Tab, "fulcrum", "white"}),
|
|
Res1 = [{Tab, "foobar", "sentence"}, {Tab, "yellow", "sensor"}],
|
|
Res2 = [{Tab, "fulcrum", "white"}, {Tab, "truth", "white"}],
|
|
if IxType == bag ->
|
|
Res1 = lists:sort(mnesia:dirty_index_read(Tab,<<"sen">>, {pfx})),
|
|
Res2 = lists:sort(mnesia:dirty_index_read(Tab,<<"whi">>, {pfx})),
|
|
[{Tab,"foobar","sentence"}] = mnesia:dirty_index_read(
|
|
Tab, <<"foo">>, {pfx});
|
|
IxType == ordered ->
|
|
Res1 = lists:sort(mnesia:dirty_index_read(Tab,<<"sen">>, {pfx})),
|
|
Res2 = lists:sort(mnesia:dirty_index_read(Tab,<<"whi">>, {pfx})),
|
|
[{Tab,"foobar","sentence"}] = mnesia:dirty_index_read(
|
|
Tab, <<"foo">>, {pfx})
|
|
end,
|
|
io:fwrite("test_index_plugin(~p, ~p, ~p) -> ok~n", [Tab,Type,IxType]).
|
|
|
|
test_index_plugin_mgmt() ->
|
|
{aborted,_} = mnesia:create_table(x, [{index,[{unknown}]}]),
|
|
{aborted,_} = mnesia:create_table(x, [{index,[{{unknown},bag}]}]),
|
|
{aborted,_} = mnesia:create_table(x, [{index,[{{unknown},ordered}]}]),
|
|
{atomic,ok} = mnesia_schema:add_index_plugin(
|
|
{t}, mnesia_rocksdb,ix_prefixes),
|
|
{atomic,ok} = mnesia_schema:delete_index_plugin({t}),
|
|
{aborted,{bad_type,x,_}} =
|
|
mnesia:create_table(x, [{index,[{{t},ordered}]}]),
|
|
%% re-add plugin
|
|
{atomic,ok} = mnesia_schema:add_index_plugin(
|
|
{t}, mnesia_rocksdb,ix_prefixes),
|
|
{atomic,ok} =
|
|
mnesia:create_table(x, [{index,[{{t},ordered}]}]),
|
|
{aborted,{plugin_in_use,{t}}} =
|
|
mnesia_schema:delete_index_plugin({t}).
|
|
|
|
test_index(1, T) ->
|
|
L2 = [{T,K,x,y,z} || K <- lists:seq(4,6)],
|
|
L1 = [{T,K,a,b,c} || K <- lists:seq(1,3)],
|
|
true = lists:all(fun(X) -> X == ok end,
|
|
[mnesia:dirty_write(Obj) || Obj <- L1 ++ L2]),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,a,a)),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,a,3)),
|
|
L1 = mnesia:dirty_index_read(T,b,b),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,c,c)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,x,a)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,x,3)),
|
|
L2 = mnesia:dirty_index_read(T,y,b),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,z,c)),
|
|
io:fwrite("test_index(1, ~p) -> ok~n", [T]),
|
|
ok;
|
|
test_index(2, T) ->
|
|
L1 = [{T,K,a,b,c} || K <- lists:seq(1,3)],
|
|
L2 = [{T,K,x,y,z} || K <- lists:seq(4,6)],
|
|
true = lists:all(fun(X) -> X == ok end,
|
|
[mnesia:dirty_write(Obj) || Obj <- L1 ++ L2]),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,a,a)),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,a,3)),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,b,b)),
|
|
L1 = lists:sort(mnesia:dirty_index_read(T,c,c)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,x,a)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,x,3)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,y,b)),
|
|
L2 = lists:sort(mnesia:dirty_index_read(T,z,c)),
|
|
io:fwrite("test_index(1, ~p) -> ok~n", [T]),
|
|
ok;
|
|
test_index(3, T) ->
|
|
L2 = [{T,K,x,y,z} || K <- lists:seq(4,6)],
|
|
L1 = [{T,K,a,b,c} || K <- lists:seq(1,3)],
|
|
true = lists:all(fun(X) -> X == ok end,
|
|
[mnesia:dirty_write(Obj) || Obj <- L1 ++ L2]),
|
|
L1 = mnesia:dirty_index_read(T,a,a),
|
|
L1 = mnesia:dirty_index_read(T,a,3),
|
|
L1 = mnesia:dirty_index_read(T,b,b),
|
|
L1 = mnesia:dirty_index_read(T,c,c),
|
|
L2 = mnesia:dirty_index_read(T,x,a),
|
|
L2 = mnesia:dirty_index_read(T,x,3),
|
|
L2 = mnesia:dirty_index_read(T,y,b),
|
|
L2 = mnesia:dirty_index_read(T,z,c),
|
|
io:fwrite("test_index(1, ~p) -> ok~n", [T]),
|
|
ok.
|
|
|
|
indexes(1) ->
|
|
[a,{b,ordered},{c,bag}];
|
|
indexes(2) ->
|
|
[a,b,{c,bag}];
|
|
indexes(3) ->
|
|
[a,{b,ordered},{c,ordered}].
|