Skip to content

Commit

Permalink
Add join condition for sample and analysis
Browse files Browse the repository at this point in the history
  • Loading branch information
ahdamin committed Oct 8, 2024
1 parent 6866fa3 commit 9433cd4
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 17 deletions.
2 changes: 1 addition & 1 deletion genotype_api/database/base_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ def _get_query(self, table: Type[DeclarativeBase]) -> Query:
return select(table)

def _get_join_analysis_on_sample(self) -> Query:
return self._get_query(table=Sample).join(Analysis)
return self._get_query(table=Sample).join(Analysis, Analysis.sample_id == Sample.id)
31 changes: 21 additions & 10 deletions genotype_api/database/crud/create.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import logging

from sqlalchemy.future import select

from genotype_api.database.base_handler import BaseHandler
from genotype_api.database.models import SNP, Analysis, Genotype, Plate, Sample, User
from genotype_api.dto.user import UserRequest
Expand All @@ -25,23 +27,32 @@ async def create_plate(self, plate: Plate) -> Plate:

async def create_sample(self, sample: Sample) -> Sample:
"""Creates a sample in the database."""
sample_in_db = await self._get_query(Analysis).filter(Sample.id == sample.id).one_or_none()
if sample_in_db:
sample_in_db_query = self._get_query(Analysis).filter(Sample.id == sample.id)
result = await self.session.execute(sample_in_db_query)
if sample_in_db := result.one_or_none():
raise SampleExistsError
self.session.add(sample)
await self.session.commit()
await self.session.refresh(sample)
return sample

async def create_analyses_samples(self, analyses: list[Analysis]) -> list[Sample]:
"""creating samples in an analysis if not already in db."""
return [
await self.create_sample(sample=Sample(id=analysis.sample_id))
for analysis in analyses
if not await self.session.query(Sample)
.filter(Sample.id == analysis.sample_id)
.one_or_none()
]
"""Creating samples in an analysis if not already in db."""
created_samples = []

for analysis in analyses:
# Sample already exists in the database
sample_in_db_query = self._get_query(Sample).filter(Sample.id == analysis.sample_id)
result = await self.session.execute(sample_in_db_query)
sample_in_db = result.one_or_none()

# Sample doesn't exist
if not sample_in_db:
sample = Sample(id=analysis.sample_id)
created_sample = await self.create_sample(sample=sample)
created_samples.append(created_sample)

return created_samples

async def create_user(self, user: User) -> User:
self.session.add(user)
Expand Down
17 changes: 13 additions & 4 deletions genotype_api/database/crud/read.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,19 @@
from genotype_api.database.base_handler import BaseHandler
from genotype_api.database.filter_models.plate_models import PlateOrderParams
from genotype_api.database.filter_models.sample_models import SampleFilterParams
from genotype_api.database.filters.analysis_filter import AnalysisFilter, apply_analysis_filter
from genotype_api.database.filters.genotype_filters import GenotypeFilter, apply_genotype_filter
from genotype_api.database.filters.analysis_filter import (
AnalysisFilter,
apply_analysis_filter,
)
from genotype_api.database.filters.genotype_filters import (
GenotypeFilter,
apply_genotype_filter,
)
from genotype_api.database.filters.plate_filters import PlateFilter, apply_plate_filter
from genotype_api.database.filters.sample_filters import SampleFilter, apply_sample_filter
from genotype_api.database.filters.sample_filters import (
SampleFilter,
apply_sample_filter,
)
from genotype_api.database.filters.snp_filters import SNPFilter, apply_snp_filter
from genotype_api.database.filters.user_filters import UserFilter, apply_user_filter
from genotype_api.database.models import SNP, Analysis, Genotype, Plate, Sample, User
Expand Down Expand Up @@ -147,7 +156,7 @@ async def get_filtered_samples(self, filter_params: SampleFilterParams) -> list[
select(Sample)
.distinct()
.options(selectinload(Sample.analyses).selectinload(Analysis.genotypes))
.join(Analysis)
.join(Analysis, Analysis.sample_id == Sample.id)
)
if filter_params.sample_id:
query = self._get_samples(query, filter_params.sample_id)
Expand Down
6 changes: 4 additions & 2 deletions genotype_api/database/crud/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
from genotype_api.database.filter_models.sample_models import SampleSexesUpdate
from genotype_api.database.models import Analysis, Plate, Sample, User
from genotype_api.exceptions import SampleNotFoundError
from genotype_api.services.match_genotype_service.match_genotype import MatchGenotypeService
from genotype_api.services.match_genotype_service.match_genotype import (
MatchGenotypeService,
)


class UpdateHandler(BaseHandler):
Expand Down Expand Up @@ -69,7 +71,7 @@ async def update_sample_sex(self, sexes_update: SampleSexesUpdate) -> Sample:
select(Sample)
.distinct()
.options(selectinload(Sample.analyses).selectinload(Analysis.genotypes))
.join(Analysis)
.join(Analysis, Analysis.sample_id == Sample.id)
.filter(Sample.id == sexes_update.sample_id)
)

Expand Down

0 comments on commit 9433cd4

Please sign in to comment.