From de70f0f7bbcf9649d221e61abca56d1d217a827d Mon Sep 17 00:00:00 2001 From: drfho Date: Mon, 27 May 2024 19:16:57 +0200 Subject: [PATCH] opensearch: refact unindexing Refs: https://github.com/zms-publishing/ZMS/issues/278 https://github.com/idasm-unibe-ch/unibe-cms-opensearch/issues/50 --- Products/zms/ZMSZCatalogAdapter.py | 37 ++++++++++++++----- .../manage_opensearch_objects_remove.py | 15 ++++++-- Products/zms/zmscontainerobject.py | 2 +- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Products/zms/ZMSZCatalogAdapter.py b/Products/zms/ZMSZCatalogAdapter.py index 57f18f676..2817c0a28 100644 --- a/Products/zms/ZMSZCatalogAdapter.py +++ b/Products/zms/ZMSZCatalogAdapter.py @@ -228,19 +228,36 @@ def reindex_node(self, node, forced=False): # -------------------------------------------------------------------------- # ZMSZCatalogAdapter.unindex_node # -------------------------------------------------------------------------- - def unindex_node(self, node, forced=False): - standard.writeBlock(node, "[unindex_node]") + def unindex_nodes(self, nodes=[], forced=False): + # Is triggered by zmscontainerobject.moveObjsToTrashcan(). + standard.writeBlock(self, "[unindex_nodes]") + + # Get closest catalog-connectors. + path_nodes = self.breadcrumbs_obj_path() + path_nodes.reverse() + for path_node in path_nodes: + if path_node.getCatalogAdapter(): + connectors = path_node.getCatalogAdapter().get_connectors() + break + if not connectors: + root = self.getRootElement() + connectors = root.getCatalogAdapter().get_connectors() + try: if self.getConfProperty('ZMS.CatalogAwareness.active', 1) or forced: - nodes = node.breadcrumbs_obj_path() - nodes.reverse() - for node in nodes: - if self.matches_ids_filter(node): - for connector in self.get_connectors(): - connector.manage_objects_remove([node]) - break + # [1] Reindex page-container nodes of deleted page-elements. + pageelement_nodes = [node for node in nodes if not node.isPage()] + if pageelement_nodes: + for pageelement_node in pageelement_nodes: + # Todo: Avoid redundant reindexing of page-container. + self.reindex_node(node=pageelement_node) + # [2] Unindex deleted page-nodes if filter-match. + nodes = [node for node in nodes if self.matches_ids_filter(node)] + for connector in connectors: + connector.manage_objects_remove(nodes) + return True except: - standard.writeError( self, "can't unindex_node") + standard.writeError( self, "unindex_nodes not successful") return False # -------------------------------------------------------------------------- diff --git a/Products/zms/conf/metaobj_manager/com.zms.catalog.opensearch/opensearch_connector/manage_opensearch_objects_remove.py b/Products/zms/conf/metaobj_manager/com.zms.catalog.opensearch/opensearch_connector/manage_opensearch_objects_remove.py index 3c10cf6b7..60d180ab7 100644 --- a/Products/zms/conf/metaobj_manager/com.zms.catalog.opensearch/opensearch_connector/manage_opensearch_objects_remove.py +++ b/Products/zms/conf/metaobj_manager/com.zms.catalog.opensearch/opensearch_connector/manage_opensearch_objects_remove.py @@ -5,6 +5,7 @@ from opensearchpy import OpenSearch from opensearchpy.helpers import bulk +langs = ['ger','eng'] def get_opensearch_client(self): # ${opensearch.url:https://localhost:9200, https://localhost:9201} @@ -49,18 +50,24 @@ def bulk_opensearch_delete(self, sources): # Name adaption to opensearch schema for x in sources: # Create language specific opensearch id - _id = "%s:%s"%(x['uid'],x.get('lang',self.getPrimaryLanguage())) - d = {"_op_type":"delete", "_index":index_name, "_id":_id} - actions.append(d) + for lang in globals()['langs']: + _id = "%s:%s"%(x['uid'],lang) + d = {"_op_type":"delete", "_index":index_name, "_id":_id} + actions.append(d) if client: return bulk(client, actions) return 0, len(actions) def manage_opensearch_objects_remove( self, nodes): sources = [{'uid':x.get_uid()} for x in nodes] + for node in nodes: + # Set node's language list as global variable. + global langs + langs = node.getLangIds() + break try: success, failed = bulk_opensearch_delete(self, sources) except Exception as e: - print(e) + standard.writeBlock( self, str(e)) return 0, len(sources) return success, failed or 0 \ No newline at end of file diff --git a/Products/zms/zmscontainerobject.py b/Products/zms/zmscontainerobject.py index 11e0c2426..075baa15e 100644 --- a/Products/zms/zmscontainerobject.py +++ b/Products/zms/zmscontainerobject.py @@ -267,7 +267,7 @@ def moveObjsToTrashcan(self, ids, REQUEST): trashcan.normalizeSortIds() trashcan.run_garbage_collection(forced=1) # Synchronize search. - self.getCatalogAdapter().unindex_node(self) + self.getCatalogAdapter().unindex_nodes(nodes=children) # Sort-IDs. self.normalizeSortIds() [standard.triggerEvent(child,'afterDeleteObjsEvt') for child in children]