[svn r1611] Optimization of db.get_bookmarks_count which was call too often. xbelweb
authorfabien
Thu, 30 Oct 2003 03:24:25 -0500
branchxbelweb
changeset 54 f74bad856bce
parent 53 e80160a19653
child 55 2ae353b7f38a
[svn r1611] Optimization of db.get_bookmarks_count which was call too often.
ChangeLog
lib/folders.py
lib/my_db.py
--- a/ChangeLog	Mon Oct 27 02:26:39 2003 -0500
+++ b/ChangeLog	Thu Oct 30 03:24:25 2003 -0500
@@ -1,3 +1,9 @@
+xbelweb (0.1-6) unstable; urgency=low
+
+  * Optimization of get_bookmarks_count which was call too often.
+
+ -- Fabien Ninoles <fabien@tzone.org>  Thu, 30 Oct 2003 03:22:11 -0500
+
 xbelweb (0.1-5) unstable; urgency=low
 
   * Add display name to Preferences.
--- a/lib/folders.py	Mon Oct 27 02:26:39 2003 -0500
+++ b/lib/folders.py	Thu Oct 30 03:24:25 2003 -0500
@@ -1,7 +1,6 @@
-#!/usr/bin/python
-
 from templates import Template
 from keywords import set_selection, sort_keywords
+from __future__ import nested_scopes
 
 def do_folder_action(db, form, folder):
    if form['action'].value == 'add':
@@ -53,22 +52,39 @@
     folders_keywords = []
     for parent in parents:
 	folders_keywords.append(parent['keyword'])
-	parent['count'] = db.get_bookmarks_count(folders_keywords)
+	parent['count'] = db.get_bookmarks_count(folders_keywords)[0][1]
+    children_keywords = db.get_bookmarks_count(selection, [], exclusion)
     for child in children:
 	folders_keywords.append(child['keyword'])
 	# This is really selection, not folders_keywords
-	child['count'] = db.get_bookmarks_count(selection + [child['keyword']])
+	child['count'] = 0
+	for kw in children_keywords:
+		if kw[0] == child['keyword']:
+			child['count'] = kw[1]
+			children_keywords.remove(kw)
+			break
+    del children_keywords
     bookmarks = map(lambda bk: bk[0], db.select_bookmarks(selection))
-    allkw = db.get_keywords(bookmarks)
-    keywords = []
-    for keyword in allkw:
-	if keyword[0] not in folders_keywords:
-		kw = { 'id': keyword[0], 'keyword': keyword[1] }
-		kwsel = selection + [kw['id']]
-		kw['count'] = db.get_bookmarks_count(kwsel)
-		kw['removed'] = db.get_bookmarks_count(kwsel, exclusion)
-		keywords.append(kw)
-    del allkw, folders_keywords
+    allkw = filter(lambda kw: kw[0] not in folders_keywords,
+   			 db.get_keywords(bookmarks))
+    keywords = map(lambda kw: { 'id': kw[0], 'keyword': kw[1] }, allkw)
+    allkw = map(lambda kw: kw[0], allkw)
+    count = db.get_bookmarks_count(selection, [], allkw)
+    removed = db.get_bookmarks_count(selection, exclusion, allkw)
+    for kw in keywords:
+    	kw['count'] = 0
+	kw['removed'] = 0
+    	for cnt in count:
+		if kw['id'] == cnt[0]:
+			kw['count'] = cnt[1]
+			count.remove(cnt)
+			break
+    	for cnt in removed:
+		if kw['id'] == cnt[0]:
+			kw['removed'] = cnt[1]
+			removed.remove(cnt)
+			break
+    del allkw, count, removed
     bookmarks = db.select_bookmarks(selection, exclusion)
     if len(bookmarks) <> 0:
    	bookmarks = db.get_bookmarks(map(lambda bk: bk[0], bookmarks))
--- a/lib/my_db.py	Mon Oct 27 02:26:39 2003 -0500
+++ b/lib/my_db.py	Thu Oct 30 03:24:25 2003 -0500
@@ -1,5 +1,3 @@
-#!/usr/bin/python
-
 import pgdb
 import config
 from bkmark import Bookmark
@@ -292,21 +290,24 @@
 		qry = self._bookmarks_selection(has_kw, except_kw) + ';'
 		self.crs.execute(qry)
 		return self.crs.fetchall()
-	def get_bookmarks_count(self, has_kw = [0], except_kw = []):
+	def get_bookmarks_count(self, has_kw = [0], except_kw = [], opt_kw = []):
 	        """
 Return a count of bookmarks which would have been return on
 select_bookmarks qry.
 """
 		qry = """
-			SELECT COUNT(id) FROM bookmarks
-			WHERE userid = %d AND id IN """ % self.userid
-		qry += "(" + self._bookmarks_selection(has_kw, except_kw) + ");"
+			SELECT keyword, COUNT(keyword)
+			FROM bookmarks_keywords
+			WHERE userid = %d
+			""" % self.userid
+		if len(opt_kw) > 0:
+			qry += "AND ( "
+			qry += " OR ".join(map(lambda e: "keyword = %d" % e, opt_kw))
+			qry += ") "
+		qry += "AND bookmark IN (" + self._bookmarks_selection(has_kw, except_kw) + ") "
+		qry += "GROUP BY keyword ORDER BY keyword;"
 		self.crs.execute(qry)
-		result = self.crs.fetchone()
-		if result:
-			return result[0]
-		else:
-			return 0
+		return self.crs.fetchall()
 	def get_folder_keyword(self, id):
 		self.crs.execute("""
 			SELECT k.id, k.name