diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-17 18:31:26 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-17 18:31:26 +0200 | 
| commit | aa6033dea383be81c7ddef058d77f695ef8bea14 (patch) | |
| tree | 3e63695736a8981a9c8b4391b671765f5deef6d4 /archaeological_context_records/models.py | |
| parent | 25f23ed03ad48fb4e5ca2f14527c0bc381dc8c9b (diff) | |
| download | Ishtar-aa6033dea383be81c7ddef058d77f695ef8bea14.tar.bz2 Ishtar-aa6033dea383be81c7ddef058d77f695ef8bea14.zip  | |
Context records: Optimize record relations - fix equals
Diffstat (limited to 'archaeological_context_records/models.py')
| -rw-r--r-- | archaeological_context_records/models.py | 42 | 
1 files changed, 29 insertions, 13 deletions
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index 65145be98..454e83e8a 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -1454,14 +1454,23 @@ class ContextRecordTree(RelationsViews):          return new_trees      @classmethod -    def _get_equals(cls, item_id, equal_rel_types): -        equals = list(RecordRelations.objects.values_list( +    def _get_equals(cls, item_id, equal_rel_types, exclude=None): +        if not exclude: +            exclude = [item_id] +        q = RecordRelations.objects.values_list(              "right_record_id", flat=True).filter( -            left_record_id=item_id, relation_type_id__in=equal_rel_types)) -        equals += list(RecordRelations.objects.values_list( +            left_record_id=item_id, relation_type_id__in=equal_rel_types) +        q = q.exclude(right_record_id__in=exclude) +        equals = list(q) +        q = RecordRelations.objects.values_list(              "left_record_id", flat=True).filter( -            right_record_id=item_id, relation_type_id__in=equal_rel_types)) -        return set(equals) +            right_record_id=item_id, relation_type_id__in=equal_rel_types) +        q = q.exclude(left_record_id__in=exclude) +        equals += list(q) +        exclude += equals +        for eq_id in equals: +            equals += cls._get_equals(eq_id, equal_rel_types, exclude=exclude) +        return equals      @classmethod      def _update_equals(cls, item_id, equals): @@ -1485,24 +1494,32 @@ class ContextRecordTree(RelationsViews):          equal_rel_types = cls._get_base_equal_relations()          keys = []          for child_id, parent_id in relations: -            equals = set(cls._get_equals(child_id, equal_rel_types)) -            keys += cls._update_equals(child_id, equals) -            for alt_child in equals: +            equals_child = set(cls._get_equals(child_id, equal_rel_types)) +            keys += cls._update_equals(child_id, equals_child) +            for alt_child in equals_child:                  if alt_child != child_id:                      cls.objects.get_or_create(                          key=f"{alt_child}_{parent_id}",                          cr_id=alt_child, cr_parent_id=parent_id                      )                      keys.append((alt_child, parent_id)) -            equals = set(cls._get_equals(parent_id, equal_rel_types)) -            keys += cls._update_equals(parent_id, equals) -            for alt_parent in equals: +            equals_parent = set(cls._get_equals(parent_id, equal_rel_types)) +            keys += cls._update_equals(parent_id, equals_parent) +            for alt_parent in equals_parent:                  if alt_parent != parent_id:                      cls.objects.get_or_create(                          key=f"{child_id}_{alt_parent}",                          cr_id=child_id, cr_parent_id=alt_parent                      )                      keys.append((child_id, alt_parent)) + +                    for alt_child in equals_child: +                        if alt_child != child_id: +                            cls.objects.get_or_create( +                                key=f"{alt_child}_{alt_parent}", +                                cr_id=alt_child, cr_parent_id=alt_parent +                            ) +                            keys.append((alt_child, alt_parent))          return set(keys)      @classmethod @@ -1541,7 +1558,6 @@ class ContextRecordTree(RelationsViews):              equals = set(cls._get_equals(item_id, equal_rel_types))              all_relations.update(cls._update_equals(item_id, equals)) -          ## delete old relations          if not already_updated:              already_updated = [item_id]  | 
