From 4d7fe91a2b5260b56ce3c5ad5d78b73bf779eede Mon Sep 17 00:00:00 2001 From: Niclas Axelsson Date: Sun, 21 Nov 2021 21:52:57 +0100 Subject: [PATCH 1/2] Use previous node iff Ack is empty in lookup --- src/routing_tree.erl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/routing_tree.erl b/src/routing_tree.erl index 3bca38b..09e3f13 100644 --- a/src/routing_tree.erl +++ b/src/routing_tree.erl @@ -71,8 +71,13 @@ lookup_path([Segment|Tl], Comparator, Tree, {Bindings, _}) -> end. -lookup_binary(<<>>, Comparator, Tree, {Bindings, _Node}, Ack) -> - case lookup_segment(Ack, Bindings, Tree) of +lookup_binary(<<>>, Comparator, Tree, {Bindings, PrevNode}, Ack) -> + Node = + case Ack of + <<>> -> PrevNode; + _ -> Ack + end, + case lookup_segment(Node, Bindings, Tree) of {ok, Bindings0, #node{is_wildcard = Wildcard, value = Value}} -> case find_comparator(Comparator, Value) of {ok, #node_comp{value = Value0}} -> @@ -80,7 +85,7 @@ lookup_binary(<<>>, Comparator, Tree, {Bindings, _Node}, Ack) -> false -> {ok, Bindings0, Value0}; _ -> - {ok, Bindings0, Value0, [Ack]} + {ok, Bindings0, Value0, [Node]} end; Error -> Error From d5a16491359688a2b76e74987f28f52f15e9de50 Mon Sep 17 00:00:00 2001 From: Niclas Axelsson Date: Sun, 21 Nov 2021 22:54:40 +0100 Subject: [PATCH 2/2] Correct case for detecting non-deterministic paths --- src/routing_tree.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routing_tree.erl b/src/routing_tree.erl index 09e3f13..4293f25 100644 --- a/src/routing_tree.erl +++ b/src/routing_tree.erl @@ -284,10 +284,10 @@ check_conflicting_nodes_segment(#node{value = Value, segment = Segment, is_bindi check_conflicting_nodes_segment(#node{is_binding = true} = Node, _, _) -> {true, {conflict, Node}}; check_conflicting_nodes_segment(#node{is_wildcard = true} = Node, _, _) -> {true, {conflict, Node}}. - check_conflicting_nodes_binding(#node{value = Value, segment = Segment} = Node, CompNode, Ident) -> +check_conflicting_nodes_binding(#node{value = Value, segment = Segment, is_binding = true} = Node, CompNode, Ident) -> Segment == Ident andalso - {[ X || #node_comp{comparator = C, value = X} <- Value, - C == CompNode#node_comp.comparator ] /= [], {conflict, Node}}; + {[ X || #node_comp{comparator = C, value = X} <- Value, + C == CompNode#node_comp.comparator ] /= [], {conflict, Node}}; check_conflicting_nodes_binding(#node{is_wildcard = true}, _, _) -> true; check_conflicting_nodes_binding(#node{value = Value} = Node, CompNode, _) -> {[ X || #node_comp{comparator = C, value = X} <- Value, C == CompNode#node_comp.comparator ] /= [], {conflict, Node}}.