diff --git a/docs/changelog/6.x.x.txt b/docs/changelog/6.x.x.txt index 4e3b55d5c..b8fc13e99 100644 --- a/docs/changelog/6.x.x.txt +++ b/docs/changelog/6.x.x.txt @@ -7,6 +7,8 @@ - Fixed Survey copy bug that was preventing section data from being copied. - Workedaround a bug for broken xml docs in Syndicated Content. (mwilson) - fix [ 1293947 ] 6.7.3 Cannot use a second AssetProxy with IE, Stack overflow (Wouter van Oijen / ProcoliX) + - Added a few more performance enhanceers which can cut the number of + database queries per page in half in some cases. 6.7.4 - fix [ 1279861 ] POD errors in 6.7.3 diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 9208f6f91..f2b64c9b4 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -963,11 +963,12 @@ sub new { my $assetId = shift; return undef unless ($assetId); my $className = shift; - my $revisionDate = shift; + my $revisionDate = shift || $session{assetRevision}{$assetId}{$session{scratch}{versionTag}||'_'}; unless ($revisionDate) { ($revisionDate) = WebGUI::SQL->quickArray("select max(revisionDate) from assetData where assetId=" .quote($assetId)." and (status='approved' or status='archived' or tagId=".quote($session{scratch}{versionTag}).") group by assetData.assetId order by assetData.revisionDate"); + $session{assetRevision}{$assetId}{$session{scratch}{versionTag}||'_'} = $revisionDate unless ($session{config}{disableCache}); } return undef unless ($revisionDate); if ($className) { @@ -1023,7 +1024,11 @@ sub newByDynamicClass { my $assetId = shift; my $revisionDate = shift; return undef unless defined $assetId; - my ($className) = WebGUI::SQL->quickArray("select className from asset where assetId=".quote($assetId)); + my $className = $session{assetClass}{$assetId}; + unless ($className) { + ($className) = WebGUI::SQL->quickArray("select className from asset where assetId=".quote($assetId)); + $session{assetClass}{$assetId} = $className unless ($session{config}{disableCache}); + } return undef unless ($className); return WebGUI::Asset->new($assetId,$className,$revisionDate); } diff --git a/lib/WebGUI/AssetLineage.pm b/lib/WebGUI/AssetLineage.pm index d149a3daf..730026d05 100644 --- a/lib/WebGUI/AssetLineage.pm +++ b/lib/WebGUI/AssetLineage.pm @@ -248,7 +248,11 @@ Returns the highest rank, top of the highest rank Asset under current Asset. sub getFirstChild { my $self = shift; unless (exists $self->{_firstChild}) { - my ($lineage) = WebGUI::SQL->quickArray("select min(asset.lineage) from asset,assetData where asset.parentId=".quote($self->getId)." and asset.assetId=assetData.assetId and asset.state='published'"); + my $lineage = $session{assetLineage}{firstChild}{$self->getId}; + unless ($lineage) { + ($lineage) = WebGUI::SQL->quickArray("select min(asset.lineage) from asset,assetData where asset.parentId=".quote($self->getId)." and asset.assetId=assetData.assetId and asset.state='published'"); + $session{assetLineage}{firstChild}{$self->getId} = $lineage unless ($session{config}{disableCache}); + } $self->{_firstChild} = WebGUI::Asset->newByLineage($lineage); } return $self->{_firstChild}; @@ -266,7 +270,11 @@ Returns the lowest rank, bottom of the lowest rank Asset under current Asset. sub getLastChild { my $self = shift; unless (exists $self->{_lastChild}) { - my ($lineage) = WebGUI::SQL->quickArray("select max(asset.lineage) from asset,assetData where asset.parentId=".quote($self->getId)." and asset.assetId=assetData.assetId and asset.state='published'"); + my $lineage = $session{assetLineage}{lastChild}{$self->getId}; + unless ($lineage) { + ($lineage) = WebGUI::SQL->quickArray("select max(asset.lineage) from asset,assetData where asset.parentId=".quote($self->getId)." and asset.assetId=assetData.assetId and asset.state='published'"); + $session{assetLineage}{lastChild}{$self->getId} = $lineage; + } $self->{_lastChild} = WebGUI::Asset->newByLineage($lineage); } return $self->{_lastChild}; @@ -592,7 +600,13 @@ Lineage string. sub newByLineage { my $self = shift; my $lineage = shift; - my ($id,$class) = WebGUI::SQL->quickArray("select assetId, className from asset where lineage=".quote($lineage)); + my $id = $session{assetLineage}{$lineage}{id}; + my $class = $session{assetLineage}{$lineage}{class}; + unless ($id && $class) { + ($id,$class) = WebGUI::SQL->quickArray("select assetId, className from asset where lineage=".quote($lineage)); + $session{assetLineage}{$lineage}{id} = $id unless ($session{config}{disableCache}); + $session{assetLineage}{$lineage}{class} = $class unless ($session{config}{disableCache}); + } return WebGUI::Asset->new($id, $class); } diff --git a/lib/WebGUI/Grouping.pm b/lib/WebGUI/Grouping.pm index ebfe0216c..bd76de5ef 100755 --- a/lib/WebGUI/Grouping.pm +++ b/lib/WebGUI/Grouping.pm @@ -230,7 +230,7 @@ sub getGroupsForUser { foreach my $gid (@groups) { $session{isInGroup}{$userId}{$gid} = 1; } - $session{gotGroupsForUser}{$userId} = \@groups; + $session{gotGroupsForUser}{$userId} = \@groups unless ($session{config}{disableCache}); return \@groups; } } @@ -278,7 +278,7 @@ sub getGroupsInGroup { my $gog = getGroupsInGroup($group,1,$loopCount); push(@groupsOfGroups, @$gog); } - $session{gotGroupsInGroup}{recursive}{$groupId} = \@groupsOfGroups; + $session{gotGroupsInGroup}{recursive}{$groupId} = \@groupsOfGroups unless ($session{config}{disableCache}); return \@groupsOfGroups; } $session{gotGroupsInGroup}{direct}{$groupId} = $groups; @@ -351,7 +351,7 @@ sub isInGroup { unless ($secondRun) { # don't look up user groups if we've already done it once. my $groups = WebGUI::Grouping::getGroupsForUser($uid,1); foreach (@{$groups}) { - $session{isInGroup}{$uid}{$_} = 1; + $session{isInGroup}{$uid}{$_} = 1 unless ($session{config}{disableCache}); } if ($session{isInGroup}{$uid}{$gid} eq '1') { return 1; @@ -370,7 +370,7 @@ sub isInGroup { my @ips = split(";",$group{ipFilter}); foreach my $ip (@ips) { if ($session{env}{REMOTE_ADDR} =~ /^$ip/) { - $session{isInGroup}{$uid}{$gid} = 1; + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); return 1; } } @@ -385,7 +385,7 @@ sub isInGroup { foreach my $var (@vars) { my ($name, $value) = split(/\=/,$var); if ($session{scratch}{$name} eq $value) { - $session{isInGroup}{$uid}{$gid} = 1; + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); return 1; } } @@ -399,7 +399,7 @@ sub isInGroup { ($karma) = WebGUI::SQL->quickHash("select karma from users where userId=".quote($uid)); } if ($karma >= $group{karmaThreshold}) { - $session{isInGroup}{$uid}{$gid} = 1; + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); return 1; } } @@ -418,13 +418,13 @@ sub isInGroup { } else { my ($result) = $sth->array; if ($result == 1) { - $session{isInGroup}{$uid}{$gid} = 1; + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); if ($group{dbCacheTimeout} > 0) { WebGUI::Grouping::deleteUsersFromGroups([$uid],[$gid]); WebGUI::Grouping::addUsersToGroups([$uid],[$gid],$group{dbCacheTimeout}); } } else { - $session{isInGroup}{$uid}{$gid} = 0; + $session{isInGroup}{$uid}{$gid} = 0 unless ($session{config}{disableCache}); WebGUI::Grouping::deleteUsersFromGroups([$uid],[$gid]) if ($group{dbCacheTimeout} > 0); } } @@ -457,13 +457,13 @@ sub isInGroup { } if(isIn($params->{connectDN},@{$people})) { - $session{isInGroup}{$uid}{$gid} = 1; + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); if ($group{dbCacheTimeout} > 10) { WebGUI::Grouping::deleteUsersFromGroups([$uid],[$gid]); WebGUI::Grouping::addUsersToGroups([$uid],[$gid],$group{dbCacheTimeout}); } } else { - $session{isInGroup}{$uid}{$gid} = 0; + $session{isInGroup}{$uid}{$gid} = 0 unless ($session{config}{disableCache}); WebGUI::Grouping::deleteUsersFromGroups([$uid],[$gid]) if ($group{dbCacheTimeout} > 10); } $ldapLink->unbind; @@ -478,11 +478,11 @@ sub isInGroup { foreach (@{$groups}) { $session{isInGroup}{$uid}{$_} = isInGroup($_, $uid, 1); if ($session{isInGroup}{$uid}{$_}) { - $session{isInGroup}{$uid}{$gid} = 1; # cache current group also so we don't have to do the group in group check again + $session{isInGroup}{$uid}{$gid} = 1 unless ($session{config}{disableCache}); # cache current group also so we don't have to do the group in group check again return 1; } } - $session{isInGroup}{$uid}{$gid} = 0; + $session{isInGroup}{$uid}{$gid} = 0 unless ($session{config}{disableCache}); return 0; }