Source code for alab_management.sample_view.completed_sample_view
"""
This module contains the CompletedSampleView class, which is responsible for
saving samples to the completed database.
"""
from __future__ import annotations
import time
from datetime import datetime
from typing import Any
from bson import ObjectId # type: ignore
from alab_management.utils.data_objects import get_collection, get_completed_collection
[docs]
class CompletedSampleView:
"""Sample view manages the sample status, which is a collection of tasks."""
def __init__(self):
self._working_sample_collection = get_collection("samples")
self._completed_sample_collection = get_completed_collection("samples")
[docs]
def save_sample(self, sample_id: ObjectId):
"""Saves a sample dictionary to the completed database. This should be copying a sample from the working
database to the completed database.
"""
# if self.exists(sample_id):
# raise ValueError(
# f"Sample with id {sample_id} already exists in the completed database!"
# )
sample_dict = self._working_sample_collection.find_one(
{"_id": ObjectId(sample_id)}
)
if sample_dict is None:
raise ValueError(
f"Sample with id {sample_id} does not exist in the database!"
)
if self.exists(sample_id):
self._completed_sample_collection.update_one(
filter={"_id": ObjectId(sample_id)},
update={"$set": sample_dict},
upsert=True,
)
else:
self._completed_sample_collection.insert_one(sample_dict)
# wait for the insert to complete
while (
self._completed_sample_collection.find_one({"_id": ObjectId(sample_id)})
is None
):
time.sleep(0.5)
[docs]
def exists(self, sample_id: ObjectId | str) -> bool:
"""Check if a sample exists in the database.
Args:
sample_id (ObjectId): id of the sample within sample collection
Returns
-------
bool: True if sample exists in the database
"""
return (
self._completed_sample_collection.count_documents(
{"_id": ObjectId(sample_id)}
)
> 0
)
[docs]
def append_measurement(
self, sample_id: ObjectId, measurement: dict[str, Any]
) -> None:
"""Append one measurement ref onto ``metadata.measurements`` for an archived sample.
Same shape as ``SampleView.append_measurement``, but writes ``Alab(completed)``.
Used when the live copy was pruned after Ending (e.g. late SEM Path A ingest).
"""
oid = ObjectId(sample_id)
if self._completed_sample_collection.find_one({"_id": oid}) is None:
raise ValueError(f"Cannot find sample with id: {oid}")
self._completed_sample_collection.update_one(
{"_id": oid},
{
"$push": {"metadata.measurements": measurement},
"$set": {"last_updated": datetime.now()},
},
)