Title: [commits] (vajda) [11224] - fixed some bugs in merging indexes with sub-indexes
Revision
11224
Author
vajda
Date
2006-07-21 09:28:52 -0700 (Fri, 21 Jul 2006)

Log Message

- fixed some bugs in merging indexes with sub-indexes

Modified Paths

Diff

Modified: trunk/chandler/repository/item/Indexed.py (11223 => 11224)

--- trunk/chandler/repository/item/Indexed.py	2006-07-21 06:45:38 UTC (rev 11223)
+++ trunk/chandler/repository/item/Indexed.py	2006-07-21 16:28:52 UTC (rev 11224)
@@ -216,7 +216,9 @@
         for name, _indexChanges in indexChanges.iteritems():
             index = indexes[name]
 
-            others = []
+            moves = []
+            insertions = []
+
             for key, value in _indexChanges.iteritems():
                 if value is not None:
                     item = view.find(key)
@@ -224,12 +226,15 @@
                         if key not in deletes:
                             raise AssertionError, (key, "item not found")
                     elif item.isDirty():
-                        others.append(key)
                         if key in index:
-                            index.removeKey(key)
+                            moves.append(key)
+                        else:
+                            insertions.append(ley)
                 elif key in index:
                     index.removeKey(key)
-            for key in others:
+
+            index.moveKeys(moves)
+            for key in insertions:
                 index.insertKey(key)
 
     def _createIndex(self, indexType, **kwds):

Modified: trunk/chandler/repository/item/Indexes.py (11223 => 11224)

--- trunk/chandler/repository/item/Indexes.py	2006-07-21 06:45:38 UTC (rev 11223)
+++ trunk/chandler/repository/item/Indexes.py	2006-07-21 16:28:52 UTC (rev 11224)
@@ -60,9 +60,12 @@
     def insertKey(self, key, afterKey):
         self._count += 1
 
-    def moveKey(self, key, afterKey):
+    def moveKey(self, key, afterKey=None):
         pass
 
+    def moveKeys(self, keys, afterKey=None):
+        pass
+
     def removeKey(self, key):
         self._count -= 1
         return True
@@ -225,7 +228,7 @@
 
         return {}
 
-    def insertKey(self, key, afterKey):
+    def insertKey(self, key, afterKey=None):
 
         skipList = self.skipList
         skipList.insert(key, afterKey)
@@ -237,7 +240,7 @@
 
         super(NumericIndex, self).insertKey(key, afterKey)
             
-    def moveKey(self, key, afterKey):
+    def moveKey(self, key, afterKey=None):
 
         if key not in self:
             self.insertKey(key, afterKey)
@@ -255,6 +258,11 @@
                 ranges.onInsert(key, skipList.position(key))
 
             super(NumericIndex, self).moveKey(key, afterKey)
+
+    def moveKeys(self, keys, afterKey=None):
+
+        for key in keys:
+            self.moveKey(key, afterKey)
             
     def removeKey(self, key):
 
@@ -345,7 +353,7 @@
 
         raise NotImplementedError, '%s is abstract' % type(self)
 
-    def insertKey(self, key, afterKey=None):
+    def insertKey(self, key, ignore=None):
 
         index = self._index
         index.insertKey(key, index.skipList.after(key, self.compare))
@@ -365,7 +373,7 @@
 
         return False
 
-    def moveKey(self, key, afterKey):
+    def moveKey(self, key, ignore=None):
 
         index = self._index
         if key in index:
@@ -378,9 +386,27 @@
                 indexed = getattr(view[uuid], attr)
                 index = indexed.getIndex(name)
                 if key in index:
-                    index.moveKey(key, None)
+                    index.moveKey(key, ignore)
                     indexed._setDirty(True)
 
+    def moveKeys(self, keys, ignore=None):
+
+        index = self._index
+        for key in keys:
+            index.removeKey(key)
+        for key in keys:
+            index.insertKey(key, index.skipList.after(key, self.compare))
+
+        if self._subIndexes:
+            view = self._valueMap._getView()
+            for uuid, attr, name in self._subIndexes:
+                indexed = getattr(view[uuid], attr)
+                index = indexed.getIndex(name)
+                subKeys = [key for key in keys if key in index]
+                if subKeys:
+                    index.moveKeys(subKeys, ignore)
+                    indexed._setDirty(True)
+
     def setDescending(self, descending=True):
 
         wasDescending = self._descending

Modified: trunk/chandler/repository/item/RefCollections.py (11223 => 11224)

--- trunk/chandler/repository/item/RefCollections.py	2006-07-21 06:45:38 UTC (rev 11223)
+++ trunk/chandler/repository/item/RefCollections.py	2006-07-21 16:28:52 UTC (rev 11224)
@@ -278,10 +278,6 @@
     def _setRef(self, other, alias=None, dictKey=None, otherKey=None,
                 fireChanges=False):
 
