Skip to content
Snippets Groups Projects

Compare_entities diff uses id instead of name where needed

Merged I. Nüske requested to merge f-bug-fit-94-compare-properties-with-id into dev
Files
3
+ 29
15
@@ -197,13 +197,19 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -197,13 +197,19 @@ def compare_entities(entity0: Optional[Entity] = None,
properties and SPECIAL_ATTRIBUTES if they are missing or different from
properties and SPECIAL_ATTRIBUTES if they are missing or different from
their counterparts in the other entity.
their counterparts in the other entity.
 
The key used to represent a parent in the parent list or a
 
property in the property dictionary is the entity's name if the
 
name is present for both compared entities, the id otherwise.
 
The value of the properties dict for each listed property is again a dict
The value of the properties dict for each listed property is again a dict
detailing the differences between this property and its counterpart.
detailing the differences between this property and its counterpart.
The characteristics that are checked to determine whether two properties
The characteristics that are checked to determine whether two properties
match are the following:
match are the following:
- datatype
- importance
- datatype
- value
- importance
 
- value
 
If any of these characteristics differ for a property, the respective
If any of these characteristics differ for a property, the respective
string (datatype, importance, value) is added as a key to the dict of the
string (datatype, importance, value) is added as a key to the dict of the
property with its value being the characteristics value,
property with its value being the characteristics value,
@@ -224,9 +230,9 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -224,9 +230,9 @@ def compare_entities(entity0: Optional[Entity] = None,
Params
Params
------
------
entity0 : Entity
entity0: Entity
First entity to be compared.
First entity to be compared.
entity1 : Entity
entity1: Entity
Second entity to be compared.
Second entity to be compared.
compare_referenced_records: bool, default: False
compare_referenced_records: bool, default: False
If set to True, values with referenced records
If set to True, values with referenced records
@@ -242,6 +248,7 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -242,6 +248,7 @@ def compare_entities(entity0: Optional[Entity] = None,
entity and an int or str also checks whether
entity and an int or str also checks whether
the int/str matches the name or id of the
the int/str matches the name or id of the
entity, so Entity(id=100) == 100 == "100".
entity, so Entity(id=100) == 100 == "100".
 
"""
"""
# ToDo: Discuss intended behaviour
# ToDo: Discuss intended behaviour
# Questions that need clarification:
# Questions that need clarification:
@@ -377,15 +384,20 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -377,15 +384,20 @@ def compare_entities(entity0: Optional[Entity] = None,
# compare properties
# compare properties
for prop in entity0.properties:
for prop in entity0.properties:
matching = entity1.properties.filter(name=prop.name, pid=prop.id)
# ToDo: Would making id default break anything?
 
key = prop.name if prop.name is not None else prop.id
 
matching = entity1.properties.filter(prop)
if len(matching) == 0:
if len(matching) == 0:
# entity1 has prop, entity0 does not
# entity1 has prop, entity0 does not
diff[0]["properties"][prop.name] = {}
diff[0]["properties"][key] = {}
elif len(matching) == 1:
elif len(matching) == 1:
diff[0]["properties"][prop.name] = {}
# It's possible that prop has name and id, but match only has id
diff[1]["properties"][prop.name] = {}
key = prop.name if (prop.name is not None and
propdiff = (diff[0]["properties"][prop.name],
matching[0].name == prop.name) else prop.id
diff[1]["properties"][prop.name])
diff[0]["properties"][key] = {}
 
diff[1]["properties"][key] = {}
 
propdiff = (diff[0]["properties"][key],
 
diff[1]["properties"][key])
# We should compare the wrapped properties instead of the
# We should compare the wrapped properties instead of the
# wrapping entities if possible:
# wrapping entities if possible:
@@ -417,8 +429,8 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -417,8 +429,8 @@ def compare_entities(entity0: Optional[Entity] = None,
# in case there is no difference, we remove the dict keys again
# in case there is no difference, we remove the dict keys again
if len(propdiff[0]) == 0 and len(propdiff[1]) == 0:
if len(propdiff[0]) == 0 and len(propdiff[1]) == 0:
diff[0]["properties"].pop(prop.name)
diff[0]["properties"].pop(key)
diff[1]["properties"].pop(prop.name)
diff[1]["properties"].pop(key)
else:
else:
raise NotImplementedError(
raise NotImplementedError(
@@ -426,11 +438,12 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -426,11 +438,12 @@ def compare_entities(entity0: Optional[Entity] = None,
# we have not yet compared properties that do not exist in entity0
# we have not yet compared properties that do not exist in entity0
for prop in entity1.properties:
for prop in entity1.properties:
 
key = prop.name if prop.name is not None else prop.id
# check how often the property appears in entity0
# check how often the property appears in entity0
num_prop_in_ent0 = len(entity0.properties.filter(prop))
num_prop_in_ent0 = len(entity0.properties.filter(prop))
if num_prop_in_ent0 == 0:
if num_prop_in_ent0 == 0:
# property is only present in entity0 - add to diff
# property is only present in entity0 - add to diff
diff[1]["properties"][prop.name] = {}
diff[1]["properties"][key] = {}
if num_prop_in_ent0 > 1:
if num_prop_in_ent0 > 1:
# Check whether the property is present multiple times in entity0
# Check whether the property is present multiple times in entity0
# and raise error - result would be incorrect
# and raise error - result would be incorrect
@@ -441,9 +454,10 @@ def compare_entities(entity0: Optional[Entity] = None,
@@ -441,9 +454,10 @@ def compare_entities(entity0: Optional[Entity] = None,
for index, parents, other_entity in [(0, entity0.parents, entity1),
for index, parents, other_entity in [(0, entity0.parents, entity1),
(1, entity1.parents, entity0)]:
(1, entity1.parents, entity0)]:
for parent in parents:
for parent in parents:
 
key = parent.name if parent.name is not None else parent.id
matching = other_entity.parents.filter(parent)
matching = other_entity.parents.filter(parent)
if len(matching) == 0:
if len(matching) == 0:
diff[index]["parents"].append(parent.name)
diff[index]["parents"].append(key)
continue
continue
return diff
return diff
Loading