conversations/4\r
]).
--compile(export_all).
-
-include("euphorik_bd.hrl").
-include_lib("stdlib/include/qlc.hrl").
% Message est le message de type #minichat et Parents une liste d'Id.
% Plus est un bool. Si Plus vaut true alors il y a encore des messages.
% Si il n'y a pas de nouveaux message alors la fonction est bloquante et attend un nouveau message.
-% @spec conversations([{integer(), integer()}], integer(), integer(), integer()) -> [Conversation()]
+% @spec conversations([{integer(), integer(), integer()}], integer(), integer(), integer()) -> [Conversation()]
conversations(Racines, N, D, P) ->
% écoute des nouveaux messages
case subscribe(minichat, 2) of
_ ->
% demande des conversations
Conversations = conversations_detailees(Racines, N, D, P),
+ %io:format("Conversations : ~p~n", [Conversations]),
% si les conversations sont vides alors on attend un nouveau message
Vide = not any(
fun(C) ->
Conversations_mises_en_forme = mise_en_forme_conversations(
if Vide ->
attend_nouveau_message(),
+ %io:format("Racines = ~p, N = ~p, D = ~p, P = ~p~n", [Racines, N, D, P]),
+ %io:format("Conversations = ~p~n", [conversations_detailees(Racines, N, D, P)]),
conversations_detailees(Racines, N, D, P);
true ->
Conversations
end
),
+ %io:format("Conversations_mises_en_forme = ~p~n", [Conversations_mises_en_forme]),
unsubscribe(minichat),
Conversations_mises_en_forme
end.
% Racines est une liste de tuple {Id, P} des racines des conversations ou P est la page et Id l'id du message.
% @spec conversations_detailees([{integer(), integer()}], integer(), integer(), integer()) -> [[integer()] | Conversation_detailee()]
conversations_detailees(Racines, N, D, P) ->
- Conversations = map(fun({Racine, P_conv}) -> conversation(Racine, N, D, P_conv) end, Racines),
+ Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines),
Conversation_principale = resultat_transaction(transaction(fun() ->
Curseur = qlc:cursor(q([E#minichat.id || E <- qlc:sort(table(minichat), [{order, descending}])])),
{CP, Plus} = conversation_principale(Curseur, Conversations, N, P),
% @spec conversation([integer()], integer(), integer(), integer()) -> Conversation_detailee()
conversation(R, N, D, P) ->
{C, X} = conversation([], [R], []),
- Decalage = N*(P-1)+1,
+ Decalage = N * (P - 1) + 1,
{
reverse(C),
if Decalage > length(C) ->
[];
true ->
- reverse(filter(
+ filter(
fun(E) -> E > D end,
- sublist(C, Decalage, N)
- ))
+ reverse(sublist(C, Decalage, N))
+ )
end,
reverse(X),
Decalage + N - 1 < length(C)
conversation(Messages, [M | Reste], X) ->
Est_deja_traite = any(fun(E) -> E =:= M end, Messages),
if Est_deja_traite ->
- conversation(Messages, Reste, X);
- true ->
- Enfants = enfants(M),
- Parents = parents(M),
- % un message est dit externe si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
- Est_message_externe = Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
- conversation([M | Messages], Reste ++ Enfants, if Est_message_externe -> [M | X]; true -> X end)
+ conversation(Messages, Reste, X);
+ true ->
+ Enfants = enfants(M),
+ Parents = parents(M),
+ % un message est dit externe si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
+ Est_message_externe = Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
+ conversation([M | Messages], lists:merge(Reste, Enfants), if Est_message_externe -> [M | X]; true -> X end)
end;
conversation(Messages, [], X) ->
{Messages, X}.