@@ -424,29 +424,55 @@ def _filter_privacy_request_queryset(
424424 (started_lt , started_gt , "started" ),
425425 ]
426426 )
427- if fuzzy_search_str :
428- decrypted_identities_automaton = get_decrypted_identities_automaton (db )
429427
430- # Set of associated privacy request ids
431- fuzzy_search_identity_privacy_request_ids : Optional [Set [str ]] = set (
432- x
433- for list in decrypted_identities_automaton .values (fuzzy_search_str )
434- for x in list
435- )
428+ # Handle fuzzy search string
429+ if fuzzy_search_str :
430+ if CONFIG .execution .fuzzy_search_enabled :
431+ decrypted_identities_automaton = get_decrypted_identities_automaton (db )
432+
433+ # Set of associated privacy request ids
434+ fuzzy_search_identity_privacy_request_ids : Optional [Set [str ]] = set (
435+ x
436+ for list in decrypted_identities_automaton .values (fuzzy_search_str )
437+ for x in list
438+ )
436439
437- if not fuzzy_search_identity_privacy_request_ids :
438- query = query .filter (PrivacyRequest .id .ilike (f"{ fuzzy_search_str } %" ))
440+ if not fuzzy_search_identity_privacy_request_ids :
441+ query = query .filter (PrivacyRequest .id .ilike (f"{ fuzzy_search_str } %" ))
442+ else :
443+ query = query .filter (
444+ or_ (
445+ PrivacyRequest .id .in_ (
446+ fuzzy_search_identity_privacy_request_ids
447+ ),
448+ PrivacyRequest .id .ilike (f"{ fuzzy_search_str } %" ),
449+ )
450+ )
439451 else :
452+ # When fuzzy search is disabled, treat fuzzy_search_str as an
453+ # exact match on identity or partial match on privacy request ID
454+ identity_hashes = ProvidedIdentity .hash_value_for_search (fuzzy_search_str )
455+ identity_set : Set [str ] = {
456+ identity [0 ]
457+ for identity in ProvidedIdentity .filter (
458+ db = db ,
459+ conditions = (
460+ (ProvidedIdentity .hashed_value .in_ (identity_hashes ))
461+ & (ProvidedIdentity .privacy_request_id .isnot (None ))
462+ ),
463+ ).values (column ("privacy_request_id" ))
464+ }
465+
440466 query = query .filter (
441467 or_ (
442- PrivacyRequest .id .in_ (fuzzy_search_identity_privacy_request_ids ),
443- PrivacyRequest .id .ilike (f"{ fuzzy_search_str } %" ),
468+ PrivacyRequest .id .in_ (identity_set ),
469+ PrivacyRequest .id .ilike (f"% { fuzzy_search_str } %" ),
444470 )
445471 )
446472
447473 if identity :
448474 identity_hashes = ProvidedIdentity .hash_value_for_search (identity )
449- identity_set : Set [str ] = {
475+ identity_set : Set [str ] = { # type: ignore[no-redef]
450476 identity [0 ]
451477 for identity in ProvidedIdentity .filter (
452478 db = db ,
@@ -499,7 +525,7 @@ def _filter_privacy_request_queryset(
499525
500526 # Further restrict all PrivacyRequests by additional params
501527 if request_id :
502- query = query .filter (PrivacyRequest .id .ilike (f"{ request_id } %" ))
528+ query = query .filter (PrivacyRequest .id .ilike (f"% { request_id } %" ))
503529 if external_id :
504530 query = query .filter (PrivacyRequest .external_id .ilike (f"{ external_id } %" ))
505531 if status :
0 commit comments