from __future__ import annotations from dataclasses import dataclass @dataclass(frozen=True) class CacheDependency: cache_key_hash: str point_key: str business_domain_uid: str | None generation: int @dataclass(frozen=True) class CacheInvalidationPlan: cache_key_hashes: frozenset[str] business_domains_to_flush: frozenset[str] def plan_cache_invalidation( dependencies: list[CacheDependency], *, changed_point_keys: set[str], impacted_point_keys: set[str], dependency_metadata_complete: bool = True, affected_business_domains: set[str] | None = None, ) -> CacheInvalidationPlan: affected_points = changed_point_keys | impacted_point_keys cache_keys = frozenset( dependency.cache_key_hash for dependency in dependencies if dependency.point_key in affected_points ) domains = frozenset() if not dependency_metadata_complete: domains = frozenset(affected_business_domains or ()) return CacheInvalidationPlan( cache_key_hashes=cache_keys, business_domains_to_flush=domains, )