blob: ee0f74574b23d41c136c8ce23d55591a3b2cae5d [file] [log] [blame]
% Licensed 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(erlfdb_subspace).
-record(erlfdb_subspace, {
prefix
}).
-export([
create/1,
create/2,
add/2,
key/1,
pack/1,
pack/2,
pack_vs/1,
pack_vs/2,
unpack/2,
range/1,
range/2,
contains/2,
subspace/2
]).
-define(PREFIX(S), S#erlfdb_subspace.prefix).
create(Tuple) ->
create(Tuple, <<>>).
create(#erlfdb_subspace{} = Subspace, Tuple) when is_tuple(Tuple) ->
create(Tuple, ?PREFIX(Subspace));
create(Tuple, Prefix) when is_tuple(Tuple), is_binary(Prefix) ->
#erlfdb_subspace{
prefix = erlfdb_tuple:pack(Tuple, Prefix)
}.
add(#erlfdb_subspace{} = Subspace, Item) ->
create({Item}, ?PREFIX(Subspace)).
key(#erlfdb_subspace{} = Subspace) ->
Subspace#erlfdb_subspace.prefix.
pack(Subspace) ->
pack(Subspace, {}).
pack(#erlfdb_subspace{} = Subspace, Tuple) when is_tuple(Tuple) ->
erlfdb_tuple:pack(Tuple, ?PREFIX(Subspace)).
pack_vs(Subspace) ->
pack_vs(Subspace, {}).
pack_vs(#erlfdb_subspace{} = Subspace, Tuple) when is_tuple(Tuple) ->
erlfdb_tuple:pack_vs(Tuple, ?PREFIX(Subspace)).
unpack(#erlfdb_subspace{} = Subspace, Key) ->
case contains(Subspace, Key) of
true ->
Prefix = ?PREFIX(Subspace),
SubKey = binary:part(Key, size(Prefix), size(Key) - size(Prefix)),
erlfdb_tuple:unpack(SubKey);
false ->
erlang:error({key_not_in_subspace, Subspace, Key})
end.
range(Subspace) ->
range(Subspace, {}).
range(#erlfdb_subspace{} = Subspace, Tuple) when is_tuple(Tuple) ->
Prefix = ?PREFIX(Subspace),
PrefixLen = size(Prefix),
{Start, End} = erlfdb_tuple:range(Tuple),
{
<<Prefix:PrefixLen/binary, Start/binary>>,
<<Prefix:PrefixLen/binary, End/binary>>
}.
contains(#erlfdb_subspace{} = Subspace, Key) ->
Prefix = ?PREFIX(Subspace),
PrefLen = size(Prefix),
case Key of
<<Prefix:PrefLen/binary, _/binary>> ->
true;
_ ->
false
end.
subspace(#erlfdb_subspace{} = Subspace, Tuple) ->
create(Subspace, Tuple).