Skip to content

Commit 56a4c42

Browse files
committed
migrate to new database abstraction
1 parent a726d2b commit 56a4c42

23 files changed

Lines changed: 474 additions & 203 deletions

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ select = ["E", "F", "I", "N", "UP", "W"]
1919
include = [
2020
"python/tests",
2121
"python/lib/db",
22+
"python/lib/imaging_lib",
2223
"python/lib/import_bids_dataset",
2324
"python/lib/import_dicom_study",
2425
"python/lib/util",
25-
"python/lib/bids.py",
2626
"python/lib/config.py",
2727
"python/lib/config_file.py",
2828
"python/lib/env.py",

python/lib/db/models/file.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class DbFile(Base):
1313

1414
id : Mapped[int] = mapped_column('FileID', primary_key=True)
1515
session_id : Mapped[int] = mapped_column('SessionID', ForeignKey('session.ID'))
16-
file_name : Mapped[str] = mapped_column('File')
16+
rel_path : Mapped[str] = mapped_column('File')
1717
series_uid : Mapped[str | None] = mapped_column('SeriesUID')
1818
echo_time : Mapped[float | None] = mapped_column('EchoTime')
1919
phase_encoding_direction : Mapped[str | None] = mapped_column('PhaseEncodingDirection')
@@ -35,6 +35,7 @@ class DbFile(Base):
3535
acquisition_order_per_modality : Mapped[int | None] = mapped_column('AcqOrderPerModality')
3636
acquisition_date : Mapped[date | None] = mapped_column('AcquisitionDate')
3737

38-
session : Mapped['db_session.DbSession'] = relationship('DbSession', back_populates='files')
39-
parameters: Mapped[list['db_parameter_file.DbParameterFile']] \
38+
session : Mapped['db_session.DbSession'] \
39+
= relationship('DbSession', back_populates='files')
40+
parameters : Mapped[list['db_parameter_file.DbParameterFile']] \
4041
= relationship('DbParameterFile', back_populates='file')
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from sqlalchemy.orm import Mapped, mapped_column
2+
3+
from lib.db.base import Base
4+
5+
6+
class DbImagingFileType(Base):
7+
__tablename__ = 'ImagingFileTypes'
8+
9+
type : Mapped[str] = mapped_column('type', primary_key=True)
10+
description : Mapped[str | None] = mapped_column('description')

python/lib/db/models/mri_violation_log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@ class DbMriViolationLog(Base):
4343
= relationship('DbCandidate', back_populates='violations_log')
4444
scan_type : Mapped[Optional['db_mri_scan_type.DbMriScanType']] \
4545
= relationship('DbMriScanType', back_populates='violations_log')
46-
protocol_check_group: Mapped[Optional['db_mri_protocol_check_group.DbMriProtocolCheckGroup']] \
46+
protocol_check_group : Mapped[Optional['db_mri_protocol_check_group.DbMriProtocolCheckGroup']] \
4747
= relationship('DbMriProtocolCheckGroup', back_populates='violations_log')

python/lib/db/models/parameter_file.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ class DbParameterFile(Base):
1515
value : Mapped[str | None] = mapped_column('Value')
1616
insert_time : Mapped[int] = mapped_column('InsertTime')
1717

18-
file: Mapped[list['db_file.DbFile']] = relationship('DbFile', back_populates='parameters')
19-
type: Mapped['db_parameter_type.DbParameterType'] = relationship('DbParameterType', back_populates='parameter_file')
18+
file: Mapped['db_file.DbFile'] \
19+
= relationship('DbFile', back_populates='parameters')
20+
type: Mapped['db_parameter_type.DbParameterType'] \
21+
= relationship('DbParameterType', back_populates='parameter_files')

python/lib/db/models/parameter_type.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ class DbParameterType(Base):
2020
queryable : Mapped[bool | None] = mapped_column('Queryable')
2121
is_file : Mapped[bool | None] = mapped_column('IsFile')
2222

23-
parameter_file: Mapped[list['db_parameter_file.DbParameterFile']] \
23+
parameter_files: Mapped[list['db_parameter_file.DbParameterFile']] \
2424
= relationship('DbParameterFile', back_populates='type')

python/lib/db/queries/file.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,17 @@ def try_get_parameter_value_with_file_id_parameter_name(
4040
.where(DbParameterType.name == parameter_name)
4141
.where(DbParameterFile.file_id == file_id)
4242
).scalar_one_or_none()
43+
44+
45+
def try_get_file_with_hash(db: Database, file_hash: str) -> DbFile | None:
46+
"""
47+
Get an imaging file from the database using its BLAKE2b or MD5 hash, or return `None` if no
48+
imaging file is found.
49+
"""
50+
51+
return db.execute(select(DbFile)
52+
.join(DbFile.parameters)
53+
.join(DbParameterFile.type)
54+
.where(DbParameterType.name.in_(['file_blake2b_hash', 'md5hash']))
55+
.where(DbParameterFile.value == file_hash)
56+
).scalar_one_or_none()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from collections.abc import Sequence
2+
3+
from sqlalchemy import select
4+
from sqlalchemy.orm import Session as Database
5+
6+
from lib.db.models.imaging_file_type import DbImagingFileType
7+
8+
9+
def get_all_imaging_file_types(db: Database) -> Sequence[DbImagingFileType]:
10+
"""
11+
Get a sequence of all imaging file types from the database.
12+
"""
13+
14+
return db.execute(select(DbImagingFileType)).scalars().all()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from sqlalchemy import select
2+
from sqlalchemy.orm import Session as Database
3+
4+
from lib.db.models.mri_scan_type import DbMriScanType
5+
6+
7+
def try_get_mri_scan_type_with_name(db: Database, name: str) -> DbMriScanType | None:
8+
"""
9+
Get an MRI scan type from the database using its name, or return `None` if no scan type is
10+
found.
11+
"""
12+
13+
return db.execute(select(DbMriScanType)
14+
.where(DbMriScanType.name == name)
15+
).scalar_one_or_none()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from sqlalchemy import select
2+
from sqlalchemy.orm import Session as Database
3+
4+
from lib.db.models.parameter_file import DbParameterFile
5+
6+
7+
def try_get_parameter_file_with_file_id_type_id(db: Database, file_id: int, type_id: int) -> DbParameterFile | None:
8+
"""
9+
Get a file parameter from the database using its file ID and type ID, or return `None` if no
10+
file parameter is found.
11+
"""
12+
13+
return db.execute(select(DbParameterFile)
14+
.where(DbParameterFile.type_id == type_id)
15+
.where(DbParameterFile.file_id == file_id)
16+
).scalar_one_or_none()

0 commit comments

Comments
 (0)