Fix delete/1, add lookup/1

This commit is contained in:
Feng 2016-02-11 15:42:29 +08:00
parent 3f047a1d16
commit 1560386ab2
1 changed files with 12 additions and 13 deletions

View File

@ -13,13 +13,8 @@
%% See the License for the specific language governing permissions and %% See the License for the specific language governing permissions and
%% limitations under the License. %% limitations under the License.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @doc MQTT Topic Trie.
%% %% @doc MQTT Topic Trie: [Trie](http://en.wikipedia.org/wiki/Trie)
%% [Trie](http://en.wikipedia.org/wiki/Trie)
%%
%% @end
%%
%% @author Feng Lee <feng@emqtt.io>
-module(emqttd_trie). -module(emqttd_trie).
%% Mnesia Callbacks %% Mnesia Callbacks
@ -29,7 +24,7 @@
-copy_mnesia({mnesia, [copy]}). -copy_mnesia({mnesia, [copy]}).
%% Trie API %% Trie API
-export([insert/1, match/1, delete/1]). -export([insert/1, match/1, delete/1, lookup/1]).
-type node_id() :: binary() | atom(). -type node_id() :: binary() | atom().
@ -53,7 +48,7 @@
%% Mnesia Callbacks %% Mnesia Callbacks
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @doc Create Trie Tables. %% @doc Create or Replicate trie tables.
-spec mnesia(boot | copy) -> ok. -spec mnesia(boot | copy) -> ok.
mnesia(boot) -> mnesia(boot) ->
%% Trie Table %% Trie Table
@ -67,7 +62,6 @@ mnesia(boot) ->
{record_name, trie_node}, {record_name, trie_node},
{attributes, record_info(fields, trie_node)}]); {attributes, record_info(fields, trie_node)}]);
%% @doc Replicate trie tables.
mnesia(copy) -> mnesia(copy) ->
%% Copy Trie Table %% Copy Trie Table
ok = emqttd_mnesia:copy_table(trie), ok = emqttd_mnesia:copy_table(trie),
@ -75,7 +69,7 @@ mnesia(copy) ->
ok = emqttd_mnesia:copy_table(trie_node). ok = emqttd_mnesia:copy_table(trie_node).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% API %% Trie API
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @doc Insert topic to trie tree. %% @doc Insert topic to trie tree.
@ -99,6 +93,11 @@ match(Topic) when is_binary(Topic) ->
TrieNodes = match_node(root, emqttd_topic:words(Topic)), TrieNodes = match_node(root, emqttd_topic:words(Topic)),
[Name || #trie_node{topic=Name} <- TrieNodes, Name =/= undefined]. [Name || #trie_node{topic=Name} <- TrieNodes, Name =/= undefined].
%% @doc Lookup a Trie Node
-spec lookup(NodeId :: binary()) -> [#trie_node{}].
lookup(NodeId) ->
mnesia:read(trie_node, NodeId).
%% @doc Delete topic from trie %% @doc Delete topic from trie
-spec delete(Topic :: binary()) -> ok. -spec delete(Topic :: binary()) -> ok.
delete(Topic) when is_binary(Topic) -> delete(Topic) when is_binary(Topic) ->
@ -107,7 +106,7 @@ delete(Topic) when is_binary(Topic) ->
mnesia:delete({trie_node, Topic}), mnesia:delete({trie_node, Topic}),
delete_path(lists:reverse(emqttd_topic:triples(Topic))); delete_path(lists:reverse(emqttd_topic:triples(Topic)));
[TrieNode] -> [TrieNode] ->
mnesia:write(TrieNode#trie_node{topic=Topic}); mnesia:write(TrieNode#trie_node{topic = undefined});
[] -> [] ->
ok ok
end. end.
@ -158,7 +157,7 @@ match_node(NodeId, [W|Words], ResAcc) ->
'match_#'(NodeId, ResAcc) -> 'match_#'(NodeId, ResAcc) ->
case mnesia:read(trie, #trie_edge{node_id=NodeId, word = '#'}) of case mnesia:read(trie, #trie_edge{node_id=NodeId, word = '#'}) of
[#trie{node_id=ChildId}] -> [#trie{node_id=ChildId}] ->
mnesia:read(trie_node, ChildId) ++ ResAcc; mnesia:read(trie_node, ChildId) ++ ResAcc;
[] -> [] ->
ResAcc ResAcc
end. end.