[svn r1611] Optimization of db.get_bookmarks_count which was call too often.
--- 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