Merge pull request #64 from aguzererler/perf/lazy-load-portfolio-snapshot-8090947574151242031

 [performance] Lazy Load JSON Parsing for PortfolioSnapshot Holdings
This commit is contained in:
ahmet guzererler 2026-03-21 17:28:43 +01:00 committed by GitHub
commit e5be3f4676
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 12 additions and 6 deletions

View File

@ -275,9 +275,18 @@ class PortfolioSnapshot:
cash: float
equity_value: float
num_positions: int
holdings_snapshot: list[dict[str, Any]] = field(default_factory=list)
holdings_snapshot: list[dict[str, Any]] | str = field(default_factory=list)
metadata: dict[str, Any] = field(default_factory=dict)
def __getattribute__(self, name: str) -> Any:
if name == "holdings_snapshot":
val = object.__getattribute__(self, "holdings_snapshot")
if isinstance(val, str):
val = json.loads(val)
object.__setattr__(self, "holdings_snapshot", val)
return val
return object.__getattribute__(self, name)
def to_dict(self) -> dict[str, Any]:
"""Serialise all fields. ``holdings_snapshot`` is already a list[dict]."""
return {
@ -296,11 +305,8 @@ class PortfolioSnapshot:
def from_dict(cls, data: dict[str, Any]) -> "PortfolioSnapshot":
"""Deserialise from DB row or JSON dict.
``holdings_snapshot`` is parsed from a JSON string when needed.
``holdings_snapshot`` is parsed lazily on first access.
"""
holdings_snapshot = data.get("holdings_snapshot", [])
if isinstance(holdings_snapshot, str):
holdings_snapshot = json.loads(holdings_snapshot)
return cls(
snapshot_id=data["snapshot_id"],
portfolio_id=data["portfolio_id"],
@ -309,6 +315,6 @@ class PortfolioSnapshot:
cash=float(data["cash"]),
equity_value=float(data["equity_value"]),
num_positions=int(data["num_positions"]),
holdings_snapshot=holdings_snapshot,
holdings_snapshot=data.get("holdings_snapshot", []),
metadata=data.get("metadata") or {},
)