perf(mail): Roh-Byte-Vorfilter in search_mail -- grep-Tempo ueber grosse Maildirs
Nur Mails voll parsen, deren Rohtext den Suchbegriff enthaelt. Suche ueber ~13k Mails jetzt ~17s statt >120s (Deadline) und findet auch grosse Ordner (Trash). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XhHNJKk3RsHgUsJ27WQSom
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
3ccfb80115
commit
330e0113f8
+19
-4
@@ -248,12 +248,30 @@ def search_mail(
|
||||
md = _open_folder(acct_path, fld)
|
||||
if not md:
|
||||
continue
|
||||
for key, msg in _iter_messages(md):
|
||||
qbytes = query_lower.encode("utf-8", "ignore")
|
||||
try:
|
||||
keys = list(md.keys())
|
||||
except Exception:
|
||||
keys = []
|
||||
for key in keys:
|
||||
if time.monotonic() - t0 > DEADLINE_S:
|
||||
truncated = True
|
||||
break
|
||||
# Schneller Roh-Byte-Vorfilter: nur Mails voll parsen, die den
|
||||
# Suchbegriff im Rohtext enthalten (grep-Tempo statt 13k Voll-Parses).
|
||||
try:
|
||||
raw = md.get_bytes(key)
|
||||
except Exception:
|
||||
continue
|
||||
if qbytes not in raw.lower():
|
||||
continue
|
||||
try:
|
||||
msg = md.get_message(key)
|
||||
subj = _decode_hdr(msg.get("Subject", ""))
|
||||
frm = _decode_hdr(msg.get("From", ""))
|
||||
to = _decode_hdr(msg.get("To", ""))
|
||||
date_str = msg.get("Date", "")
|
||||
# Bestaetigen ueber dekodierte Header ODER Body (Roh-Treffer verifizieren)
|
||||
if query_lower not in f"{subj} {frm} {to}".lower():
|
||||
if query_lower not in _get_body(msg).lower():
|
||||
continue
|
||||
@@ -263,9 +281,6 @@ def search_mail(
|
||||
if len(matches) >= MAX_SCAN:
|
||||
truncated = True
|
||||
break
|
||||
if time.monotonic() - t0 > DEADLINE_S:
|
||||
truncated = True
|
||||
break
|
||||
if truncated:
|
||||
break
|
||||
if truncated:
|
||||
|
||||
Reference in New Issue
Block a user