Skip to content

Commit 6121b28

Browse files
committed
alembic: create columns and init dim_vessel & dim_zone
1 parent e679434 commit 6121b28

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""SCD implementation for dim_vessel/dim_zone
2+
3+
Revision ID: c02d2b79eab2
4+
Revises: 5801cb8f1af5
5+
Create Date: 2025-03-13 21:04:11.148024
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
from bloom.config import settings
11+
12+
13+
# revision identifiers, used by Alembic.
14+
revision = 'c02d2b79eab2'
15+
down_revision = '5801cb8f1af5'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade() -> None:
21+
# Create SCD columns for dim_vessel and dim_zone with existing data (nullable)
22+
op.add_column("dim_vessel",sa.Column("scd_start",sa.DateTime(timezone=True),nullable=True))
23+
op.add_column("dim_vessel",sa.Column("scd_end",sa.DateTime(timezone=True),nullable=True))
24+
op.add_column("dim_vessel",sa.Column("scd_active",sa.Boolean,nullable=True))
25+
op.add_column("dim_vessel",sa.Column("key",sa.String,nullable=True))
26+
27+
op.add_column("dim_zone",sa.Column("scd_start",sa.DateTime(timezone=True),nullable=True))
28+
op.add_column("dim_zone",sa.Column("scd_end",sa.DateTime(timezone=True),nullable=True))
29+
op.add_column("dim_zone",sa.Column("scd_active",sa.Boolean,nullable=True))
30+
op.add_column("dim_zone",sa.Column("key",sa.String,nullable=True))
31+
32+
# Initialize scd_column values
33+
op.execute( (f"update dim_vessel set scd_start = '{settings.scd_past_limit.isoformat()}',"
34+
f"scd_end = '{settings.scd_future_limit.isoformat()}',"
35+
f"scd_active = true,"
36+
f"key = (CASE WHEN imo IS NOT NULL THEN imo::varchar(255) ELSE cfr END)"
37+
))
38+
39+
op.execute( (f"update dim_zone set scd_start = '{settings.scd_past_limit.isoformat()}',"
40+
f"scd_end = '{settings.scd_future_limit.isoformat()}',"
41+
f"scd_active = true,"
42+
f"key = COALESCE(category,'')||'/'||COALESCE(sub_category,'')||'/'||name"
43+
))
44+
45+
# Set scd columns not nullable after init
46+
op.alter_column("dim_vessel","scd_start",nullable=False)
47+
op.alter_column("dim_vessel","scd_end",nullable=False)
48+
op.alter_column("dim_vessel","scd_active",nullable=False)
49+
op.alter_column("dim_vessel","key",nullable=False)
50+
51+
op.alter_column("dim_zone","scd_start",nullable=False)
52+
op.alter_column("dim_zone","scd_end",nullable=False)
53+
op.alter_column("dim_zone","scd_active",nullable=False)
54+
op.alter_column("dim_zone","key",nullable=False)
55+
pass
56+
57+
58+
def downgrade() -> None:
59+
op.drop_column("dim_zone","scd_start")
60+
op.drop_column("dim_zone","scd_end")
61+
op.drop_column("dim_zone","scd_active")
62+
op.drop_column("dim_zone","key")
63+
64+
op.drop_column("dim_vessel","scd_start")
65+
op.drop_column("dim_vessel","scd_end")
66+
op.drop_column("dim_vessel","scd_active")
67+
op.drop_column("dim_vessel","key")
68+
pass

backend/bloom/config.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
from pathlib import Path
3-
from datetime import timedelta
3+
from datetime import datetime,timedelta, timezone
44
from pydantic_settings import BaseSettings, SettingsConfigDict
55
from typing import Any
66

@@ -59,6 +59,23 @@ class Settings(BaseSettings):
5959
)
6060
api_key:str = Field(min_length=4,default='bloom')
6161

62+
scd_past_limit: datetime = Field(default=datetime(year=1900,
63+
month=1,
64+
day=1,
65+
hour=0,
66+
minute=0,
67+
second=0,
68+
microsecond=0,
69+
tzinfo=timezone.utc))
70+
scd_future_limit: datetime = Field(default=datetime(year=2999,
71+
month=12,
72+
day=31,
73+
hour=23,
74+
minute=59,
75+
second=59,
76+
microsecond=999999,
77+
tzinfo=timezone.utc))
78+
6279
@model_validator(mode='after')
6380
def update_db_url(self)->dict:
6481
new_url= f"postgresql://{self.postgres_user}:"\

backend/bloom/infra/database/sql_model.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from datetime import timedelta
2121

2222

23+
2324
class Vessel(Base):
2425
__tablename__ = "dim_vessel"
2526
id = Column("id", Integer, primary_key=True)
@@ -43,6 +44,10 @@ class Vessel(Base):
4344
"created_at", DateTime(timezone=True), nullable=False, server_default=func.now(),
4445
)
4546
updated_at = Column("updated_at", DateTime(timezone=True), onupdate=func.now())
47+
scd_start = Column("scd_start",DateTime(timezone=True))
48+
scd_end = Column("scd_end",DateTime(timezone=True))
49+
scd_active = Column("scd_active",Boolean)
50+
key = Column("key",String)
4651

4752

4853
class Alert(Base):
@@ -117,6 +122,10 @@ class Zone(Base):
117122
json_data = Column("json_data", JSONB)
118123
created_at = Column("created_at", DateTime(timezone=True), server_default=func.now())
119124
enable = Column("enable",Boolean(), server_default="True")
125+
scd_start = Column("scd_start",DateTime(timezone=True))
126+
scd_end = Column("scd_end",DateTime(timezone=True))
127+
scd_active = Column("scd_active",Boolean)
128+
key = Column("key",String)
120129

121130

122131
class WhiteZone(Base):

0 commit comments

Comments
 (0)