From 03902471f6931a9e09c9f67d5a0339eeec1d6786 Mon Sep 17 00:00:00 2001 From: Heiko Bernloehr Date: Wed, 19 Feb 2020 18:14:54 +0100 Subject: Rework of Limit participants view of receiver-/sender messages and events. The old implementation consumes too much memory because of reading all messages into an array. --- app/views/admin/participants/show.html.haml | 120 ++++++++++++++++++---------- 1 file changed, 78 insertions(+), 42 deletions(-) diff --git a/app/views/admin/participants/show.html.haml b/app/views/admin/participants/show.html.haml index 1be8b40..d2f8255 100644 --- a/app/views/admin/participants/show.html.haml +++ b/app/views/admin/participants/show.html.haml @@ -97,99 +97,135 @@ | = link_to 'Back', admin_participants_path + - eventsm = 10 -- events = Event.for_participant(@participant,-1).uniq -- eventsl=events.length -- if eventsl>eventsm then events = events[0,eventsm/2] + events[-(eventsm/2),eventsm/2] end -- unless events.blank? +- events_count = Event.for_participant(@participant,-1).uniq.count +- if events_count < eventsm or events_count < 5 + - events_first = Event.for_participant(@participant,-1).uniq +-else + - events_first = Event.for_participant(@participant,-1).uniq.uniq.limit(eventsm/2) + - events_last = Event.for_participant(@participant,-1).uniq.limit(eventsm/2).offset(events_count-(eventsm/2)) + - events_diff = events_last - events_first +- unless events_first.blank? %p .show-output-width.table-border .table-header - - if eventsl>eventsm then - %label.table-resource-label Unprocessed Events (total number: #{eventsl}): + - if events_count > 0 then + %label.table-resource-label Unprocessed Events (total number: #{events_count}): - else %label.table-resource-label Unprocessed Events: - + %table.list(width="100%") %tr(align="left") %th Id: %th Message-Id: %th Event-Type: %th Date: - - events.each_with_index do |event,number| - - if eventsl>eventsm and number==(eventsm/2) then - %tr{:class => [cycle('list-line-odd', 'list-line-even')]} - %td= "..." - %td= "..." - %td= "..." - %td= "..." + - events_first.each do |event| %tr{:class => [cycle('list-line-odd', 'list-line-even')]} %td= event.id %td= event.message.id %td= event.ev_type.name %td= event.updated_at + - unless events_diff.blank? + - if events_count > 2*(eventsm/2) + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= "..." + %td= "..." + %td= "..." + %td= "..." + - events_last.each do |event| + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= event.id + %td= event.message.id + %td= event.ev_type.name + %td= event.updated_at + - msgsm = 10 -- messages = Message.for_participant_receiver(@participant).for_not_removed.uniq -- msgsl = messages.length -- if msgsl>msgsm then messages = messages[0,msgsm/2] + messages[-(msgsm/2),msgsm/2] end -- unless messages.blank? +- messages_count = Message.for_participant_receiver(@participant).for_not_removed.uniq.count +- if messages_count < msgsm or messages_count < 5 + - messages_first = Message.for_participant_receiver(@participant).for_not_removed.uniq +-else + - messages_first = Message.for_participant_receiver(@participant).for_not_removed.uniq.limit(msgsm/2) + - messages_last = Message.for_participant_receiver(@participant).for_not_removed.uniq.limit(msgsm/2).offset(messages_count-(msgsm/2)) + - messages_diff = messages_last - messages_first +- unless messages_first.blank? %p .show-output-width.table-border .table-header - - if msgsl>msgsm then - %label.table-resource-label Received Messages (total number: #{msgsl}): + - if messages_count > 0 then + %label.table-resource-label Received Messages (total number: #{messages_count}): - else %label.table-resource-label Received Messages: - + %table.list(width="100%") %tr(align="left") %th Id: %th Resource: %th Content-Type: %th Date: - - messages.each_with_index do |msg,number| - - if msgsl>msgsm and number==(msgsm/2) then - %tr{:class => [cycle('list-line-odd', 'list-line-even')]} - %td= "..." - %td= "..." - %td= "..." - %td= "..." + - messages_first.each do |msg| %tr{:class => [cycle('list-line-odd', 'list-line-even')]} %td= msg.id %td= msg.ressource.namespace+'/'+msg.ressource.ressource %td= msg.content_type %td= msg.created_at + - unless messages_diff.blank? + - if messages_count > 2*(msgsm/2) + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= "..." + %td= "..." + %td= "..." + %td= "..." + - messages_last.each do |msg| + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= msg.id + %td= msg.ressource.namespace+'/'+msg.ressource.ressource + %td= msg.content_type + %td= msg.created_at + - msgsm = 10 -- messages = Message.for_participant_sender(@participant).for_not_removed.uniq -- msgsl = messages.length -- if msgsl>msgsm then messages = messages[0,msgsm/2] + messages[-(msgsm/2),msgsm/2] end -- unless messages.blank? +- messages_count = Message.for_participant_sender(@participant).for_not_removed.uniq.count +- if messages_count < msgsm or messages_count < 5 + - messages_first = Message.for_participant_sender(@participant).for_not_removed.uniq +-else + - messages_first = Message.for_participant_sender(@participant).for_not_removed.uniq.limit(msgsm/2) + - messages_last = Message.for_participant_sender(@participant).for_not_removed.uniq.limit(msgsm/2).offset(messages_count-(msgsm/2)) + - messages_diff = messages_last - messages_first +- unless messages_first.blank? %p .show-output-width.table-border .table-header - - if msgsl>msgsm then - %label.table-resource-label Sent Messages (total number: #{msgsl}): + - if messages_count > 0 then + %label.table-resource-label Sent Messages (total number: #{messages_count}): - else %label.table-resource-label Sent Messages: - + %table.list(width="100%") %tr(align="left") %th Id: %th Resource: %th Content-Type: %th Date: - - messages.each_with_index do |msg,number| - - if msgsl>msgsm and number==(msgsm/2) then - %tr{:class => [cycle('list-line-odd', 'list-line-even')]} - %td= "..." - %td= "..." - %td= "..." - %td= "..." + - messages_first.each do |msg| %tr{:class => [cycle('list-line-odd', 'list-line-even')]} %td= msg.id %td= msg.ressource.namespace+'/'+msg.ressource.ressource %td= msg.content_type %td= msg.created_at + - unless messages_diff.blank? + - if messages_count > 2*(msgsm/2) + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= "..." + %td= "..." + %td= "..." + %td= "..." + - messages_last.each do |msg| + %tr{:class => [cycle('list-line-odd', 'list-line-even')]} + %td= msg.id + %td= msg.ressource.namespace+'/'+msg.ressource.ressource + %td= msg.content_type + %td= msg.created_at -- cgit v1.2.3