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

added ability to get pgc from product #139

Merged
merged 4 commits into from
Jul 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.env
appenv/
k8s/
web/
.github
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,11 @@ venv/
ENV/
env.bak/
venv.bak/
appenv/

# editor cruft
.vscode
.idea
.idea

# development docker file
local_devDockerfile
1 change: 1 addition & 0 deletions common/schemas/product.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type Product {
sequence_checksum: String! @deprecated
external_references: [ExternalReference!]!
family_matches: [FamilyMatch!]!
product_generating_context: ProductGeneratingContext
}

type FamilyMatch {
Expand Down
59 changes: 51 additions & 8 deletions graphql_service/resolver/gene_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
DatabaseNotFoundError,
)


logger = logging.getLogger(__name__)

# Define Query types for GraphQL
Expand Down Expand Up @@ -506,6 +505,7 @@ def resolve_product_by_id(

query = {
"genome_id": genome_id,
# TODO: search by unversioned_stable_id as well?
"stable_id": stable_id,
"type": {"$in": ["Protein", "MatureRNA"]},
}
Expand All @@ -528,6 +528,56 @@ def resolve_product_by_id(
return result


@PRODUCT_TYPE.field("product_generating_context")
def resolve_pgc_for_product(product: Dict, info: GraphQLResolveInfo) -> Dict:
pipeline = [
{
"$match": {
"stable_id": product.get("stable_id"),
"genome_id": product.get("genome_id"),
}
},
{
"$lookup": {
"from": "transcript",
"localField": "transcript_id",
"foreignField": "unversioned_stable_id",
"as": "transcript",
}
},
{"$unwind": {"path": "$transcript"}},
]

# get db connection
set_db_conn_for_uuid(info, product.get("genome_id"))
connection_db = get_db_conn(info)
protein_collection = connection_db["protein"]
logger.info(
"[resolve_pgc_for_product] Getting Protein from DB: '%s'", connection_db.name
)

results = list(protein_collection.aggregate(pipeline))

result = results[0]

pgcs = result.get("transcript", None).get("product_generating_contexts", None)

if not pgcs or len(pgcs) == 0:
return None

# get the specific pgc for product
pgc = [
pgc
for pgc in pgcs
if pgc.get("product_foreign_key") == product.get("product_primary_key")
]

if pgc[0]:
return pgc[0]

return None


@PGC_TYPE.field("product")
async def resolve_product_by_pgc(pgc: Dict, info: GraphQLResolveInfo) -> Optional[Dict]:
"Fetch product that is referenced by the Product Generating Context"
Expand Down Expand Up @@ -598,7 +648,6 @@ async def resolve_assembly_from_region(
async def resolve_regions_from_assembly(
assembly: Dict, info: GraphQLResolveInfo
) -> List[Dict]:

data_loader = get_data_loader(info)
loader = data_loader.region_by_assembly_loader

Expand All @@ -613,7 +662,6 @@ async def resolve_regions_from_assembly(
async def resolve_organism_from_assembly(
assembly: Dict, info: GraphQLResolveInfo
) -> Optional[Dict]:

data_loader = get_data_loader(info)
loader = data_loader.organism_loader

Expand All @@ -627,7 +675,6 @@ async def resolve_organism_from_assembly(
async def resolve_assemblies_from_organism(
organism: Dict, info: GraphQLResolveInfo
) -> List[Dict]:

data_loader = get_data_loader(info)
loader = data_loader.assembly_by_organism_loader

Expand All @@ -641,7 +688,6 @@ async def resolve_assemblies_from_organism(
async def resolve_species_from_organism(
organism: Dict, info: GraphQLResolveInfo
) -> List[Dict]:

data_loader = get_data_loader(info)
loader = data_loader.species_loader

Expand All @@ -655,7 +701,6 @@ async def resolve_species_from_organism(
async def resolve_organisms_from_species(
species: Dict, info: GraphQLResolveInfo
) -> List[Dict]:

data_loader = get_data_loader(info)
loader = data_loader.organism_by_species_loader

Expand Down Expand Up @@ -691,7 +736,6 @@ def resolve_genomes(
by_keyword: Optional[Dict[str, str]] = None,
by_assembly_accession_id: Optional[Dict[str, str]] = None,
) -> List:

# in case the user provides both arguments or none
if sum(map(bool, [by_keyword, by_assembly_accession_id])) != 1:
# ask them to provide at least one argument
Expand Down Expand Up @@ -729,7 +773,6 @@ def resolve_genomes(

@QUERY_TYPE.field("genome")
def resolve_genome(_, info: GraphQLResolveInfo, by_genome_uuid: Dict[str, str]) -> Dict:

grpc_model = info.context["grpc_model"]

genome = grpc_model.get_genome_by_genome_uuid(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"name": {
"accession_id": "A0A1D5TR86",
"source": None,
"url": "https://purl.uniprot.org/uniprot/A0A1D5TR86",
"url": "http://purl.uniprot.org/uniprot/A0A1D5TR86",
"value": "Sulfotransferase [Source:UniProtKB/TrEMBL;Acc:A0A1D5TR86]",
}
},
Expand Down Expand Up @@ -67,7 +67,7 @@
"release": None,
"url": "https://www.uniprot.org/",
},
"url": "https://purl.uniprot.org/uniprot/A0A1D5TR86",
"url": "http://purl.uniprot.org/uniprot/A0A1D5TR86",
"value": None,
}
},
Expand Down
Loading