Fix delete/1, add lookup/1
This commit is contained in:
parent
3f047a1d16
commit
1560386ab2
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue