Skip to content
Merged
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""update atomic map coadd table

Revision ID: fd6670a1fdbe
Revises: 1195d17201ba
Create Date: 2025-12-18 19:50:23.313924

"""
from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision: str = 'fd6670a1fdbe'
down_revision: Union[str, None] = '1195d17201ba'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
op.create_table(
"link_coadd_map_to_coadd",
sa.Column(
"parent_coadd_id",
sa.Integer(),
sa.ForeignKey("atomic_map_coadds.coadd_id"),
nullable=False,
),
sa.Column(
"child_coadd_id",
sa.Integer(),
sa.ForeignKey("atomic_map_coadds.coadd_id"),
nullable=False,
),
)

op.add_column('atomic_map_coadds', sa.Column('stop_time', sa.Float(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('prefix_path', sa.String(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('freq_channel', sa.String(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('geom_file_path', sa.String(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('split_label', sa.String(), nullable=False))
op.drop_column('atomic_map_coadds', 'end_time')
op.drop_column('atomic_map_coadds', 'coadd_path')
op.drop_column('atomic_map_coadds', 'frequency')


def downgrade() -> None:
op.add_column('atomic_map_coadds', sa.Column('frequency', sa.String(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('coadd_path', sa.String(), nullable=False))
op.add_column('atomic_map_coadds', sa.Column('end_time', sa.Float(), nullable=False))
op.drop_column('atomic_map_coadds', 'split_label')
op.drop_column('atomic_map_coadds', 'geom_file_path')
op.drop_column('atomic_map_coadds', 'freq_channel')
op.drop_column('atomic_map_coadds', 'prefix_path')
op.drop_column('atomic_map_coadds', 'stop_time')
op.drop_table('link_coadd_map_to_coadd')
28 changes: 24 additions & 4 deletions mapcat/database/atomic_coadd.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
if TYPE_CHECKING:
from .atomic_map import AtomicMapTable

from .links import AtomicMapToCoaddTable
from .links import AtomicMapToCoaddTable, CoaddMapToCoaddTable


class AtomicMapCoaddTable(SQLModel, table=True):
Expand All @@ -18,15 +18,35 @@ class AtomicMapCoaddTable(SQLModel, table=True):
coadd_id: int = Field(primary_key=True)

coadd_name: str = Field()
coadd_path: str = Field()
prefix_path: str = Field()

platform: str = Field()
interval: str = Field()
start_time: float = Field()
end_time: float = Field()
frequency: str = Field()
stop_time: float = Field()
freq_channel: str = Field()
geom_file_path: str = Field()
split_label: str = Field()

atomic_maps: list["AtomicMapTable"] = Relationship(
back_populates="coadds",
link_model=AtomicMapToCoaddTable,
)

child_coadds: list["AtomicMapCoaddTable"] = Relationship(
back_populates="parent_coadds",
link_model=CoaddMapToCoaddTable,
sa_relationship_kwargs={
"primaryjoin": "AtomicMapCoaddTable.coadd_id == CoaddMapToCoaddTable.parent_coadd_id",
"secondaryjoin": "AtomicMapCoaddTable.coadd_id == CoaddMapToCoaddTable.child_coadd_id",
},
Comment on lines +39 to +42
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't fully understand why these manual join relationships are necessary

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get this error if I omit those lines:

AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship AtomicMapCoaddTable.child_coadds - there are multiple foreign key paths linking the tables via secondary table 'link_coadd_map_to_coadd'.  Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference from the secondary table to each of the parent and child tables.

)

parent_coadds: list["AtomicMapCoaddTable"] = Relationship(
back_populates="child_coadds",
link_model=CoaddMapToCoaddTable,
sa_relationship_kwargs={
"primaryjoin": "AtomicMapCoaddTable.coadd_id == CoaddMapToCoaddTable.child_coadd_id",
"secondaryjoin": "AtomicMapCoaddTable.coadd_id == CoaddMapToCoaddTable.parent_coadd_id",
},
)
24 changes: 24 additions & 0 deletions mapcat/database/links.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,27 @@ class AtomicMapToCoaddTable(SQLModel, table=True):
index=True,
ondelete="CASCADE",
)


class CoaddMapToCoaddTable(SQLModel, table=True):
"""
Link table for many-to-many relationship between coadd maps and other coadds.
"""

__tablename__ = "link_coadd_map_to_coadd"

parent_coadd_id: int = Field(
foreign_key="atomic_map_coadds.coadd_id",
primary_key=True,
nullable=False,
index=True,
ondelete="CASCADE",
)

child_coadd_id: int = Field(
foreign_key="atomic_map_coadds.coadd_id",
primary_key=True,
nullable=False,
index=True,
ondelete="CASCADE",
)
Loading
Loading