From 1e71544d663c277066c8087bcd86182e5826ac35 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Thu, 19 Sep 2019 11:13:28 -0300 Subject: [PATCH] Bug 23624: (QA follow-up) Optimize even more This patch makes counting the results have no memory footprint by leveraging on the DB to count the rows. To test: - Without this path, run: $ kshell k$ prove t/db_dependent/Reports/Guided.t => SUCCESS: Tests pass - Apply this patch - Run: k$ prove t/db_dependent/Reports/Guided.t => SUCCESS: Tests still pass! Signed-off-by: Tomas Cohen Arazi --- C4/Reports/Guided.pm | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/C4/Reports/Guided.pm b/C4/Reports/Guided.pm index aae069195f..58d78002e0 100644 --- a/C4/Reports/Guided.pm +++ b/C4/Reports/Guided.pm @@ -418,14 +418,19 @@ sub get_criteria { sub nb_rows { my $sql = shift or return; - my $sth = C4::Context->dbh->prepare($sql); - $sth->execute(); - my $n = 0; - # Loop through the complete results, fetching 1,000 rows at a time. This - # lowers memory requirements but increases execution time. - while (my $rows = $sth->fetchall_arrayref(undef, 1000)) { - $n += @$rows; + + my $derived_name = 'xxx'; + # make sure the derived table name is not already used + while ( $sql =~ m/$derived_name/ ) { + $derived_name .= 'x'; } + my $sth = C4::Context->dbh->prepare(qq{ + SELECT COUNT(*) FROM + ( $sql ) $derived_name + }); + $sth->execute(); + my $n = $sth->fetch->[0]; + return $n; } -- 2.23.0