- 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
