fix: correct unmaping of values
This commit is contained in:
parent
b15d0839ef
commit
cde3b3dbbb
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user