feat(search): enhance V3 ID Vision mapping and searchable fields

- Update lib_sql_search.py to include comprehensive 'vision_fields' mapping for most core objects
- Ensure Vision Mapping only triggers for non-integer values to support backend filters
- Add clean ID names (e.g., 'event_id', 'account_id') to searchable_fields whitelists in Events, Badges, and Journal object definitions
- Resolve Concatenation typo in vision_fields list
- Improve searchability for Journal Entries by adding 'default_qry_str'
This commit is contained in:
Scott Idem
2026-01-21 19:21:52 -05:00
parent 6ca79e9a02
commit bdd1bd2ba2
4 changed files with 49 additions and 28 deletions

View File

@@ -159,12 +159,12 @@ def sql_search_qry_part(
else:
use_match = True
if table_name:
try:
try:
with lib_sql_core.engine.connect() as conn:
conn.execute(text(f"SELECT default_qry_str FROM `{table_name}` LIMIT 0"))
except:
except:
use_match = False
else:
else:
use_match = False
if use_match:
@@ -213,32 +213,46 @@ def sql_search_qry_part(
target_field = f.field
vision_fields = [
'id', 'account_id', 'site_id', 'person_id', 'user_id',
'journal_id', 'journal_entry_id', 'page_id', 'post_id',
'post_comment_id', 'organization_id', 'address_id', 'hosted_file_id'
'archive_id', 'archive_content_id',
'event_id',
'event_session_id', 'event_presentation_id', 'event_presenter_id',
'event_device_id', 'event_location_id', 'event_track_id',
'event_exhibit_id',
'event_person_id', 'event_registration_id',
'order_id', 'product_id', 'order_cart_id', 'membership_id', 'sponsorship_id',
'journal_id', 'journal_entry_id', 'page_id',
'post_id', 'post_comment_id',
'organization_id', 'address_id', 'contact_id',
'hosted_file_id'
]
if target_field in vision_fields:
candidate_field = 'id_random' if target_field == 'id' else f"{target_field}_random"
# ONLY map to _random if the value is a string (looks like a random ID)
# If it's an integer, we want to query the original integer column.
is_int_val = isinstance(f.value, int) or (isinstance(f.value, str) and f.value.isdigit())
# Schema Check: Verify if the random version exists in the current table/view
use_random = False
if table_name:
try:
with lib_sql_core.engine.connect() as conn:
conn.execute(text(f"SELECT `{candidate_field}` FROM `{table_name}` LIMIT 0"))
use_random = True
except Exception:
if not is_int_val:
candidate_field = 'id_random' if target_field == 'id' else f"{target_field}_random"
# Schema Check: Verify if the random version exists in the current table/view
use_random = False
if table_name:
try:
with lib_sql_core.engine.connect() as conn:
conn.execute(text(f"SELECT `{candidate_field}` FROM `{table_name}` LIMIT 0"))
use_random = True
except Exception:
pass
if use_random:
target_field = candidate_field
# print(f"Search Trace: Mapping filter field '{f.field}' -> '{target_field}'", flush=True)
else:
# If random doesn't exist, we must stick to the integer column
# but we'll need to resolve the string value to an integer elsewhere
# or rely on the user providing an integer for now.
pass
if use_random:
target_field = candidate_field
# print(f"Search Trace: Mapping filter field '{f.field}' -> '{target_field}'", flush=True)
else:
# If random doesn't exist, we must stick to the integer column
# but we'll need to resolve the string value to an integer elsewhere
# or rely on the user providing an integer for now.
pass
if searchable_fields is not None and target_field not in searchable_fields:
# Fallback check for original field just in case
if f.field not in searchable_fields: