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:
commit
e5be3f4676
|
|
@ -275,9 +275,18 @@ class PortfolioSnapshot:
|
||||||
cash: float
|
cash: float
|
||||||
equity_value: float
|
equity_value: float
|
||||||
num_positions: int
|
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)
|
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]:
|
def to_dict(self) -> dict[str, Any]:
|
||||||
"""Serialise all fields. ``holdings_snapshot`` is already a list[dict]."""
|
"""Serialise all fields. ``holdings_snapshot`` is already a list[dict]."""
|
||||||
return {
|
return {
|
||||||
|
|
@ -296,11 +305,8 @@ class PortfolioSnapshot:
|
||||||
def from_dict(cls, data: dict[str, Any]) -> "PortfolioSnapshot":
|
def from_dict(cls, data: dict[str, Any]) -> "PortfolioSnapshot":
|
||||||
"""Deserialise from DB row or JSON dict.
|
"""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(
|
return cls(
|
||||||
snapshot_id=data["snapshot_id"],
|
snapshot_id=data["snapshot_id"],
|
||||||
portfolio_id=data["portfolio_id"],
|
portfolio_id=data["portfolio_id"],
|
||||||
|
|
@ -309,6 +315,6 @@ class PortfolioSnapshot:
|
||||||
cash=float(data["cash"]),
|
cash=float(data["cash"]),
|
||||||
equity_value=float(data["equity_value"]),
|
equity_value=float(data["equity_value"]),
|
||||||
num_positions=int(data["num_positions"]),
|
num_positions=int(data["num_positions"]),
|
||||||
holdings_snapshot=holdings_snapshot,
|
holdings_snapshot=data.get("holdings_snapshot", []),
|
||||||
metadata=data.get("metadata") or {},
|
metadata=data.get("metadata") or {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue