Rev 79: only slightly faster if we search concurrently. Probably a fair in http://bzr.arbash-meinel.com/plugins/history_db

John Arbash Meinel john at arbash-meinel.com
Mon Apr 12 20:21:46 BST 2010


At http://bzr.arbash-meinel.com/plugins/history_db

------------------------------------------------------------
revno: 79
revision-id: john at arbash-meinel.com-20100412192139-x9a08xz2ijt5jsjl
parent: john at arbash-meinel.com-20100412191459-x75cvx7mc17j8p3h
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: history_db
timestamp: Mon 2010-04-12 14:21:39 -0500
message:
  only slightly faster if we search concurrently. Probably a fair
  amount faster if we used more 'old' revision_ids.
-------------- next part --------------
=== modified file '__init__.py'
--- a/__init__.py	2010-04-12 19:14:59 +0000
+++ b/__init__.py	2010-04-12 19:21:39 +0000
@@ -181,8 +181,9 @@
             else:
                 query = _mod_history_db.Querier(db, b)
                 if method == 'db-range':
-                    revision_ids = [(r, query.get_revision_id(r))
-                                     for r in revno_list]
+                    revno_map = query.get_revision_ids(revno_list)
+                    revision_ids = [(r, revno_map.get(r, None))
+                                    for r in revno_list]
                 else:
                     assert method == 'db-range-multi'
                     revno_map = query.get_dotted_revno_range_multi(rev_ids)

=== modified file 'history_db.py'
--- a/history_db.py	2010-04-12 19:14:59 +0000
+++ b/history_db.py	2010-04-12 19:21:39 +0000
@@ -1338,14 +1338,14 @@
         self._stats['query_time'] += (time.time() - t)
         return revnos
 
-    def get_revision_id(self, revno):
+    def get_revision_ids(self, revnos):
         """Map from a dotted-revno back into a revision_id."""
         t = time.time()
         tip_db_id = self._get_db_id(self._branch_tip_rev_id)
         # TODO: If tip_db_id is None, maybe we want to raise an exception here?
         #       To indicate that the branch has not been imported yet
-        revno_str = '.'.join(map(str, revno))
-        merged_revision_id = None
+        revno_strs = set(['.'.join(map(str, revno)) for revno in revnos])
+        revno_map = {}
         while tip_db_id is not None:
             self._stats['num_steps'] += 1
             range_res = self._cursor.execute(
@@ -1355,32 +1355,31 @@
                 " ORDER BY count DESC LIMIT 1",
                 (tip_db_id,)).fetchone()
             if range_res is None:
-                revision_res = self._cursor.execute(
+                revision_res = self._cursor.execute(_add_n_params(
                     "SELECT revision_id, revno"
                     "  FROM dotted_revno, revision"
                     " WHERE merged_revision = revision.db_id"
                     "   tip_revision = ?"
-                    "   AND revno = ?",
-                    (tip_db_id, revno_str)).fetchall()
+                    "   AND revno IN (%s)", len(revno_strs)),
+                    [tip_db_id] + list(revno_strs)).fetchall()
                 next_db_id = self._get_lh_parent_db_id(tip_db_id)
             else:
                 pkey, next_db_id = range_res
-                revision_res = self._cursor.execute(
+                revision_res = self._cursor.execute(_add_n_params(
                     "SELECT revision_id, revno"
                     "  FROM dotted_revno, mainline_parent, revision"
                     " WHERE tip_revision = mainline_parent.revision"
                     "   AND merged_revision = revision.db_id"
                     "   AND mainline_parent.range = ?"
-                    "   AND revno = ?",
-                    (pkey, revno_str)).fetchall()
+                    "   AND revno IN (%s)", len(revno_strs)),
+                    [pkey] + list(revno_strs)).fetchall()
             tip_db_id = next_db_id
-            if revision_res:
-                assert len(revision_res) == 1
-                merged_revision_id, db_revno_str = revision_res[0]
-                assert db_revno_str == revno_str
-                break
+            for revision_id, revno_str in revision_res:
+                dotted = tuple(map(int, revno_str.split('.')))
+                revno_strs.discard(revno)
+                revno_map[dotted] = revision_id
         self._stats['query_time'] += (time.time() - t)
-        return merged_revision_id
+        return revno_map
 
     def walk_mainline(self):
         """Walk the db, and grab all the mainline identifiers."""



More information about the bazaar-commits mailing list