Hi!

The patch adds another index to TransactionData. Speed up is only visible for some corner cases but memory costs and added complexity are low.

Florian
>From 960ec87dae44612ef93098081bf72544c055fe2e Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 7 Aug 2007 12:01:24 +0200
Subject: [PATCH] add a by name index to TransactionData to speed up matchNaevr()

---
 yum/transactioninfo.py |   68 ++++++++++++++++++++---------------------------
 1 files changed, 29 insertions(+), 39 deletions(-)

diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index ce85d4f..1ae9429 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -35,6 +35,7 @@ class TransactionData:
         self.probFilterFlags = []
         self.root = '/'
         self.pkgdict = {} # key = pkgtup, val = list of TransactionMember obj
+        self._namedict = {} # name -> list of TransactionMember obj
         self.removedmembers = {}
         self.debug = 0
         self.changed = False
@@ -58,7 +59,7 @@ class TransactionData:
         self.depupdated = []
         
     def __len__(self):
-        return len(self.pkgdict.values())
+        return len(self.pkgdict)
         
     def __iter__(self):
         if hasattr(self.getMembers(), '__iter__'):
@@ -84,8 +85,7 @@ class TransactionData:
             for members in self.pkgdict.itervalues():
                 returnlist.extend(members)            
         elif self.pkgdict.has_key(pkgtup):
-            returnlist.extend(self.pkgdict[pkgtup])            
-
+            returnlist.extend(self.pkgdict[pkgtup])
         return returnlist
             
     def getRemovedMembers(self, pkgtup=None):
@@ -98,7 +98,7 @@ class TransactionData:
             for members in self.removedmembers.itervalues():
                 returnlist.extend(members)
         elif self.removedmembers.has_key(pkgtup):
-            returnlist.extend(self.pkgdict[pkgtup])
+            returnlist.extend(self.removedmembers[pkgtup])
 
         return returnlist
 
@@ -116,42 +116,28 @@ class TransactionData:
     
     def matchNaevr(self, name=None, arch=None, epoch=None, ver=None, rel=None):
         """returns the list of packages matching the args above"""
-        completelist = self.pkgdict.keys()
-        removedict = {}
-        returnlist = []
-        returnmembers = []
-        
-        for pkgtup in completelist:
-            (n, a, e, v, r) = pkgtup
-            if name is not None:
-                if name != n:
-                    removedict[pkgtup] = 1
-                    continue
-            if arch is not None:
-                if arch != a:
-                    removedict[pkgtup] = 1
-                    continue
-            if epoch is not None:
-                if epoch != e:
-                    removedict[pkgtup] = 1
-                    continue
-            if ver is not None:
-                if ver != v:
-                    removedict[pkgtup] = 1
-                    continue
-            if rel is not None:
-                if rel != r:
-                    removedict[pkgtup] = 1
-                    continue
-        
-        for pkgtup in completelist:
-            if not removedict.has_key(pkgtup):
-                returnlist.append(pkgtup)
-        
-        for matched in returnlist:
-            returnmembers.extend(self.pkgdict[matched])
+        if name is None:
+            txmbrs = self.getMembers()
+        else:
+            txmbrs = self._namedict.get(name, [])
+
+        result = []
+
+        for txmbr in txmbrs:
+            (n, a, e, v, r) = txmbr.pkgtup
+            if name is not None and name != n:
+                continue
+            if arch is not None and arch != a:
+                continue
+            if epoch is not None and epoch != e:
+                continue
+            if ver is not None and ver != v:
+                continue
+            if rel is not None and rel != r:
+                continue
+            result.append(txmbr)
 
-        return returnmembers
+        return result
 
     def add(self, txmember):
         """add a package to the transaction"""
@@ -165,6 +151,7 @@ class TransactionData:
                     self.debugprint("Package in same mode, skipping.")
                     return
         self.pkgdict[txmember.pkgtup].append(txmember)
+        self._namedict.setdefault(txmember.name, []).append(txmember)
         self.changed = True
 
         # Is this the right criteria?
@@ -191,9 +178,12 @@ class TransactionData:
                 self.localSack.delPackage(txmbr.po)
             elif isinstance(txmbr.po, YumAvailablePackageSqlite):
                 self.pkgSackPackages -= 1
+            self._namedict[txmbr.name].remove(txmbr)
         
         self.removedmembers.setdefault(pkgtup, []).extend(self.pkgdict[pkgtup])
         del self.pkgdict[pkgtup]
+        if not self._namedict[pkgtup[0]]:
+            del self._namedict[pkgtup[0]]
         self.changed = True        
     
     def exists(self, pkgtup):
-- 
1.5.2.2

_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to