Skip to content

Commit 7d3e9c1

Browse files
committed
feat: dim_vessel add scd filters to vessel repository: +scd_date +scd_enable
1 parent 6121b28 commit 7d3e9c1

File tree

7 files changed

+208
-22
lines changed

7 files changed

+208
-22
lines changed

backend/bloom/domain/vessel.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
class Vessel(BaseModel):
88
id: Union[int, None] = None
9+
key: Union[str, None] = None
910
mmsi: Union[int, None]
1011
ship_name: str
1112
width: Union[float, None] = None
@@ -24,6 +25,9 @@ class Vessel(BaseModel):
2425
details: Union[str, None] = None
2526
check: Union[str, None] = None
2627
length_class: Union[str, None] = None
28+
scd_start: Union[datetime, None] = None
29+
scd_end: Union[datetime, None] = None
30+
scd_active: Union[bool, None] = None
2731

2832
class VesselListView(Vessel):
2933
details:ClassVar[Union[str, None]] = None

backend/bloom/domain/zone.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class Zone(BaseModel):
1212
Geometry: lambda p: mapping(p),
1313
},)
1414
id: Union[int, None] = None
15+
key: Union[str, None] = None
1516
category: str
1617
sub_category: Union[str, None] = None
1718
name: str
@@ -21,14 +22,21 @@ class Zone(BaseModel):
2122
centroid: Union[Point, None] = None
2223
json_data: Union[dict, None] = None
2324
enable: Union[bool, None] = None
25+
scd_start: Union[datetime, None] = None
26+
scd_end: Union[datetime, None] = None
27+
scd_active: Union[bool, None] = None
2428

2529
class ZoneSummary(BaseModel):
2630
id: Union[int, None] = None
31+
key: Union[str, None] = None
2732
category: str
2833
sub_category: Union[str, None] = None
2934
name: str
3035
created_at: Union[datetime, None] = None
3136
enable: Union[bool, None] = None
37+
scd_start: Union[datetime, None] = None
38+
scd_end: Union[datetime, None] = None
39+
scd_active: Union[bool, None] = None
3240

3341

3442
class ZoneListView(Zone):

backend/bloom/infra/database/sql_model.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
class Vessel(Base):
2525
__tablename__ = "dim_vessel"
2626
id = Column("id", Integer, primary_key=True)
27+
key = Column("key",String,nullable=False)
2728
mmsi = Column("mmsi", Integer)
2829
ship_name = Column("ship_name", String, nullable=False)
2930
width = Column("width", Double)
@@ -47,7 +48,6 @@ class Vessel(Base):
4748
scd_start = Column("scd_start",DateTime(timezone=True))
4849
scd_end = Column("scd_end",DateTime(timezone=True))
4950
scd_active = Column("scd_active",Boolean)
50-
key = Column("key",String)
5151

5252

5353
class Alert(Base):
@@ -114,6 +114,7 @@ class SpireAisData(Base):
114114
class Zone(Base):
115115
__tablename__ = "dim_zone"
116116
id = Column("id", Integer, primary_key=True)
117+
key = Column("key", String, nullable=False)
117118
category = Column("category", String, nullable=False)
118119
sub_category = Column("sub_category", String)
119120
name = Column("name", String, nullable=False)

backend/bloom/infra/repositories/repository_spire_ais_data.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from bloom.infra.database import sql_model
44
from dependency_injector.providers import Callable
55
from sqlalchemy.orm import Session
6-
from sqlalchemy import select, and_
6+
from sqlalchemy import select, and_, between
77
from datetime import datetime
88
from bloom.logger import logger
99

