tengo qlcErlang: optimizar qlc complejo
RefsBlocked = qlc:e(qlc:q([
Ref1 ||
{{Ref1, {pattern, {_Status1, _Pattern1, Limit1}}}, Count} <- dict:to_list(
qlc:fold(
fun({Key, _Ref2}, Acc) ->
dict:update_counter(Key, 1, Acc)
end,
dict:new(),
qlc:q([
{{Ref1, {pattern, {Status1, Pattern1, Limit1}}}, Ref2} ||
{Ref2, {status, Status2}} <- ets:table(Tmp),
{Ref3, {tag, Tag3}} <- ets:table(Tmp),
Ref2 =:= Ref3,
{Ref1, {pattern, {Status1, Pattern1, Limit1}}} <- ets:table(Tmp),
Ref =:= Ref1,
Status1 =:= Status2,
Pattern1 =:= Tag3
])
)
),
Count >= Limit1
], unique))
donde Tmp es un ETS de la bolsa de tipo y Ref es un identificador particular, necesito probar.
Ets contiene de cientos a miles de entradas como
{Ref1, {definition, {Tuple1}}}
{Ref1, {status, scheduled}}
{Ref1, {status, blocked}}
{Ref1, {pattern, {scheduled, Pattern11, Limit11}}}
{Ref1, {pattern, {dispatched, Pattern12, Limit12}}}
{Ref1, {tag, Tag11}}
{Ref2, {definition, {Tuple2}}}
{Ref2, {status, scheduled}}
{Ref2, {status, dispatched}}
{Ref2, {pattern, {scheduled, Pattern21, Limit21}}}
{Ref2, {pattern, {dispatched, Pattern22, Limit22}}}
{Ref2, {tag, Tag21}}
{Ref3, {definition, Tuple3}}
{Ref3, {status, error}}
i. mi. para cada Ref hay una definición, uno o dos (de cuatro) estados, cero o más (en la mayoría de los casos, no más de 3) patrones y cero o más (en la mayoría de los casos, no más de 3) etiquetas.
Necesito comprobar si un identificador particular está bloqueado por otros. Se bloquea cuando la cantidad de identificadores que coinciden con cualquiera de sus patrones en su Etiqueta = su Patrón y su Estado = su estado de patrón es más o igual a su Límite de patrón.
¿Hay alguna manera de optimizar qlc?
¿Se llama Erlang porque la gente lo lee y se va, eh ...? Es una broma :) –