diff options
author | Emile Joubert <emile@rabbitmq.com> | 2013-03-19 11:56:41 +0000 |
---|---|---|
committer | Emile Joubert <emile@rabbitmq.com> | 2013-03-19 11:56:41 +0000 |
commit | 2c8e2165592d838bb94064699801a60d36fa7b8f (patch) | |
tree | 55615c3464b4ff9dfdf30460bed72c9e3a9b7bac /src/rabbit_exchange.erl | |
parent | 0dd60e5e6cd4cf6ad2b538ad12e44e32640e70a3 (diff) | |
download | rabbitmq-server-git-2c8e2165592d838bb94064699801a60d36fa7b8f.tar.gz |
Perform route decoration differently
Diffstat (limited to 'src/rabbit_exchange.erl')
-rw-r--r-- | src/rabbit_exchange.erl | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index c5a6309a1c..c2c7d947e0 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -320,34 +320,34 @@ route(#exchange{name = #resource{virtual_host = VHost, %% Optimisation [rabbit_misc:r(VHost, queue, RK) || RK <- lists:usort(RKs)]; {Decorators, _} -> - QNames = route1(Delivery, {[X], XName, []}), - lists:usort(decorate_route(Decorators, X, Delivery, QNames)) + lists:usort(route1(Delivery, Decorators, {[X], XName, []})) end. -decorate_route([], _X, _Delivery, QNames) -> +route1(_, _, {[], _, QNames}) -> QNames; -decorate_route(Decorators, X, Delivery, QNames) -> - QNames ++ - lists:append([Decorator:route(X, Delivery) || Decorator <- Decorators]). - -route1(_, {[], _, QNames}) -> - QNames; -route1(Delivery, {[X = #exchange{type = Type} | WorkList], SeenXs, QNames}) -> - DstNames = process_alternate( - X, ((type_to_module(Type)):route(X, Delivery))), - route1(Delivery, +route1(Delivery, Decorators, + {[X = #exchange{type = Type} | WorkList], SeenXs, QNames}) -> + ExchangeDests = (type_to_module(Type)):route(X, Delivery), + AlternateDest = process_alternate(X, ExchangeDests), + DecorateDests = process_decorators(Delivery, Decorators, X), + route1(Delivery, Decorators, lists:foldl(fun process_route/2, {WorkList, SeenXs, QNames}, - DstNames)). + AlternateDest ++ DecorateDests ++ ExchangeDests)). -process_alternate(#exchange{arguments = []}, Results) -> %% optimisation - Results; +process_alternate(#exchange{arguments = []}, _Results) -> %% optimisation + []; process_alternate(#exchange{name = XName, arguments = Args}, []) -> case rabbit_misc:r_arg(XName, exchange, Args, <<"alternate-exchange">>) of undefined -> []; AName -> [AName] end; -process_alternate(_X, Results) -> - Results. +process_alternate(_X, _Results) -> + []. + +process_decorators(_Delivery, [], _X) -> + []; +process_decorators(Delivery, Decorators, X) -> + lists:append([Decorator:route(X, Delivery) || Decorator <- Decorators]). process_route(#resource{kind = exchange} = XName, {_WorkList, XName, _QNames} = Acc) -> |