Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: update /search/studies endpoint #279

Merged
merged 50 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
eea8917
feat!: update database to reflect schema changes (#264)
korikuzma Dec 20, 2023
f49e5ed
fix: bugs in database code (#267)
korikuzma Dec 20, 2023
7c32e37
feat: include type in nodes representing VRS objects (#268)
korikuzma Jan 2, 2024
bc8e3af
fix: db should include gene aliases (#275)
korikuzma Jan 3, 2024
537a219
merge update-test-data
korikuzma Jan 3, 2024
09ae1b3
wip: store progress
korikuzma Jan 3, 2024
3eba709
add more tests
korikuzma Jan 4, 2024
8b1c22e
resolve deprecation warning for event loop redefined
korikuzma Jan 4, 2024
70e5099
cleanup
korikuzma Jan 4, 2024
5350f73
handle some exceptions
korikuzma Jan 4, 2024
1f286e0
add tests for combo / sub therapies
korikuzma Jan 4, 2024
c7f80e2
more cleanup
korikuzma Jan 4, 2024
3064881
tests: update civic + moa test data (#276) (#281)
korikuzma Jan 8, 2024
9c26cc8
allow querying based on has_members rel + has_defining_context rel
korikuzma Jan 9, 2024
9824a0b
Merge branch 'epic-231' into epic-231-db
korikuzma Mar 15, 2024
5a50cfa
test: update database to reflect normalizer_data in extensions
korikuzma Mar 15, 2024
992e4ff
revert
korikuzma Mar 22, 2024
c720ac7
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 22, 2024
8c82551
update tests to reflect cdm changes
korikuzma Mar 25, 2024
2ce74cd
update deps + digests
korikuzma Mar 25, 2024
a92c350
Merge branch 'update-deps' into epic-231-db
korikuzma Mar 25, 2024
cb5a7d1
update digests
korikuzma Mar 25, 2024
18b512e
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 25, 2024
f08e8f0
Merge branch 'epic-231' into epic-231-db
korikuzma Mar 25, 2024
ce499fa
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 25, 2024
0be32ae
update api to dump response
korikuzma Mar 25, 2024
98847c6
udpate LOC KEYS to incl digest
korikuzma Mar 25, 2024
58d49b5
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 25, 2024
22cb4e5
udpate digests
korikuzma Mar 25, 2024
b64c64d
fix tests
korikuzma Mar 25, 2024
c38a794
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 25, 2024
09862de
test: update civicpy cache data
korikuzma Mar 25, 2024
a06d013
Merge branch 'update-civicpy-cache' into epic-231-db
korikuzma Mar 25, 2024
7b6af79
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 25, 2024
21987ab
Merge branch 'epic-231' into epic-231-db
korikuzma Mar 26, 2024
577b95b
cleanup
korikuzma Mar 26, 2024
ef44c6c
cleanup secret
korikuzma Mar 26, 2024
abcc149
better name for catvar key
korikuzma Mar 26, 2024
29e42a8
format
korikuzma Mar 26, 2024
2314201
Merge branch 'epic-231-db' into issue-273
korikuzma Mar 26, 2024
077d29b
cleanup
korikuzma Mar 27, 2024
7333d30
Merge branch 'epic-231' into issue-273
korikuzma Mar 27, 2024
a93252e
fix: creating location parameterized query string
korikuzma Mar 27, 2024
c1ed28f
Merge branch 'fix-db-keys' into issue-273
korikuzma Mar 27, 2024
5518bb0
StrEnum -> str, Enum
korikuzma Mar 27, 2024
5f6e928
Merge branch 'epic-231' into issue-273
korikuzma Mar 27, 2024
e219756
resolve too-many-statements for _get_nested_study
korikuzma Mar 28, 2024
e718287
move code block out of session block
korikuzma Mar 28, 2024
948f67a
docs
korikuzma Mar 28, 2024
01b97fd
reorganize
korikuzma Mar 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 34 additions & 68 deletions metakb/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
from fastapi.openapi.utils import get_openapi
from metakb.query import QueryHandler
from metakb.version import __version__
from metakb.schemas.app import SearchService, SearchIDService, \
SearchStatementsService
from typing import Optional
from typing import Dict, Optional

app = FastAPI(
docs_url='/api/v2',
Expand All @@ -15,7 +13,7 @@
query = QueryHandler()


def custom_openapi():
def custom_openapi() -> Dict:
"""Generate custom fields for OpenAPI response."""
if app.openapi_schema:
return app.openapi_schema
Expand All @@ -38,76 +36,44 @@ def custom_openapi():


app.openapi = custom_openapi
search_summary = ("Given variation, disease, therapy, and/or gene, "
"return associated statements and propositions.")
search_response_description = "A response to a validly-formed query."
search_description = ("Return statements and propositions associated"
" to the queried concepts.")
v_description = "Variation (subject) to search"
search_studies_summary = (
"Get nested studies from queried concepts that match all conditions provided."
)
search_studies_descr = (
"Return nested studies associated to the queried concepts. For example, if "
"`variation` and `therapy` are provided, will return all studies that have both "
"the provided `variation` and `therapy`."
)
v_description = ("Variation (subject) to search. Can be free text or VRS Variation ID.")
d_description = "Disease (object qualifier) to search"
t_description = "Therapy (object) to search"
g_description = "Gene to search"
s_description = "Statement ID to search"
detail_description = "Display all descriptors, methods, and documents."
s_description = ("Study ID to search.")
search_study_response_descr = "A response to a validly-formed query."


@app.get('/api/v2/search',
summary=search_summary,
response_description=search_response_description,
response_model=SearchService,
description=search_description,
response_model_exclude_none=True)
async def search(
@app.get('/api/v2/search/studies',
summary=search_studies_summary,
response_description=search_study_response_descr,
description=search_studies_descr,)
async def get_studies(
variation: Optional[str] = Query(None, description=v_description),
disease: Optional[str] = Query(None, description=d_description),
therapy: Optional[str] = Query(None, description=t_description),
gene: Optional[str] = Query(None, description=g_description),
statement_id: Optional[str] = Query(None, description=s_description),
detail: Optional[bool] = Query(False, description=detail_description)
):
"""Search endpoint"""
resp = await query.search(variation, disease, therapy, gene, statement_id, detail)
return resp


search_statements_summary = (
"Given variation, disease, therapy, and/or gene, return associated "
"nested statements containing propositions and descriptors.")
search_statement_response_descr = "A response to a validly-formed query."
search_statements_descr = (
"Return nested statements associated to the queried concepts.")


@app.get('/api/v2/search/statements',
summary=search_statements_summary,
response_description=search_statement_response_descr,
response_model=SearchStatementsService,
description=search_statements_descr,
response_model_exclude_none=True)
async def get_statements(
variation: Optional[str] = Query(None, description=v_description),
disease: Optional[str] = Query(None, description=d_description),
therapy: Optional[str] = Query(None, description=t_description),
gene: Optional[str] = Query(None, description=g_description),
statement_id: Optional[str] = Query(None, description=s_description)):
"""Return nested statements for queried concepts"""
resp = await query.search_statements(variation, disease, therapy, gene,
statement_id)
return resp


id_query_desc = ("Given Meta-KB statement_id, proposition_id, descriptor_id,"
" document_id, or method_id return the node content.")
id_search_description = ("Return node of the queried node id.")
id_description = "Node ID to search"


@app.get('/api/v2/search/{id}',
summary=id_query_desc,
response_description=search_response_description,
response_model=SearchIDService,
description=id_search_description,
response_model_exclude_none=True)
async def search_by_id(id: str = Query(None, description=id_description)):
"""Search by ID endpoint"""
return query.search_by_id(id)
study_id: Optional[str] = Query(None, description=s_description)
) -> dict:
"""Get nested studies from queried concepts that match all conditions provided.
For example, if `variation` and `therapy` are provided, will return all studies
that have both the provided `variation` and `therapy`.

:param variation: Variation query (Free text or VRS Variation ID)
:param disease: Disease query
:param therapy: Therapy query
:param gene: Gene query
:param study_id: Study ID query.
:return: SearchStudiesService response containing nested studies and service
metadata
"""
resp = await query.search_studies(variation, disease, therapy, gene, study_id)
return resp.model_dump(exclude_none=True)
Loading