Skip to content

Commit 116f331

Browse files
committed
refactor: streamline project and sample creation logic in job_creator and scraper
1 parent bf169a4 commit 116f331

File tree

4 files changed

+37
-31
lines changed

4 files changed

+37
-31
lines changed

microSALT/cli.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,6 @@ def finish(
315315
if os.path.isdir(f"{input}/{subfolder}"):
316316
pool.append(subfolder)
317317

318-
run_settings = {
319-
"input": input,
320-
"track": track,
321-
"dry": dry,
322-
"email": config.regex.mail_recipient,
323-
"skip_update": skip_update,
324-
}
325-
326318
sampleinfo = review_sampleinfo(sampleinfo_file)
327319
ext_refs = Referencer(
328320
log=logger,

microSALT/store/db_manipulator.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,18 @@ def delete_sample(self, cg_id: str) -> None:
279279
self.session.commit()
280280
self.logger.info(f"Removed sample {cg_id} and its child rows")
281281

282+
def delete_sample_results(self, cg_id: str) -> None:
283+
"""Delete only the analysis result rows for a sample (seq_types, resistances, expacs)
284+
without removing the Samples row itself."""
285+
for obj in self.session.query(Expacs).filter(Expacs.CG_ID_sample == cg_id).all():
286+
self.session.delete(obj)
287+
for obj in self.session.query(Seq_types).filter(Seq_types.CG_ID_sample == cg_id).all():
288+
self.session.delete(obj)
289+
for obj in self.session.query(Resistances).filter(Resistances.CG_ID_sample == cg_id).all():
290+
self.session.delete(obj)
291+
self.session.commit()
292+
self.logger.info(f"Cleared analysis results for sample {cg_id}")
293+
282294
def delete_project(self, name: str) -> None:
283295
"""Delete all samples (and their child rows) belonging to a project."""
284296
for obj in self.session.query(Expacs).filter(Expacs.CG_ID_sample.like(f"{name}%")).all():
@@ -413,6 +425,10 @@ def read_columns(self, tablename: str):
413425
table = _resolve_orm_table(tablename)
414426
return dict.fromkeys(table.__table__.columns.keys())
415427

428+
def get_projects_by_cg_id_project(self, cg_id_project_name: str) -> Projects | None:
429+
"""Fetch a Projects record by CG_ID_project."""
430+
return self.session.query(Projects).filter(Projects.CG_ID_project == cg_id_project_name).scalar()
431+
416432
def read_exists(self, table: str, item: dict[str, str]):
417433
"""Takes a k-v pair and checks for the entrys existence in the given table"""
418434
orm_table = _resolve_orm_table(table)

microSALT/utils/job_creator.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -541,8 +541,8 @@ def create_collection(self):
541541
self.create_project(lims_project)
542542
addedprojs.append(lims_project)
543543

544-
def create_project(self, name: str):
545-
"""Creates project in database"""
544+
def create_project(self, name: str) -> None:
545+
"""Creates or updates a project in the database."""
546546
if not self.sample:
547547
raise JobCreationError(
548548
"No sample information provided. Cannot create project in database."
@@ -552,12 +552,15 @@ def create_project(self, name: str):
552552
"Customer_ID_project": self.sample["Customer_ID_project"],
553553
"Customer_ID": self.sample["Customer_ID"],
554554
}
555-
self.db_pusher.add_to_session(self.db_pusher.add_project(**project_data))
556-
self.db_pusher.commit_session()
557-
558-
def create_sample(self):
559-
"""Creates sample in database"""
555+
if self.db_pusher.get_projects_by_cg_id_project(name):
556+
update_data = {k: v for k, v in project_data.items() if k != "CG_ID_project"}
557+
self.db_pusher.update_project({"CG_ID_project": name}, update_data)
558+
else:
559+
self.db_pusher.add_to_session(self.db_pusher.add_project(**project_data))
560+
self.db_pusher.commit_session()
560561

562+
def create_sample(self) -> None:
563+
"""Creates or updates a sample in the database."""
561564
try:
562565
if not self.sample:
563566
raise JobCreationError(
@@ -581,8 +584,13 @@ def create_sample(self):
581584
"method_libprep": self.sample["method_libprep"],
582585
"method_sequencing": self.sample["method_sequencing"],
583586
}
584-
self.db_pusher.add_to_session(self.db_pusher.add_sample(**sample_data))
585-
self.db_pusher.commit_session()
587+
cg_id = self.sample["CG_ID_sample"]
588+
if self.db_pusher.read_exists("Samples", {"CG_ID_sample": cg_id}):
589+
update_data = {k: v for k, v in sample_data.items() if k != "CG_ID_sample"}
590+
self.db_pusher.update_sample({"CG_ID_sample": cg_id}, update_data)
591+
else:
592+
self.db_pusher.add_to_session(self.db_pusher.add_sample(**sample_data))
593+
self.db_pusher.commit_session()
586594
except JobCreationError as e:
587595
self.logger.error(f"Unable to add sample {self.name} to database: {e}")
588596
except KeyError as e:

microSALT/utils/scraper.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,7 @@ def scrape_project(self, project=None):
108108
if project is None:
109109
project = self.name
110110
self.db_pusher.delete_project(project)
111-
if not self.db_pusher.read_exists("Projects", {"CG_ID_project": project}):
112-
self.logger.warning(f"Replacing project {project}")
113-
self.job_fallback.create_project(project)
111+
self.job_fallback.create_project(project)
114112

115113
# Scrape order matters a lot!
116114
for item in os.listdir(self.infolder):
@@ -140,17 +138,9 @@ def scrape_sample(self, sample=None):
140138
"""Scrapes a sample folder for information"""
141139
if sample is None:
142140
sample = self.name
143-
self.db_pusher.delete_sample(sample)
144-
145-
if not self.db_pusher.read_exists(
146-
"Projects", {"CG_ID_project": self.sample.get("CG_ID_project")}
147-
):
148-
self.logger.warning(f"Replacing project {self.sample.get('CG_ID_project')}")
149-
self.job_fallback.create_project(self.sample.get("CG_ID_project"))
150-
151-
if not self.db_pusher.read_exists("Samples", {"CG_ID_sample": sample}):
152-
self.logger.info(f"Replacing sample {sample}")
153-
self.job_fallback.create_sample(sample)
141+
self.db_pusher.delete_sample_results(sample)
142+
self.job_fallback.create_project(self.sample.get("CG_ID_project"))
143+
self.job_fallback.create_sample()
154144

155145
# Scrape order matters a lot!
156146
self.sampledir = self.infolder

0 commit comments

Comments
 (0)