clean up next/previous code for threads
This commit is contained in:
parent
64a6976a25
commit
4bcf12da02
1 changed files with 61 additions and 59 deletions
|
|
@ -178,7 +178,62 @@ sub DESTROY {
|
||||||
$self->SUPER::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(<<END_SQL,
|
||||||
|
SELECT asset.assetId, asset.className, assetData.revisionDate
|
||||||
|
FROM Thread
|
||||||
|
INNER JOIN asset ON asset.assetId = Thread.assetId
|
||||||
|
INNER JOIN assetData ON assetData.assetId = Thread.assetId AND assetData.revisionDate = Thread.revisionDate
|
||||||
|
INNER JOIN Post ON Post.assetId = assetData.assetId AND assetData.revisionDate = Post.revisionDate
|
||||||
|
WHERE
|
||||||
|
asset.parentId = ?
|
||||||
|
AND asset.assetId <> ?
|
||||||
|
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 {
|
sub getNextThread {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
unless (defined $self->{_next}) {
|
unless (exists $self->{_next}) {
|
||||||
my $parent = $self->getParent;
|
my $parent = $self->getParent;
|
||||||
my $sortBy = $parent->getSortBy;
|
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 $sortOrder = $parent->getSortOrder;
|
||||||
my $sortCompare = lc $sortOrder eq 'asc' ? '>=' : '<=';
|
$self->{_next} = $self->getAdjacentThread($sortBy, $sortOrder);
|
||||||
my ($id, $class, $version) = $self->session->dbSlave->quickArray(<<END_SQL, [$self->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);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
return $self->{_next};
|
return $self->{_next};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 getPosts ( )
|
=head2 getPosts ( )
|
||||||
|
|
@ -312,38 +340,12 @@ Returns a thread object for the previous (older) thread in the same forum.
|
||||||
|
|
||||||
sub getPreviousThread {
|
sub getPreviousThread {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
unless (defined $self->{_previous}) {
|
unless (exists $self->{_previous}) {
|
||||||
my $parent = $self->getParent;
|
my $parent = $self->getParent;
|
||||||
my $sortBy = $parent->getSortBy;
|
my $sortBy = $parent->getSortBy;
|
||||||
my $sortByCompare = $sortBy eq 'assetData.revisionDate' ? $self->get('revisionDate') : $self->get($sortBy);
|
my $sortOrder = uc $parent->getSortOrder eq 'ASC' ? 'DESC' : 'ASC';
|
||||||
$sortBy = join('.', map { $self->session->db->dbh->quote_identifier($_) } split(/\./, $sortBy));
|
$self->{_previous} = $self->getAdjacentThread($sortBy, $sortOrder);
|
||||||
my $sortOrder = lc($parent->getSortOrder) eq 'asc' ? 'desc' : 'asc';
|
}
|
||||||
my $sortCompare = lc $sortOrder eq 'asc' ? '>=' : '<=';
|
|
||||||
my ($id, $class, $version) = $self->session->dbSlave->quickArray(<<END_SQL, [$self->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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return $self->{_previous};
|
return $self->{_previous};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue