diff --git a/src/vfb_connect/cached_query.py b/src/vfb_connect/cached_query.py index 55de12d5..616d3aff 100644 --- a/src/vfb_connect/cached_query.py +++ b/src/vfb_connect/cached_query.py @@ -277,6 +277,39 @@ def cached_queries_enabled(): return os.getenv('VFB_USE_CACHED_QUERIES', 'true').lower() not in ('false', '0', 'no', 'off') +def dataset_summary_from_term_info(term_info): + """Map a VFBquery ``get_term_info`` payload for a DataSet onto the summary + dict that ``QueryWrapper.get_DataSet_TermInfo`` has always returned + (label, symbol, id, tags, description, miniref, FlyBase, PMID, DOI). + + Returns ``None`` if the payload is not a DataSet term. + """ + if not isinstance(term_info, dict) or 'DataSet' not in (term_info.get('SuperTypes') or []): + return None + meta = term_info.get('Meta') or {} + description = meta.get('Description') or '' + d = { + 'label': term_info.get('Name', ''), + 'symbol': '', + 'id': term_info.get('Id', ''), + 'tags': list(term_info.get('SuperTypes') or []), + 'description': [description] if description else [], + 'miniref': [], 'FlyBase': [], 'PMID': [], 'DOI': [], + } + for pub in term_info.get('Publications') or []: + d['miniref'].append(str(pub.get('title', ''))) + if str(pub.get('short_form', '')).startswith('FBrf'): + d['FlyBase'].append(str(pub['short_form'])) + for ref in pub.get('refs') or []: + m = re.search(r'pubmed/\?term=(\d+)', ref) + if m: + d['PMID'].append(m.group(1)) + m = re.search(r'doi\.org/(.+)$', ref) + if m: + d['DOI'].append(m.group(1)) + return d + + class CachedQueryClient: """Fetch pre-computed VFBquery results, or ``None`` if they cannot be trusted. diff --git a/src/vfb_connect/neo/query_wrapper.py b/src/vfb_connect/neo/query_wrapper.py index 77e7a06f..6af126ac 100644 --- a/src/vfb_connect/neo/query_wrapper.py +++ b/src/vfb_connect/neo/query_wrapper.py @@ -791,7 +791,25 @@ def get_DataSet_TermInfo(self, short_forms, summary=True, return_dataframe=True) :param summary: Optional. Returns summary reports if `True`. Default `True` :rtype: list of VFB_json or summary_report_json """ - return self._get_TermInfo(short_forms, typ='Get JSON for DataSet', summary=summary, return_dataframe=return_dataframe) + short_forms = list(short_forms) + if not summary: + return self._get_TermInfo(short_forms, typ='Get JSON for DataSet', summary=False, return_dataframe=return_dataframe) + # Summaries come from VFBquery's cached term info: the equivalent + # Neo4j query walks has_source|SUBCLASSOF|INSTANCEOF* unbounded and can + # run for many minutes on large datasets. Anything VFBquery cannot + # serve falls back to Neo4j. + from vfb_connect.cached_query import get_default_client, dataset_summary_from_term_info + client = get_default_client() + found = {} + for sf in short_forms: + r = dataset_summary_from_term_info(client.get_term_info(sf)) + if r is not None: + found[sf] = r + missing = [sf for sf in short_forms if sf not in found] + if missing: + for r in self._get_TermInfo(missing, typ='Get JSON for DataSet', summary=True, return_dataframe=return_dataframe): + found[r['id']] = r + return [found[sf] for sf in short_forms if sf in found] def get_license_TermInfo(self, short_forms, summary=True, return_dataframe=True): """ diff --git a/src/vfb_connect/test/cached_query_test.py b/src/vfb_connect/test/cached_query_test.py index fead471a..00d43f20 100644 --- a/src/vfb_connect/test/cached_query_test.py +++ b/src/vfb_connect/test/cached_query_test.py @@ -182,3 +182,32 @@ def test_column_contract_and_pass_through(self): if __name__ == '__main__': unittest.main() + + +class DatasetSummaryFromTermInfoTest(unittest.TestCase): + """VFBquery DataSet term info maps onto the legacy dataset summary dict.""" + + def test_mapping(self): + from vfb_connect.cached_query import dataset_summary_from_term_info + ti = { + 'Name': 'Ito lab adult brain lineage clone image set', 'Id': 'Ito2013', + 'SuperTypes': ['Entity', 'Individual', 'DataSet', 'has_image'], + 'Meta': {'Description': 'A set of clones.'}, + 'Publications': [{ + 'title': 'Ito et al., 2013, Curr. Biol. 23(8): 644--655', 'short_form': 'FBrf0221438', + 'refs': ['http://www.ncbi.nlm.nih.gov/pubmed/?term=23541729', + 'http://flybase.org/reports/FBrf0221438', + 'https://doi.org/10.1016/j.cub.2013.03.015']}], + } + d = dataset_summary_from_term_info(ti) + self.assertEqual(d['id'], 'Ito2013') + self.assertEqual(d['description'], ['A set of clones.']) + self.assertEqual(d['miniref'], ['Ito et al., 2013, Curr. Biol. 23(8): 644--655']) + self.assertEqual(d['FlyBase'], ['FBrf0221438']) + self.assertEqual(d['PMID'], ['23541729']) + self.assertEqual(d['DOI'], ['10.1016/j.cub.2013.03.015']) + + def test_non_dataset_returns_none(self): + from vfb_connect.cached_query import dataset_summary_from_term_info + self.assertIsNone(dataset_summary_from_term_info({'Id': 'FBbt_1', 'SuperTypes': ['Class']})) + self.assertIsNone(dataset_summary_from_term_info(None))