# HG changeset patch # User fabien # Date 1067502265 18000 # Node ID f74bad856bced516c4c26fd739902147213c3b75 # Parent e80160a196535c36ed206218c769104ceb202da1 [svn r1611] Optimization of db.get_bookmarks_count which was call too often. diff -r e80160a19653 -r f74bad856bce ChangeLog --- 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 Thu, 30 Oct 2003 03:22:11 -0500 + xbelweb (0.1-5) unstable; urgency=low * Add display name to Preferences. diff -r e80160a19653 -r f74bad856bce lib/folders.py --- 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)) diff -r e80160a19653 -r f74bad856bce lib/my_db.py --- 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