Bugzilla – Attachment 25305 Details for
Bug 11714
GetBudgetHierarchy needs optimization
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
[SIGNED-OFF] Bug 11714 - GetBudgetHierarchy needs optimization
SIGNED-OFF-Bug-11714---GetBudgetHierarchy-needs-op.patch (text/plain), 6.63 KB, created by
Marc Véron
on 2014-02-15 17:25:46 UTC
(
hide
)
Description:
[SIGNED-OFF] Bug 11714 - GetBudgetHierarchy needs optimization
Filename:
MIME Type:
Creator:
Marc Véron
Created:
2014-02-15 17:25:46 UTC
Size:
6.63 KB
patch
obsolete
>From 6817c88a6ef5608d1ffffff7a57345c4c552778a Mon Sep 17 00:00:00 2001 >From: Fridolin Somers <fridolin.somers@biblibre.com> >Date: Fri, 7 Feb 2014 17:59:01 +0100 >Subject: [PATCH] [SIGNED-OFF] Bug 11714 - GetBudgetHierarchy needs > optimization >MIME-Version: 1.0 >Content-Type: text/plain; charset=UTF-8 >Content-Transfer-Encoding: 8bit > >The method C4::Budgets::GetBudgetHierarchy() retreives from database budgets in an array containing a tree of budgets (parent -> children -> children, ...). >The code generating this tree with the SQL results needs optimization because when a lot of budgets exists, it can run during several minutes. > >This patch rewites the code using a recurive method. > >Test plan : >- Create a active budget "MyBudget" with 1000 >- Click "Add found" on this budget >- Create a found "Parent" with 1000, set you has owner >- Click "Add child found" on found "Parent" >- Create a found "Child" with 100, set you has owner >- Click "Add child found" on found "Child" >- Create a found "Grand-child" with 10, set you has owner >| >- Create a new acquisition basket >- Add a new order with "Child budget" >- Select "Child" found and set all costs to 2 >- Save order >- Add a new order with "Grand-Child budget" >- Select "Child" found and set all costs to 2 >- Save order >- Close basket >- Perform the receive of the two orders >| >- Go to founds of "MyBudget" >=> You see a table with 3 founds >- in "Fund filters", select no library and uncheck "Show my funds only" and click on "Go" >=> You see a table with "Parent" found >- Click on small arrow left of the fund code of "Parent" >=> You see a new line with "Child" found >- Click on small arrow left of the fund code of "Child" >=> You see a new line with "Grand-Child" found >| >=> You see in "Grand-Child" row "Base-level spent" = 2 and "Total sublevels spent" = 2 >=> You see in "Child" row "Base-level spent" = 2 and "Total sublevels spent" = 4 >This confirms the founds are used in a hierarchie. > >I followed the test plan. The behavior was as expected. >Signed-off-by: Marc Véron <veron@veron.ch> >--- > C4/Budgets.pm | 122 ++++++++++++++++++++++----------------------------------- > 1 file changed, 47 insertions(+), 75 deletions(-) > >diff --git a/C4/Budgets.pm b/C4/Budgets.pm >index 758e98f..a75fb82 100644 >--- a/C4/Budgets.pm >+++ b/C4/Budgets.pm >@@ -528,98 +528,58 @@ sub GetBudgetHierarchy { > $debug && warn $query,join(",",@bind_params); > my $sth = $dbh->prepare($query); > $sth->execute(@bind_params); >- my $results = $sth->fetchall_arrayref({}); >- my @res = @$results; >- my $i = 0; >- while (1) { >- my $depth_cnt = 0; >- foreach my $r (@res) { >- my @child; >- # look for children >- $r->{depth} = '0' if !defined $r->{budget_parent_id}; >- foreach my $r2 (@res) { >- if (defined $r2->{budget_parent_id} >- && $r2->{budget_parent_id} == $r->{budget_id}) { >- push @child, $r2->{budget_id}; >- $r2->{depth} = ($r->{depth} + 1) if defined $r->{depth}; >- } >- } >- $r->{child} = \@child if scalar @child > 0; # add the child >- $depth_cnt++ if !defined $r->{'depth'}; >- } >- last if ($depth_cnt == 0 || $i == 100); >- $i++; >- } > >- # look for top parents 1st >- my (@sort, $depth_count); >- ($i, $depth_count) = 0; >- while (1) { >- my $children = 0; >- foreach my $r (@res) { >- if ($r->{depth} == $depth_count) { >- $children++ if (ref $r->{child} eq 'ARRAY'); >- >- # find the parent id element_id and insert it after >- my $i2 = 0; >- my $parent; >- if ($depth_count > 0) { >- >- # add indent >- my $depth = $r->{depth} * 2; >- $r->{budget_code_indent} = $r->{budget_code}; >- $r->{budget_name_indent} = $r->{budget_name}; >- foreach my $r3 (@sort) { >- if ($r3->{budget_id} == $r->{budget_parent_id}) { >- $parent = $i2; >- last; >- } >- $i2++; >- } >- } else { >- $r->{budget_code_indent} = $r->{budget_code}; >- $r->{budget_name_indent} = $r->{budget_name}; >- } >- >- if (defined $parent) { >- splice @sort, ($parent + 1), 0, $r; >- } else { >- push @sort, $r; >- } >- } >- >- $i++; >- } # --------------foreach >- $depth_count++; >- last if $children == 0; >- } >+ my %links; >+ # create hash with budget_id has key >+ while ( my $data = $sth->fetchrow_hashref ) { >+ $links{ $data->{'budget_id'} } = $data; >+ } > >-# add budget-percent and allocation, and flags for html-template >- foreach my $r (@sort) { >- my $subs_href = $r->{'child'}; >- my @subs_arr = (); >- if ( defined $subs_href ) { >- @subs_arr = @{$subs_href}; >+ # link child to parent >+ my @first_parents; >+ foreach ( sort keys %links ) { >+ my $child = $links{$_}; >+ if ( $child->{'budget_parent_id'} ) { >+ my $parent = $links{ $child->{'budget_parent_id'} }; >+ if ($parent) { >+ unless ( $parent->{'children'} ) { >+ # init child arrayref >+ $parent->{'children'} = []; >+ } >+ # add as child >+ push @{ $parent->{'children'} }, $child; >+ } >+ } else { >+ push @first_parents, $child; > } >+ } > >- my $moo = $r->{'budget_code_indent'}; >+ my @sort = (); >+ foreach my $first_parent (@first_parents) { >+ _add_budget_children(\@sort, $first_parent); >+ } >+ >+ # add budget-percent and allocation, and flags for html-template >+ foreach my $r (@sort) { >+ my $subs = $r->{'children'} || []; >+ >+ my $moo = $r->{'budget_code'}; > $moo =~ s/\ /\ \;/g; > $r->{'budget_code_indent'} = $moo; > >- $moo = $r->{'budget_name_indent'}; >+ $moo = $r->{'budget_name'}; > $moo =~ s/\ /\ \;/g; > $r->{'budget_name_indent'} = $moo; > >- $r->{'budget_spent'} = GetBudgetSpent( $r->{'budget_id'} ); >+ $r->{'budget_spent'} = GetBudgetSpent( $r->{'budget_id'} ); > > $r->{'budget_amount_total'} = $r->{'budget_amount'}; > > # foreach sub-levels > my $unalloc_count ; > >- foreach my $sub (@subs_arr) { >+ foreach my $sub (@$subs) { > my $sub_budget = GetBudget($sub); >- > $r->{budget_spent_sublevel} += GetBudgetSpent( $sub_budget->{'budget_id'} ); > $unalloc_count += $sub_budget->{'budget_amount'}; > } >@@ -627,6 +587,18 @@ sub GetBudgetHierarchy { > return \@sort; > } > >+# Recursive method to add a budget and its chidren to an array >+sub _add_budget_children { >+ my $res = shift; >+ my $budget = shift; >+ push @$res, $budget; >+ my $children = $budget->{'children'} || []; >+ return unless @$children; # break recursivity >+ foreach my $child (@$children) { >+ _add_budget_children($res, $child); >+ } >+} >+ > # ------------------------------------------------------------------- > > sub AddBudget { >-- >1.7.10.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 11714
:
25147
|
25305
|
29624
|
30925
|
30942
|
30943
|
31103
|
31104