From 4bcf12da02db1df237e68b5f52e4666ef6d44ed8 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Wed, 24 Sep 2008 22:48:35 +0000 Subject: [PATCH] clean up next/previous code for threads --- lib/WebGUI/Asset/Post/Thread.pm | 120 ++++++++++++++++---------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm index 674152488..f8b131cb0 100644 --- a/lib/WebGUI/Asset/Post/Thread.pm +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -178,7 +178,62 @@ sub DESTROY { $self->SUPER::DESTROY; } +#------------------------------------------------------------------- +=head2 getAdjacentThread ( ) + +Given a field and an order, returns the nearest thread when sorting by those. + +=cut + +sub getAdjacentThread { + my $self = shift; + my $sortBy = shift; + my $sortOrder = uc shift; + my $session = $self->session; + + my $sortCompare = $sortOrder eq 'ASC' ? '>=' : '<='; + ( my $sortByField = $sortBy ) =~ s/.*\.//; + my $sortCompareValue = $self->get($sortByField); + + # make sortBy safe to include directly in SQL + $sortBy = join('.', map { $session->db->dbh->quote_identifier($_) } split(/\./, $sortBy)); + + my $versionTag = WebGUI::VersionTag->getWorking($session, 'nocreate'); + my $tagId = $versionTag ? $versionTag->getId : undef; + + my ($id, $class, $version) = $self->session->dbSlave->quickArray(< ? + AND asset.state = 'published' + AND $sortBy $sortCompare ? + AND assetData.revisionDate = ( + SELECT MAX(revisionDate) + FROM assetData + WHERE + assetData.assetId = asset.assetId + AND ( + assetData.status IN ('approved','archived') + OR assetData.tagId=? + OR (assetData.ownerUserId=? AND assetData.ownerUserId<>'1') + ) + ) + ORDER BY $sortBy $sortOrder, assetData.revisionDate $sortOrder + LIMIT 1 +END_SQL + [$self->get('parentId'), $self->getId, $sortCompareValue, $tagId, $session->user->userId] + ); + if ($id) { + return WebGUI::Asset->new($session, $id, $class, $version); + } + return undef; +} #------------------------------------------------------------------- @@ -248,43 +303,16 @@ Returns a thread object for the next (newer) thread in the same forum. sub getNextThread { my $self = shift; - unless (defined $self->{_next}) { + unless (exists $self->{_next}) { my $parent = $self->getParent; my $sortBy = $parent->getSortBy; - my $sortByCompare = $sortBy eq 'assetData.revisionDate' ? $self->get('revisionDate') : $self->get($sortBy); - $sortBy = join('.', map { $self->session->db->dbh->quote_identifier($_) } split(/\./, $sortBy)); my $sortOrder = $parent->getSortOrder; - my $sortCompare = lc $sortOrder eq 'asc' ? '>=' : '<='; - my ($id, $class, $version) = $self->session->dbSlave->quickArray(<get("parentId"), $self->getId, $sortByCompare, $self->session->scratch->get("versionTag"), $self->session->user->userId]); - select asset.assetId, asset.className, max(assetData.revisionDate) - from Thread - left join asset on asset.assetId=Thread.assetId - left join assetData on assetData.assetId=Thread.assetId and assetData.revisionDate=Thread.revisionDate - left join Post on Post.assetId=assetData.assetId and assetData.revisionDate=Post.revisionDate - where - asset.parentId=? - and asset.assetId <> ? - and asset.state='published' - and asset.className='WebGUI::Asset::Post::Thread' - and $sortBy $sortCompare ? - and ( - assetData.status in ('approved','archived') - or assetData.tagId=? - or (assetData.ownerUserId=? and assetData.ownerUserId<>'1') - ) - group by assetData.assetId - order by $sortBy $sortOrder, assetData.revisionDate asc - limit 1 -END_SQL - if ($id) { - $self->{_next} = WebGUI::Asset->new($self->session, $id, $class, $version); - } + $self->{_next} = $self->getAdjacentThread($sortBy, $sortOrder); }; return $self->{_next}; } - #------------------------------------------------------------------- =head2 getPosts ( ) @@ -312,38 +340,12 @@ Returns a thread object for the previous (older) thread in the same forum. sub getPreviousThread { my $self = shift; - unless (defined $self->{_previous}) { + unless (exists $self->{_previous}) { my $parent = $self->getParent; my $sortBy = $parent->getSortBy; - my $sortByCompare = $sortBy eq 'assetData.revisionDate' ? $self->get('revisionDate') : $self->get($sortBy); - $sortBy = join('.', map { $self->session->db->dbh->quote_identifier($_) } split(/\./, $sortBy)); - my $sortOrder = lc($parent->getSortOrder) eq 'asc' ? 'desc' : 'asc'; - my $sortCompare = lc $sortOrder eq 'asc' ? '>=' : '<='; - my ($id, $class, $version) = $self->session->dbSlave->quickArray(<get("parentId"), $self->getId, $sortByCompare, $self->session->scratch->get("versionTag"), $self->session->user->userId]); - select asset.assetId, asset.className, max(assetData.revisionDate) - from Thread - left join asset on asset.assetId=Thread.assetId - left join assetData on assetData.assetId=Thread.assetId and assetData.revisionDate=Thread.revisionDate - left join Post on Post.assetId=assetData.assetId and assetData.revisionDate=Post.revisionDate - where - asset.parentId=? - and asset.assetId <> ? - and asset.state='published' - and asset.className='WebGUI::Asset::Post::Thread' - and $sortBy $sortCompare ? - and ( - assetData.status in ('approved','archived') - or assetData.tagId=? - or (assetData.ownerUserId=? and assetData.ownerUserId<>'1') - ) - group by assetData.assetId - order by $sortBy $sortOrder, assetData.revisionDate desc - limit 1 -END_SQL - if ($id) { - $self->{_previous} = WebGUI::Asset->new($self->session, $id, $class, $version); - } - }; + my $sortOrder = uc $parent->getSortOrder eq 'ASC' ? 'DESC' : 'ASC'; + $self->{_previous} = $self->getAdjacentThread($sortBy, $sortOrder); + } return $self->{_previous}; }