summaryrefslogtreecommitdiff
path: root/src/rabbit_exchange.erl
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2013-03-11 14:16:32 +0000
committerEmile Joubert <emile@rabbitmq.com>2013-03-11 14:16:32 +0000
commit734b61abe4f5b4f281034ac00672003909a36569 (patch)
treec13843288ac1fbc9642a4a492579e5666e4ba956 /src/rabbit_exchange.erl
parent844d1918acf1c3b691f5dab06ea75257794d4be0 (diff)
downloadrabbitmq-server-git-734b61abe4f5b4f281034ac00672003909a36569.tar.gz
Minimise routing exchange decorator API
Diffstat (limited to 'src/rabbit_exchange.erl')
-rw-r--r--src/rabbit_exchange.erl28
1 files changed, 13 insertions, 15 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 7179454d02..0d1e9831a1 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -312,26 +312,24 @@ info_all(VHostPath) -> map(VHostPath, fun (X) -> info(X) end).
info_all(VHostPath, Items) -> map(VHostPath, fun (X) -> info(X, Items) end).
-route(#exchange{name = #resource{name = RName, virtual_host = VHost} = XName} = X,
+route(#exchange{name = #resource{virtual_host = VHost,
+ name = RName} = XName} = X,
#delivery{message = #basic_message{routing_keys = RKs}} = Delivery) ->
- case {registry_lookup(exchange_decorator_route) == [], RName == <<"">>} of
- {true, true} ->
+ case {registry_lookup(exchange_decorator_route), RName == <<"">>} of
+ {[], true} ->
+ %% Optimisation
[rabbit_misc:r(VHost, queue, RK) || RK <- lists:usort(RKs)];
- {NoDecorator, _} ->
+ {Decorators, _} ->
QNames = route1(Delivery, {[X], XName, []}),
- lists:usort(case NoDecorator of
- true -> QNames;
- false -> decorate_route(X, Delivery, QNames)
- end)
+ lists:usort(decorate_route(Decorators, X, Delivery, QNames))
end.
-decorate_route(X, Delivery, QNames) ->
- {Add, Remove} =
- lists:foldl(fun (Decorator, {Add, Remove}) ->
- {A1, R1} = Decorator:route(X, Delivery, QNames),
- {A1 ++ Add, R1 ++ Remove}
- end, {[], []}, registry_lookup(exchange_decorator_route)),
- QNames ++ Add -- Remove.
+decorate_route([], _X, _Delivery, QNames) ->
+ QNames;
+decorate_route(Decorators, X, Delivery, QNames) ->
+ lists:foldl(fun (Decorator, QNamesAcc) ->
+ Decorator:route(X, Delivery) ++ QNamesAcc
+ end, QNames, Decorators).
route1(_, {[], _, QNames}) ->
QNames;