From 7b01551d305b822d513f81479b9041253ea8f84e Mon Sep 17 00:00:00 2001
From: Thomas Baer <thomas.baer@slub-dresden.de>
Date: Wed, 18 Sep 2024 12:50:57 +0200
Subject: [PATCH] Unique

---
 extract_logs.py | 39 ++++++++++++++++++++++++---------------
 1 file changed, 24 insertions(+), 15 deletions(-)

diff --git a/extract_logs.py b/extract_logs.py
index 16e8b06..d1971fd 100644
--- a/extract_logs.py
+++ b/extract_logs.py
@@ -34,9 +34,9 @@ def process_file(filename):
         filename (str): Der Pfad zur zu verarbeitenden Log-Datei.
 
     Returns:
-        pandas.DataFrame: Ein DataFrame mit den extrahierten URLs.
+        pandas.DataFrame: Ein DataFrame mit den einzigartigen, extrahierten URLs.
     """
-    urls = []
+    unique_urls = set()
     with open(filename, "r") as file:
         for line in file:
             if "o.a.s.c.S.Request" in line and "params=" in line:
@@ -47,17 +47,17 @@ def process_file(filename):
                     if (
                         clean_query_string
                     ):  # Nur hinzufügen, wenn es relevante Parameter gibt
-                        urls.append(f"/select?{clean_query_string}")
-    return pd.DataFrame(urls, columns=["url"])
+                        unique_urls.add(f"/select?{clean_query_string}")
+    return pd.DataFrame(list(unique_urls), columns=["url"])
 
 
 def extract_urls_from_logs():
     """
-    Extrahiert bereinigte URLs aus allen Solr-Log-Dateien im 'logs/' Verzeichnis und
+    Extrahiert bereinigte, einzigartige URLs aus allen Solr-Log-Dateien im 'logs/' Verzeichnis und
     speichert sie in einer Parquet-Datei mit Snappy-Kompression.
 
     Returns:
-        int: Die Gesamtanzahl der extrahierten URLs.
+        int: Die Gesamtanzahl der extrahierten einzigartigen URLs.
     """
     log_dir = "logs/"
     log_pattern = re.compile(r"solr\.log\.\d+")
@@ -76,7 +76,7 @@ def extract_urls_from_logs():
     schema = pa.schema([("url", pa.string())])
     writer = pq.ParquetWriter(output_file, schema, compression="snappy")
 
-    total_urls = 0
+    all_unique_urls = set()
     with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
         futures = {
             executor.submit(process_file, file): file for file in files_to_process
@@ -88,21 +88,30 @@ def extract_urls_from_logs():
                 file = futures[future]
                 try:
                     df = future.result()
-                    total_urls += len(df)
-                    table = pa.Table.from_pandas(df)
-                    writer.write_table(table)
+                    new_unique_urls = set(df["url"]) - all_unique_urls
+                    all_unique_urls.update(new_unique_urls)
+                    if new_unique_urls:
+                        table = pa.Table.from_pandas(
+                            pd.DataFrame(list(new_unique_urls), columns=["url"])
+                        )
+                        writer.write_table(table)
                     pbar.update(1)
-                    pbar.set_postfix({"Datei": os.path.basename(file), "URLs": len(df)})
+                    pbar.set_postfix(
+                        {
+                            "Datei": os.path.basename(file),
+                            "Neue einzigartige URLs": len(new_unique_urls),
+                        }
+                    )
                 except Exception as exc:
                     print(f"{file} generierte eine Ausnahme: {exc}")
 
     writer.close()
-    return total_urls
+    return len(all_unique_urls)
 
 
 if __name__ == "__main__":
-    # Führe die Extraktion aus und gib die Gesamtanzahl der extrahierten URLs aus
-    total_urls = extract_urls_from_logs()
+    # Führe die Extraktion aus und gib die Gesamtanzahl der extrahierten einzigartigen URLs aus
+    total_unique_urls = extract_urls_from_logs()
     print(
-        f"{total_urls} bereinigte URLs wurden extrahiert und in das Parquet-File gespeichert."
+        f"{total_unique_urls} bereinigte, einzigartige URLs wurden extrahiert und in das Parquet-File gespeichert."
     )
-- 
GitLab