Skip to content
Merged
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
31 changes: 27 additions & 4 deletions src/db/models/gse.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
from typing import Optional, List

from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, column_property

from src.db.models.gse_gsm import GSE_GSM
from src.db.models.gsm import GSM
from src.db.models.mapper_registry import mapper_registry

from sqlalchemy import Index, Integer, PrimaryKeyConstraint, REAL, Text, Column
from sqlalchemy import Index, Integer, PrimaryKeyConstraint, REAL, Text, Column, select, union, func, literal_column

SUPERSERIES_SUMMARY = "This SuperSeries is composed of the SubSeries listed below."

Expand Down Expand Up @@ -45,12 +46,32 @@ class GSE:

gse_gsm_links: List["GSE_GSM"] = field(default_factory=list,
metadata={"sa": relationship("GSE_GSM", viewonly=True)})
gsm_ids: AssociationProxy[List[str]] = field(default_factory=list,
metadata={"sa": association_proxy("gse_gsm_links", "gsm")})
gsm_ids: AssociationProxy[List[str]] = field(default_factory=list, metadata={
"sa": association_proxy("gse_gsm_links", "gsm")
})

_organisms = column_property(
select(func.group_concat(Column("organism")))
.select_from(
union(
select(GSM.organism_ch1.label("organism"))
.join(GSE_GSM)
.where(GSE_GSM.gse == literal_column("gse.gse")),
select(GSM.organism_ch2.label("organism"))
.join(GSE_GSM)
.where(GSE_GSM.gse == literal_column("gse.gse"))
).subquery()
)
.scalar_subquery()
)

def is_superseries(self):
return self.summary == SUPERSERIES_SUMMARY

@property
def organisms(self):
return self._organisms.split(",") if self._organisms is not None else []


@dataclass()
class GSE_DTO:
Expand All @@ -73,6 +94,7 @@ class GSE_DTO:
contact: Optional[str]
supplementary_file: Optional[str]
gsm_ids: List[str]
organisms: List[str]

def __init__(self, gse: GSE):
self.ID = gse.ID
Expand All @@ -94,3 +116,4 @@ def __init__(self, gse: GSE):
self.contact = gse.contact
self.supplementary_file = gse.supplementary_file
self.gsm_ids = list(gse.gsm_ids)
self.organisms = gse.organisms