Skip to content

Commit 28407c5

Browse files
committed
Adding setting to control fuzzy search
1 parent 1ba545f commit 28407c5

File tree

3 files changed

+50
-19
lines changed

3 files changed

+50
-19
lines changed

src/fides/api/api/v1/endpoints/privacy_request_endpoints.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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:

src/fides/api/models/privacy_request.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -560,11 +560,12 @@ def persist_identity(self, db: Session, identity: Identity) -> None:
560560
)
561561

562562
# Simultaneously add identities to automaton for fuzzy search
563-
try:
564-
self.add_identities_to_automaton()
565-
except Exception as exc:
566-
# This should never affect the ability to create privacy requests
567-
logger.error(f"Could not add identities to Automaton: {Pii(str(exc))}")
563+
if CONFIG.execution.fuzzy_search_enabled:
564+
try:
565+
self.add_identities_to_automaton()
566+
except Exception as exc:
567+
# This should never affect the ability to create privacy requests
568+
logger.error(f"Could not add identities to Automaton: {Pii(str(exc))}")
568569

569570
def persist_custom_privacy_request_fields(
570571
self,

src/fides/config/execution_settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ class ExecutionSettings(FidesSettings):
6161
default=False,
6262
description="Temporary flag to switch to using DSR 3.0 to process your tasks.",
6363
)
64+
fuzzy_search_enabled: bool = Field(
65+
default=True,
66+
description="Whether fuzzy search is enabled for privacy request lookups.",
67+
)
6468
model_config = SettingsConfigDict(env_prefix=ENV_PREFIX)

0 commit comments

Comments
 (0)