From 5d597b709c72476d05862feeb6437d42d4634e58 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Tue, 15 Apr 2008 22:36:44 +0000 Subject: [PATCH] fixed: Package search is slow for large websites --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/AssetPackage.pm | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index c89eabf89..70280128c 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,6 +1,7 @@ 7.5.11 - fix: template variable isUncommitted is not documented in the help - fix: Event is no longer editable by anyone who can add events + - fixed: Package search is slow for large websites 7.5.10 - fix: Syntax error in GetCsMail diff --git a/lib/WebGUI/AssetPackage.pm b/lib/WebGUI/AssetPackage.pm index 877f2b8d1..a94c2ed91 100644 --- a/lib/WebGUI/AssetPackage.pm +++ b/lib/WebGUI/AssetPackage.pm @@ -86,12 +86,12 @@ Returns an array of hashes containing title, assetId, and className for all asse sub getPackageList { my $self = shift; - my @assets; my $sql = " select asset.assetId, assetData.revisionDate, - asset.className + asset.className, + assetData.title from asset left join @@ -101,14 +101,17 @@ sub getPackageList { and assetData.revisionDate=(SELECT max(revisionDate) from assetData where assetData.assetId=asset.assetId and (assetData.status='approved'"; $sql .= " or assetData.tagId=".$self->session->db->quote($self->session->scratch->get("versionTag")) if ($self->session->scratch->get("versionTag")); - $sql .= ")) and asset.state='published' group by assetData.assetId order by assetData.title desc"; - my $sth = $self->session->db->read($sql); - while (my ($id, $date, $class) = $sth->array) { - my $asset = WebGUI::Asset->new($self->session, $id,$class); - push(@assets, $asset) if ($asset->get("isPackage")); - } - $sth->finish; - return \@assets; + $sql .= ")) and asset.state='published'"; + my $sth = $self->session->db->read($sql); + # MySQL sorts this very slowly, so we do it ourselves + my @assets; + while (my ($id, $date, $class, $title) = $sth->array) { + my $asset = WebGUI::Asset->new($self->session, $id, $class, $date); + push(@assets, [$title, $asset]) if ($asset->get("isPackage")); + } + $sth->finish; + @assets = map { $_->[1] } sort { $a->[0] cmp $b->[0] } @assets; + return \@assets; }