@@ -38,6 +38,7 @@ def get_all_data_after_date(
3838
sql_model.SpireAisData.spire_update_statement,
3939
sql_model.SpireAisData.vessel_mmsi,
4040
sql_model.Vessel.id,
41+
sql_model.Vessel.key,
4142
sql_model.SpireAisData.position_accuracy,
4243
sql_model.SpireAisData.position_collection_type,
4344
sql_model.SpireAisData.position_course,
@@ -66,6 +67,7 @@ def get_all_data_after_date(
6667
"spire_update_statement",
6768
"vessel_mmsi",
6869
"vessel_id",
70+
"vessel_key",
6971
"position_accuracy",
7072
"position_collection_type",
7173
"position_course",
@@ -90,6 +92,7 @@ def get_all_data_between_date(
9092
sql_model.SpireAisData.spire_update_statement,
9193
sql_model.SpireAisData.vessel_mmsi,
9294
sql_model.Vessel.id,
95+
sql_model.Vessel.key,
9396
sql_model.SpireAisData.position_accuracy,
9497
sql_model.SpireAisData.position_collection_type,
9598
sql_model.SpireAisData.position_course,
@@ -112,13 +115,20 @@ def get_all_data_between_date(
112115
sql_model.SpireAisData.created_at > created_updated_after,
113116
sql_model.SpireAisData.created_at <= created_updated_before
114117
)
118+
).where(
119+
# scd attribute management
120+
# filter on spire_update_statement reference date
121+
between(sql_model.SpireAisData.spire_update_statement,
122+
sql_model.Vessel.scd_start,
123+
sql_model.Vessel.scd_end)
115124
).order_by(sql_model.SpireAisData.created_at.asc())
116125
result = session.execute(stmt)
117126
return pd.DataFrame(result, columns=[
118127
"id",
119128
"spire_update_statement",
120129
"vessel_mmsi",
121130
"vessel_id",
131+
"vessel_key",
122132
"position_accuracy",
123133
"position_collection_type",
124134
"position_course",

backend/bloom/infra/repositories/repository_vessel.py

Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
from contextlib import AbstractContextManager
2-
from typing import Any, Generator, Union
2+
from typing import Any, Generator, Union, Optional
3+
from datetime import datetime
34

45
from bloom.domain.vessel import Vessel
56
from bloom.domain.metrics import VesselTimeInZone
67
from bloom.infra.database import sql_model
78
from dependency_injector.providers import Callable
8-
from sqlalchemy import func, select, update, and_, asc, desc, literal_column
9+
from sqlalchemy import func, select, update, and_, asc, desc, literal_column, between
910
from sqlalchemy.orm import Session
1011
from bloom.routers.requests import (DatetimeRangeRequest,
1112
OrderByRequest,
1213
OrderByEnum)
14+
from bloom.config import settings
1315

1416

1517
class VesselRepository:
@@ -20,54 +22,128 @@ def __init__(
2022
self.session_factory = session_factory
2123

2224

23-
def get_vessel_tracked_count(self, session: Session) -> int:
25+
def get_vessel_tracked_count(self, session: Session,
26+
scd_date:Optional[datetime]=None,
27+
scd_enable:bool=True
28+
) -> int:
2429
stmt = select(func.count(sql_model.Vessel.id)).select_from(sql_model.Vessel)\
2530
.distinct().where(sql_model.Vessel.tracking_activated == True)
31+
if scd_enable:
32+
if scd_date:
33+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
34+
else:
35+
stmt=stmt.where(sql_model.Vessel.scd_active)
2636
return session.execute(stmt).scalar()
2737

28-
def get_vessel_types(self, session: Session) -> list[str]:
38+
def get_vessel_types(self,
39+
session: Session,
40+
scd_date:Optional[datetime]=None,
41+
scd_enable:bool=True
42+
) -> list[str]:
2943
stmt = select(sql_model.Vessel.type).select_from(sql_model.Vessel).distinct()
44+
if scd_enable:
45+
if scd_date:
46+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
47+
else:
48+
stmt=stmt.where(sql_model.Vessel.scd_active)
3049
return [i for i in session.execute(stmt).scalars()]
3150

32-
def get_vessel_length_classes(self, session: Session) -> list[str]:
51+
def get_vessel_length_classes(self, session: Session,
52+
scd_date:Optional[datetime]=None,
53+
scd_enable:bool=True
54+
) -> list[str]:
3355
stmt = select(sql_model.Vessel.length_class).select_from(sql_model.Vessel).distinct()
56+
if scd_enable:
57+
if scd_date:
58+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
59+
else:
60+
stmt=stmt.where(sql_model.Vessel.scd_active)
3461
return [i for i in session.execute(stmt).scalars()]
3562

36-
def get_vessel_countries(self, session: Session) -> list[str]:
63+
def get_vessel_countries(self, session: Session,
64+
scd_date:Optional[datetime]=None,
65+
scd_enable:bool=True
66+
) -> list[str]:
3767
stmt = select(sql_model.Vessel.country_iso3).select_from(sql_model.Vessel).distinct()
68+
if scd_enable:
69+
if scd_date:
70+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
71+
else:
72+
stmt=stmt.where(sql_model.Vessel.scd_active)
3873
return [i for i in session.execute(stmt).scalars()]
3974

4075
def get_vessel_by_id(self, session: Session, vessel_id: int) -> Union[Vessel, None]:
4176
return session.get(sql_model.Vessel, vessel_id)
77+
78+
def get_vessel_by_key(self, session: Session,
79+
key: str,
80+
scd_date:Optional[datetime]=None,
81+
scd_enable:bool=True
82+
) -> Union[Vessel, list[Vessel],None]:
83+
stmt=select(sql_model.Vessel).where(sql_model.Vessel.key == key)
84+
if scd_enable:
85+
if scd_date:
86+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
87+
else:
88+
stmt=stmt.where(sql_model.Vessel.scd_active)
89+
return session.execute(stmt).scalar()
90+
else:
91+
return session.execute(stmt).scalars()
4292

43-
def get_activated_vessel_by_mmsi(self, session: Session, mmsi: int) -> Union[Vessel, None]:
93+
def get_activated_vessel_by_mmsi(self, session: Session,
94+
mmsi: int,
95+
scd_date:Optional[datetime]=None,
96+
scd_enable:bool=True
97+
) -> Union[Vessel, None]:
4498
stmt = select(sql_model.Vessel).where(
4599
and_(
46100
sql_model.Vessel.tracking_activated == True,
47101
sql_model.Vessel.mmsi == mmsi
48102
)
49103
)
104+
if scd_enable:
105+
if scd_date:
106+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
107+
else:
108+
stmt=stmt.where(sql_model.Vessel.scd_active)
50109
vessel = session.execute(stmt).scalar()
51110
if not vessel:
52111
return None
53112
else:
54113
return VesselRepository.map_to_domain(vessel)
55114

56-
def get_vessels_list(self, session: Session) -> list[Vessel]:
115+
def get_vessels_list(self, session: Session,
116+
scd_date:Optional[datetime]=None,
117+
scd_enable:bool=True
118+
) -> list[Vessel]:
57119
"""
58120
Liste l'ensemble des vessels actifs
59121
"""
60122
stmt = select(sql_model.Vessel).where(sql_model.Vessel.tracking_activated == True)
123+
if scd_enable:
124+
if scd_date:
125+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
126+
else:
127+
stmt=stmt.where(sql_model.Vessel.scd_active)
61128
e = session.execute(stmt).scalars()
62129
if not e:
63130
return []
64131
return [VesselRepository.map_to_domain(vessel) for vessel in e]
65132

66-
def get_all_vessels_list(self, session: Session) -> list[Vessel]:
133+
def get_all_vessels_list(self,
134+
session: Session,
135+
scd_date:Optional[datetime]=None,
136+
scd_enable:bool=True
137+
) -> list[Vessel]:
67138
"""
68139
Liste l'ensemble des vessels actifs ou inactifs
69140
"""
70141
stmt = select(sql_model.Vessel)
142+
if scd_enable:
143+
if scd_date:
144+
stmt=stmt.where(between(scd_date,sql_model.Vessel.scd_start,sql_model.Vessel.scd_end))
145+
else:
146+
stmt=stmt.where(sql_model.Vessel.scd_active)
71147
e = session.execute(stmt).scalars()
72148

73149
if not e:
@@ -137,8 +213,10 @@ def get_vessel_times_in_zones( self,
137213

138214
return result
139215

140-
def batch_create_vessel(self, session: Session, vessels: list[Vessel]) -> list[Vessel]:
141-
orm_list = [VesselRepository.map_to_sql(port) for port in vessels]
216+
def batch_create_vessel(self, session: Session,
217+
vessels: list[Vessel]
218+
) -> list[Vessel]:
219+
orm_list = [VesselRepository.map_to_sql(vessel) for vessel in vessels]
142220
session.add_all(orm_list)
143221
return [VesselRepository.map_to_domain(orm) for orm in orm_list]
144222

@@ -187,12 +265,16 @@ def map_to_domain(sql_vessel: sql_model.Vessel) -> Vessel:
187265
details=sql_vessel.details,
188266
check=sql_vessel.check,
189267
length_class=sql_vessel.length_class,
268+
scd_start=sql_vessel.scd_start,
269+
scd_end=sql_vessel.scd_end,
270+
scd_active=sql_vessel.scd_active,
190271
)
191272

192273
@staticmethod
193274
def map_to_sql(vessel: Vessel) -> sql_model.Vessel:
194275
return sql_model.Vessel(
195276
id=vessel.id,
277+
key=vessel.key,
196278
mmsi=vessel.mmsi,
197279
ship_name=vessel.ship_name,
198280
width=vessel.width,
@@ -211,4 +293,7 @@ def map_to_sql(vessel: Vessel) -> sql_model.Vessel:
211293
details=vessel.details,
212294
check=vessel.check,
213295
length_class=vessel.length_class,
296+
scd_start=vessel.scd_start,
297+
scd_end=vessel.scd_end,
298+
scd_active=vessel.scd_active,
214299
)

backend/bloom/infra/repositories/repository_vessel_position.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ def create_vessel_position(self, session: Session, position: VesselPosition) ->
2323
session.add(orm_position)
2424
return VesselPositionRepository.map_to_domain(orm_position)
2525

26-
def batch_create_vessel_position(self, session: Session, vessel_positions: list[VesselPosition]) -> list[
26+
def batch_create_vessel_position(self,
27+
session: Session,
28+
vessel_positions: list[VesselPosition]
29+
) -> list[
2730
VesselPosition]:
2831
orm_list = [VesselPositionRepository.map_to_sql(vessel_position) for vessel_position in vessel_positions]
2932
session.add_all(orm_list)

0 commit comments

Comments
 (0)