-        # DEBUG
-        if fireChanges not in (True, False):
-            raise ValueError, fireChanges
-
         if otherKey is not None and other in self:
             if self.getOtherKey(other) != otherKey:
                 self.remove(other)
@@ -291,7 +287,7 @@
         self[key] = link
 
         if self._indexes:
-            for index in self._indexes.itervalues():
+            for name, index in self._indexes.iteritems():
                 index.insertKey(key, link._previousKey)
 
         self._setDirty(not fireChanges)

Modified: trunk/chandler/repository/persistence/DBItemIO.py (11223 => 11224)

--- trunk/chandler/repository/persistence/DBItemIO.py	2006-07-21 06:45:38 UTC (rev 11223)
+++ trunk/chandler/repository/persistence/DBItemIO.py	2006-07-21 16:28:52 UTC (rev 11224)
@@ -1255,46 +1255,45 @@
                                            self.hashes, True)
 
         for uValue in uValues:
-            if uValue is not None:
-                uAttr, vFlags, data = "" uValue)
+            uAttr, vFlags, data = "" uValue)
                         
-                if withSchema:
-                    offset = self.skipSymbol(0, data)
-                else:
-                    offset = 0
+            if withSchema:
+                offset = self.skipSymbol(0, data)
+            else:
+                offset = 0
 
-                flags = ord(data[offset])
-                offset += 1
+            flags = ord(data[offset])
+            offset += 1
 
-                if flags & DBItemWriter.VALUE:
-                    if isNew:
-                        for uLob in self.iterLobs(flags, data):
-                            lobs.purgeLob(txn, uLob)
-                    for uIndex in self.iterIndexes(flags, data):
-                        indexes.undoIndex(txn, uIndex, version)
+            if flags & DBItemWriter.VALUE:
+                if isNew:
+                    for uLob in self.iterLobs(flags, data):
+                        lobs.purgeLob(txn, uLob)
+                for uIndex in self.iterIndexes(flags, data):
+                    indexes.undoIndex(txn, uIndex, version)
             
-                elif flags & DBItemWriter.REF:
-                    if flags & DBItemWriter.LIST:
+            elif flags & DBItemWriter.REF:
+                if flags & DBItemWriter.LIST:
+                    uRefs = UUID(data[offset:offset+16])
+                    refs.undoRefs(txn, uRefs, version)
+                elif flags & DBItemWriter.DICT:
+                    if withSchema:
+                        offset = self.skipSymbol(offset, data)
+                    offset, count = self.readShort(offset, data)
+                    for i in xrange(count):
+                        t = data[offset]
+                        if t == '\0':
+                            offset += 17
+                        else:
+                            offset = self.skipSymbol(offset + 1, data)
                         uRefs = UUID(data[offset:offset+16])
+                        offset += 16
                         refs.undoRefs(txn, uRefs, version)
-                    elif flags & DBItemWriter.DICT:
-                        if withSchema:
-                            offset = self.skipSymbol(offset, data)
-                        offset, count = self.readShort(offset, data)
-                        for i in xrange(count):
-                            t = data[offset]
-                            if t == '\0':
-                                offset += 17
-                            else:
-                                offset = self.skipSymbol(offset + 1, data)
-                            uRefs = UUID(data[offset:offset+16])
-                            offset += 16
-                            refs.undoRefs(txn, uRefs, version)
-                    if flags & (DBItemWriter.LIST | DBItemWriter.SET):
-                        for uIndex in self.iterIndexes(flags, data):
-                            indexes.undoIndex(txn, uIndex, version)
+                if flags & (DBItemWriter.LIST | DBItemWriter.SET):
+                    for uIndex in self.iterIndexes(flags, data):
+                        indexes.undoIndex(txn, uIndex, version)
     
-                values.purgeValue(txn, uValue)
+            values.purgeValue(txn, uValue)
         
         refs.undoRefs(txn, uItem, version) # children
         store._index.undoDocuments(indexSearcher, indexReader, uItem, version)

Modified: trunk/chandler/repository/tests/TestMerge.py (11223 => 11224)

--- trunk/chandler/repository/tests/TestMerge.py	2006-07-21 06:45:38 UTC (rev 11223)
+++ trunk/chandler/repository/tests/TestMerge.py	2006-07-21 16:28:52 UTC (rev 11224)
@@ -949,6 +949,11 @@
 
         uuids = []
         saveUUIDs(uuids)
+
+#        from chandlerdb.util.c import UUID, loadUUIDs
+#        input = file('uuids_ad06.txt')
+#        loadUUIDs([UUID(uuid.strip()) for uuid in input if len(uuid) > 1])
+#        input.close()
         
         try:
             main = self.rep.view
@@ -983,6 +988,7 @@
             main.commit()
         finally:
             saveUUIDs(None)
+            #loadUUIDs(None)
 
         if not main.check():
 




_______________________________________________
Commits mailing list
[email protected]
http://lists.osafoundation.org/mailman/listinfo/commits

Reply via email to