Skip to content

Commit

Permalink
Merge branch 'popular'
Browse files Browse the repository at this point in the history
  • Loading branch information
gentlecat committed Jan 8, 2015
2 parents 621293c + fb3142f commit 7a751b4
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
23 changes: 18 additions & 5 deletions critiquebrainz/data/model/review.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"""
from critiquebrainz.data import db
from sqlalchemy import desc, func, and_
from sqlalchemy.orm import aliased
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.dialects.postgresql import UUID
from critiquebrainz.data.model.vote import Vote
Expand Down Expand Up @@ -245,9 +246,20 @@ def get_popular(cls, limit=None):
reviews = cache.get(cache_key)

if not reviews:
query = Review.query.filter(and_(Review.is_archived == False,
Review.is_draft == False)) \
.distinct(Review.release_group) # different release groups
# Selecting reviews for distinct release groups
# TODO: The is a problem with selecting popular reviews like this:
# If there are multiple reviews for a release group we don't choose
# the most popular.
distinct_subquery = db.session.query(Review) \
.filter(Review.is_draft == False) \
.distinct(Review.release_group).subquery()

# Randomizing results to get some variety
rand_subquery = db.session.query(aliased(Review, distinct_subquery)) \
.order_by(func.random()).subquery()

# Sorting reviews by rating
query = db.session.query(aliased(Review, rand_subquery))

# Preparing base query for getting votes
vote_query_base = db.session.query(
Expand All @@ -267,11 +279,12 @@ def get_popular(cls, limit=None):
votes_neg, and_(votes_neg.c.revision_id == Revision.id,
votes_neg.c.vote == False))

query = query.order_by(Review.release_group,
desc(func.coalesce(votes_pos.c.c, 0)
query = query.order_by(desc(func.coalesce(votes_pos.c.c, 0)
- func.coalesce(votes_neg.c.c, 0)))

if limit is not None:
# Selecting more reviews there so we'll have something
# different to show (shuffling is done below).
query = query.limit(limit * 4)

reviews = query.all()
Expand Down
15 changes: 15 additions & 0 deletions critiquebrainz/data/model/review_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,18 @@ def test_revisions(self):
review.update(u"The worst!")
self.assertEqual(len(review.revisions), 2)
self.assertNotEqual(review.revisions[0], review.last_revision)

def test_get_popular(self):
reviews = Review.get_popular()
self.assertEqual(len(reviews), 0)

new_review = Review.create(
user=self.user,
release_group='e7aad618-fa86-3983-9e77-405e21796eca',
text=u"Testing!",
is_draft=False,
license_id=self.license.id
)

reviews = Review.get_popular()
self.assertEqual(len(reviews), 1)

0 comments on commit 7a751b4

Please sign in to comment.