% 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), { <>, <> }. contains(#erlfdb_subspace{} = Subspace, Key) -> Prefix = ?PREFIX(Subspace), PrefLen = size(Prefix), case Key of <> -> true; _ -> false end. subspace(#erlfdb_subspace{} = Subspace, Tuple) -> create(Subspace, Tuple).