From edfe424a6ae476d412e7c7d2db36eb02fade6238 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Mon, 9 Mar 2026 20:09:10 +0100 Subject: [PATCH] =?UTF-8?q?Perf:=20O(n=C2=B2)=20Baumtraversierung=20bei=20?= =?UTF-8?q?Dateinamen-Konfliktpr=C3=BCfung=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _is_filename_used_in_project wurde bei jedem while-Schleifen-Durchlauf aufgerufen und traversierte den kompletten Baum neu. Ersetzt durch _collect_project_filenames(), die einmalig ein Set aufbaut → O(1) Lookups. Co-Authored-By: Claude Sonnet 4.6 --- src/ui/threads.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ui/threads.py b/src/ui/threads.py index 56f7827..6f95d94 100644 --- a/src/ui/threads.py +++ b/src/ui/threads.py @@ -247,10 +247,13 @@ class XmlBatchProcessingThread(QThread): # Bestimme Ziel-Pfad target_xml_path = xml_dir / xml_file_path.name + # Set aller bereits im Projekt verwendeten Dateinamen — einmalig aufbauen + used_filenames = self._collect_project_filenames() + # Prüfe auf Namenskonflikte und generiere ggf. alternativen Namen original_name = xml_file_path.name counter = 1 - while target_xml_path.exists() or self._is_filename_used_in_project(Path("xml") / target_xml_path.name): + while target_xml_path.exists() or (Path("xml") / target_xml_path.name) in used_filenames: # Generiere alternativen Namen stem = xml_file_path.stem suffix = xml_file_path.suffix @@ -290,23 +293,20 @@ class XmlBatchProcessingThread(QThread): except Exception as e: return {"status": "error", "error_msg": str(e)} - def _is_filename_used_in_project(self, filename: Path) -> bool: - """Prüft ob ein Dateiname bereits im Projekt verwendet wird.""" - if not self.pdf_project.nodes: - return False + def _collect_project_filenames(self) -> set[Path]: + """Gibt ein Set aller im Projekt verwendeten XML-Dateipfade zurück.""" + result: set[Path] = set() - def search_recursive(nodes): + def collect(nodes): for node in nodes: if isinstance(node, XslFile) and node.xmls: for xml_file in node.xmls: - if xml_file.xml == filename: - return True + result.add(xml_file.xml) elif isinstance(node, TreeNode) and node.children: - if search_recursive(node.children): - return True - return False + collect(node.children) - return search_recursive(self.pdf_project.nodes) + collect(self.pdf_project.nodes or []) + return result def _update_stats(self, result: dict): """Aktualisiert die Statistiken."""