Batch reassignments now take advantage of inverse indices for a slight speedup. See #2408.

This commit is contained in:
Dion Moult
2022-10-25 16:26:55 +11:00
parent fad80eacaf
commit fb786bb90c
@@ -83,17 +83,19 @@ class BatchReassignClass:
new_element[new_attributes.index(element.attribute_name(i))] = attribute new_element[new_attributes.index(element.attribute_name(i))] = attribute
except: except:
continue continue
for inverse in self.file.get_inverse(element): for inverse_pair in self.file.get_inverse(element, allow_duplicate=True, with_attribute_indices=True):
self.replacements.setdefault(inverse, {})[element] = new_element inverse, index = inverse_pair
self.replacements.setdefault(inverse, {}).setdefault(index, {})[element] = new_element
self.to_delete.add(element) self.to_delete.add(element)
return new_element return new_element
def unbatch(self): def unbatch(self):
for element, replacements in self.replacements.items(): for inverse, replacements in self.replacements.items():
for i, attribute in enumerate(element): for index, element_map in replacements.items():
new = element.walk(lambda v: v in replacements.keys(), lambda v: replacements[v], attribute) value = inverse[index]
if attribute != new: new = inverse.walk(lambda x : True, lambda v: element_map.get(v, v), value)
element[i] = new if value != new:
inverse[index] = new
for element in self.to_delete: for element in self.to_delete:
self.file.remove(element) self.file.remove(element)