diff --git a/backend/appsettings/src/index_setup.py b/backend/appsettings/src/index_setup.py index e39ab9e2..eed26901 100644 --- a/backend/appsettings/src/index_setup.py +++ b/backend/appsettings/src/index_setup.py @@ -13,6 +13,7 @@ from appsettings.src.snapshot import ElasticSnapshot from common.src.es_connect import ElasticWrap from common.src.helper import get_mapping from deepdiff import DeepDiff +from deepdiff.model import DiffLevel from django.conf import settings @@ -150,24 +151,37 @@ class ElasticIndex: return MappingAction.REINDEX added = diff.get("dictionary_item_added", []) - has_additions = bool(added) + reindex_from_added = self._needs_reindex(diff_items=added) + if reindex_from_added: + return MappingAction.REINDEX - for item in diff.get("values_changed", []): - path = item.path(output_format="list") - if not path: - continue + removed = diff.get("dictionary_item_removed", []) + reindex_from_removed = self._needs_reindex(diff_items=removed) + if reindex_from_removed: + return MappingAction.REINDEX - if path[-1] in self.REINDEX_KEYS: - return MappingAction.REINDEX + changed = diff.get("values_changed", []) + reindex_from_changed = self._needs_reindex(diff_items=changed) + if reindex_from_changed: + return MappingAction.REINDEX - # compatible addition - has_additions = True - - if has_additions: + if added or changed: return MappingAction.PUT_MAPPING return MappingAction.NOOP + def _needs_reindex(self, diff_items: list[DiffLevel]) -> bool: + """check if diff has fields that need reindex""" + for item in diff_items: + path = item.path(output_format="list") + if not path: + return False + + if path[-1] in self.REINDEX_KEYS: + return True + + return False + def _get_fields_to_delete(self, diff: DeepDiff) -> set[str]: """fields to remove during next reindex""" removed_fields = set() @@ -192,7 +206,7 @@ class ElasticIndex: self.create_blank(new_version=new_version) self.reindex(new_version=new_version, removed_fields=removed_fields) self.delete_index(by_version=current_version) - self.create_alias(new_version=new_version, old_version=current_version) + self.create_alias(new_version=new_version) def delete_index(self, by_version: int | None): """delete index passed as argument""" @@ -257,7 +271,7 @@ class ElasticIndex: print(f"{status_code}: {response}") raise ValueError("reindex failed failed") - def create_alias(self, new_version: int, old_version: int | None = None): + def create_alias(self, new_version: int): """create aliast for moved index""" index_new = f"{self.index_namespace}_v{new_version}" index_old = None @@ -273,16 +287,6 @@ class ElasticIndex: }, ] } - if old_version: - index_old = f"{self.index_namespace}_v{old_version}" - data["actions"].append( - { - "remove": { - "index": index_old, - "alias": self.index_namespace, - } - } - ) message = f"create new alias {index_new}" if index_old: