Skip to content

Commit 47ec9a8

Browse files
committed
Enhance caching logic in SolrResultCache to prevent caching of error results and improve query validation in with_solr_cache function; update owl_query formatting in get_subclasses_of function for IRI compliance.
1 parent dad9ec5 commit 47ec9a8

2 files changed

Lines changed: 28 additions & 17 deletions

File tree

src/vfbquery/solr_result_cache.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,12 @@ def wrapper(*args, **kwargs):
662662
if hasattr(result, 'empty'): # DataFrame
663663
result_is_valid = not result.empty
664664
elif isinstance(result, dict):
665-
result_is_valid = bool(result)
665+
# For dict results, check if it's not an error result (count != -1)
666+
# Error results should not be cached
667+
if 'count' in result:
668+
result_is_valid = result.get('count', -1) >= 0 # Don't cache errors (count=-1)
669+
else:
670+
result_is_valid = bool(result) # For dicts without count field
666671
elif isinstance(result, (list, str)):
667672
result_is_valid = len(result) > 0
668673
else:
@@ -675,27 +680,32 @@ def wrapper(*args, **kwargs):
675680
is_complete = (result and isinstance(result, dict) and
676681
result.get('Id') and result.get('Name'))
677682

678-
# Additional validation when preview=True: queries must have valid results
683+
# Additional validation when preview=True: check if queries have results
684+
# We allow caching even if some queries failed (count=-1) as long as the core term_info is valid
685+
# This is because some query functions may not be implemented yet or may legitimately fail
679686
if is_complete:
680687
preview = kwargs.get('preview', True)
681688
if preview and 'Queries' in result and result['Queries']:
682-
# Check that all queries have valid counts and preview_results
689+
# Count how many queries have valid results vs errors
690+
valid_queries = 0
691+
failed_queries = 0
692+
683693
for query in result['Queries']:
684-
count = query.get('count', -1) # Default to -1 if missing
694+
count = query.get('count', -1)
685695
preview_results = query.get('preview_results')
686696

687-
# Don't cache if query has error count (-1 indicates failure)
688-
# Note: count of 0 is valid - it means "no matches found"
689-
if count < 0:
690-
is_complete = False
691-
logger.warning(f"Not caching result for {term_id}: query has error count {count}")
692-
break
693-
694-
# Don't cache if preview_results is missing or malformed
695-
if not isinstance(preview_results, dict) or not preview_results.get('headers'):
696-
is_complete = False
697-
logger.warning(f"Not caching result for {term_id}: query has invalid preview_results")
698-
break
697+
# Count queries with valid results (count >= 0)
698+
if count >= 0 and isinstance(preview_results, dict):
699+
valid_queries += 1
700+
else:
701+
failed_queries += 1
702+
703+
# Only reject if ALL queries failed - at least one must succeed
704+
if valid_queries == 0 and failed_queries > 0:
705+
is_complete = False
706+
logger.warning(f"Not caching result for {term_id}: all {failed_queries} queries failed")
707+
elif failed_queries > 0:
708+
logger.debug(f"Caching result for {term_id} with {valid_queries} valid queries ({failed_queries} failed)")
699709

700710
if is_complete:
701711
try:

src/vfbquery/vfb_queries.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1914,7 +1914,8 @@ def get_subclasses_of(short_form: str, return_dataframe=True, limit: int = -1):
19141914
:return: Subclasses of the specified class
19151915
"""
19161916
# For subclasses, we query the class itself (Owlery subclasses endpoint handles this)
1917-
owl_query = f"'{short_form}'"
1917+
# Use angle brackets for IRI conversion, not quotes
1918+
owl_query = f"<{short_form}>"
19181919
return _owlery_query_to_results(owl_query, short_form, return_dataframe, limit, solr_field='anat_query')
19191920

19201921
def _get_neurons_part_here_headers():

0 commit comments

Comments
 (0)