From c597b3fc7d5e7adc2bbd8b113e2e0ad0cf5a5655 Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Thu, 18 Apr 2013 16:46:37 +0200 Subject: [PATCH] restructuring DB access using prefetch to improve performance the whole preferences page now only needs 4 sql queries --- lib/NGCP/Panel/Controller/Domain.pm | 75 +++++++++++++++++---------- share/templates/domain/preferences.tt | 1 - share/templates/helpers/pref_table.tt | 2 +- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index 858d6c4cab..2682debab9 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -157,6 +157,10 @@ sub ajax :Chained('list') :PathPart('ajax') :Args(0) { sub preferences :Chained('base') :PathPart('preferences') :Args(0) { my ($self, $c) = @_; + + $c->stash->{provisioning_domain_id} = $c->model('provisioning') + ->resultset('voip_domains') + ->single({domain => $c->stash->{domain}->{domain}})->id; $self->load_preference_list($c); $c->stash(template => 'domain/preferences.tt'); @@ -272,39 +276,54 @@ sub preferences_edit :Chained('preferences_detail') :PathPart('edit') :Args(0) { sub load_preference_list : Private { my ($self, $c) = @_; - my @dom_prefs = $c->model('provisioning') - ->resultset('voip_preferences') - ->search({ dom_pref => 1, internal => 0}) + my @dom_pref_groups = $c->model('provisioning') + ->resultset('voip_preference_groups') + ->search({ 'voip_preferences.dom_pref' => 1, 'voip_preferences.internal' => 0, + }, { + prefetch => {'voip_preferences' => 'voip_preferences_enums'}, + }) ->all; - + my $dom_pref_values = $c->model('provisioning') - ->resultset('voip_domains') - ->single({domain => $c->stash->{domain}->{domain}}) - ->voip_dom_preferences; - - foreach my $pref(@dom_prefs) { - # TODO: do we do an unnecessary query again? - my $val = $dom_pref_values->search({attribute_id => $pref->id}); - if($pref->data_type eq "enum") { - $pref->{enums} = []; - push @{ $pref->{enums} }, - $pref->voip_preferences_enums->search({dom_pref => 1})->all; - } - next unless(defined $val); - if($pref->max_occur != 1) { - $pref->{value} = []; - while(my $v = $val->next) { - push @{ $pref->{value} }, $v->value; + ->resultset('voip_preferences') + ->search({ + domain => $c->stash->{domain}->{domain} + },{ + prefetch => {'voip_dom_preferences' => 'domain'}, + }); + + my %pref_values; + foreach my $value($dom_pref_values->all) { + + $pref_values{$value->attribute} = [ + map {$_->value} $value->voip_dom_preferences->all + ]; + } + + foreach my $group(@dom_pref_groups) { + my @group_prefs = $group->voip_preferences->all; + + foreach my $pref(@group_prefs) { + if($pref->data_type eq "enum") { + $pref->{enums} = []; + push @{ $pref->{enums} }, + $pref->voip_preferences_enums->search({dom_pref => 1})->all; + } + my @values = @{ + exists $pref_values{$pref->attribute} + ? $pref_values{$pref->attribute} + : [] + }; + next unless(scalar @values); + if($pref->max_occur != 1) { + $pref->{value} = \@values; + } else { + $pref->{value} = $values[0]; } - } else { - $pref->{value} = defined $val->first ? $val->first->value : undef; } + $group->{prefs} = \@group_prefs; } - $c->stash(pref_rows => \@dom_prefs); - - my $pref_groups_rs = $c->model('provisioning')->resultset('voip_preference_groups'); - my @pref_groups = $pref_groups_rs->all; - $c->stash(pref_groups => \@pref_groups); + $c->stash(pref_groups => \@dom_pref_groups); } =head1 AUTHOR diff --git a/share/templates/domain/preferences.tt b/share/templates/domain/preferences.tt index a5b0c60b9a..700fcd8849 100644 --- a/share/templates/domain/preferences.tt +++ b/share/templates/domain/preferences.tt @@ -4,7 +4,6 @@ helper.name = 'Domain'; helper.messages = messages; - helper.rows = pref_rows; helper.edit_preference = edit_preference; helper.preference = preference; helper.preference_meta = preference_meta; diff --git a/share/templates/helpers/pref_table.tt b/share/templates/helpers/pref_table.tt index 56d3f21ed8..529c4ffc16 100644 --- a/share/templates/helpers/pref_table.tt +++ b/share/templates/helpers/pref_table.tt @@ -45,7 +45,7 @@ body { - [% FOREACH r IN helper.rows %] + [% FOREACH r IN group.prefs %] [% NEXT IF r.voip_preference_groups_id != group.id %]