Skip to content

Instantly share code, notes, and snippets.

@k0001
Created August 25, 2008 16:18
Show Gist options
  • Save k0001/7087 to your computer and use it in GitHub Desktop.
Save k0001/7087 to your computer and use it in GitHub Desktop.
Index: love_hate_api/__init__.py
===================================================================
--- love_hate_api/__init__.py (revision 3695)
+++ love_hate_api/__init__.py (working copy)
@@ -22,7 +22,7 @@
def ban_item(self, user_id, item_id):
self._save_item_feedback(user_id, item_id, BAN_VALUE)
-
+
def unhate_item(self, user_id, item_id):
return self._remove_user_preference(user_id, item_id)
@@ -51,19 +51,19 @@
s.delete(ifeedback)
tags= s.execute("""
- SELECT DISTINCT tag_id
- FROM popego_ai.items_tags
+ SELECT DISTINCT tag_id
+ FROM popego_ai.items_tags
WHERE item_id = %s
ORDER BY tag_id """ % item_id).fetchall()
- tags= map(lambda x:x[0], tags)
+ tags= map(lambda x:x[0], tags)
if len(tags) == 0: return []
-
+
QUERY= """
UPDATE popego_ai.tags_feedback tf
SET %(field)s= %(field)s - 1
WHERE tf.tag_id IN %(tags)s
"""
- params= {'user_id':user_id,
+ params= {'user_id':user_id,
'item_id':item_id,
'tags':list2str(tags)}
@@ -77,18 +77,18 @@
s.commit()
return self.tagCloudService.get_tags_weight(user_id, tags)
-
+
def _save_tag_feedback(self, user_id, item_id, value):
s= self.session
# tags es una lista de ids de los tags de item ordenados por id
tags= s.execute("""
- SELECT DISTINCT tag_id
- FROM popego_ai.items_tags
+ SELECT DISTINCT tag_id
+ FROM popego_ai.items_tags
WHERE item_id = %s
ORDER BY tag_id """ % item_id).fetchall()
- tags= map(lambda x:x[0], tags)
+ tags= map(lambda x:x[0], tags)
if len(tags) == 0: return
@@ -97,13 +97,13 @@
params= {'tag_list':list2str(tags),
'user_id':user_id}
feedback_info= s.execute("""
- SELECT * FROM popego_ai.tags_feedback
- WHERE user_id = %(user_id)s AND
+ SELECT * FROM popego_ai.tags_feedback
+ WHERE user_id = %(user_id)s AND
tag_id IN %(tag_list)s
- ORDER BY tag_id""" % params).fetchall()
+ ORDER BY tag_id""" % params).fetchall()
# me armo un iterador de las rows que ya estan en la db
- feedback_iter= iter(feedback_info)
+ feedback_iter= iter(feedback_info)
# actual_feedback es el elemento actual de feedback_info. Si es None quiere
# decir que se termino el iterador (o que no habia ningun elemento)
actual_feedback= None
@@ -127,7 +127,7 @@
# uso la informacion que esta en la row actual
love_cnt= actual_feedback.love_cnt
hate_cnt= actual_feedback.hate_cnt
- if value == HATE_VALUE:
+ if value == HATE_VALUE:
hate_cnt+= 1
else:
love_cnt+= 1
@@ -136,15 +136,15 @@
actual_feedback= feedback_iter.next()
except StopIteration:
actual_feedback= None
-
+
if len(insert_values) > 0:
insert_query= """
- INSERT INTO popego_ai.tags_feedback
+ INSERT INTO popego_ai.tags_feedback
SELECT * FROM (VALUES %s) as foo(user_id, tag_id, love_cnt, hate_cnt)
""" % ",".join(map(list2str, insert_values))
- s.execute(insert_query)
-
+ s.execute(insert_query)
+
if len(update_values) > 0:
update_query= """
UPDATE popego_ai.tags_feedback tf
@@ -157,6 +157,34 @@
s.commit()
return self.tagCloudService.get_tags_weight(user_id, tags)
+
+ def _get_count_by_state_value(self, value, user_id):
+ query= """
+ SELECT COUNT(*)
+ FROM popego_ai.items_feedback
+ WHERE value=%d""" % value
+ if user_id:
+ query+= " AND user_id=%d" % user_id
+ return self.session.execute(query).fetchone()[0]
+
+ def get_loved_items_count(self, user_id=None):
+ """Returns the number of loved items.
+
+ If ``user_id`` is given, then count just those related to that user"""
+ return self._get_count_by_state_value(LOVE_VALUE, user_id)
+
+ def get_hated_items_count(self, user_id=None):
+ """Returns the number of hate items.
+
+ If ``user_id`` is given, then count just those related to that user"""
+ return self._get_count_by_state_value(HATE_VALUE, user_id)
+
+ def get_banned_items_count(self, user_id=None):
+ """Returns the number of ban items.
+
+ If ``user_id`` is given, then count just those related to that user"""
+ return self._get_count_by_state_value(BAN_VALUE, user_id)
+
def list2str(l):
if len(l) == 1:
return "(%s)" % l[0]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment