fix: correct unmaping of values

This commit is contained in:
Hazel 2024-04-17 17:52:59 +02:00
parent b15d0839ef
commit cde3b3dbbb

View File

@ -37,39 +37,33 @@ class Collection(Generic[T]):
self.contain_given_in_attribute: Dict[str, Collection] = contain_given_in_attribute or {} self.contain_given_in_attribute: Dict[str, Collection] = contain_given_in_attribute or {}
self.append_object_to_attribute: Dict[str, T] = append_object_to_attribute or {} self.append_object_to_attribute: Dict[str, T] = append_object_to_attribute or {}
self._indexed_values = defaultdict(set) self._id_to_index_values: Dict[int, set] = defaultdict(set)
self._indexed_to_objects = defaultdict(list) self._indexed_values = defaultdict(lambda: None)
self._indexed_to_objects = defaultdict(lambda: None)
self.extend(data) self.extend(data)
def _map_element(self, __object: T, from_map: bool = False): def _map_element(self, __object: T, from_map: bool = False):
__object._inner._mapped_in_collection.add(self)
self._contains_ids.add(__object.id) self._contains_ids.add(__object.id)
for name, value in __object.indexing_values: for name, value in __object.indexing_values:
if value is None or value == __object._inner._default_values.get(name): if value is None or value == __object._inner._default_values.get(name):
continue continue
self._indexed_values[name].add(value) self._indexed_values[name] = value
self._indexed_to_objects[value].append(__object) self._indexed_to_objects[value] = __object
self._id_to_index_values[__object.id].add((name, value))
def _unmap_element(self, __object: T): def _unmap_element(self, __object: T):
if __object.id in self._contains_ids: if __object.id in self._contains_ids:
self._contains_ids.remove(__object.id) self._contains_ids.remove(__object.id)
for name, value in __object.indexing_values: for name, value in self._id_to_index_values[__object.id]:
if value is None: del self._indexed_values[name]
continue del self._indexed_to_objects[value]
if value not in self._indexed_values[name]:
continue
try: del self._id_to_index_values[__object.id]
self._indexed_to_objects[value].remove(__object)
except ValueError:
continue
if not len(self._indexed_to_objects[value]):
self._indexed_values[name].remove(value)
def _contained_in_self(self, __object: T) -> bool: def _contained_in_self(self, __object: T) -> bool:
if __object.id in self._contains_ids: if __object.id in self._contains_ids:
@ -78,7 +72,7 @@ class Collection(Generic[T]):
for name, value in __object.indexing_values: for name, value in __object.indexing_values:
if value is None: if value is None:
continue continue
if value in self._indexed_values[name]: if value == self._indexed_values[name]:
return True return True
return False return False
@ -150,8 +144,8 @@ class Collection(Generic[T]):
if value is None: if value is None:
continue continue
if value in self._indexed_values[name]: if value == self._indexed_values[name]:
existing_object = self._indexed_to_objects[value][0] existing_object = self._indexed_to_objects[value]
if existing_object.id == __object.id: if existing_object.id == __object.id:
return None return None
@ -173,8 +167,8 @@ class Collection(Generic[T]):
def _find_object_in_self(self, __object: T) -> Optional[T]: def _find_object_in_self(self, __object: T) -> Optional[T]:
for name, value in __object.indexing_values: for name, value in __object.indexing_values:
if value in self._indexed_values[name]: if value == self._indexed_values[name]:
return self._indexed_to_objects[value][0] return self._indexed_to_objects[value]
def _find_object(self, __object: T, no_sibling: bool = False) -> Tuple[Collection[T], Optional[T]]: def _find_object(self, __object: T, no_sibling: bool = False) -> Tuple[Collection[T], Optional[T]]:
other_object = self._find_object_in_self(__object) other_object = self._find_object_in_self(__object)
@ -237,6 +231,8 @@ class Collection(Generic[T]):
return return
append_to._unmap_element(existing_object) append_to._unmap_element(existing_object)
append_to._unmap_element(__object)
existing_object.merge(__object) existing_object.merge(__object)
append_to._map_element(existing_object) append_to._map_element(existing_object)