cache_invalidation.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. @dataclass(frozen=True)
  4. class CacheDependency:
  5. cache_key_hash: str
  6. point_key: str
  7. business_domain_uid: str | None
  8. generation: int
  9. @dataclass(frozen=True)
  10. class CacheInvalidationPlan:
  11. cache_key_hashes: frozenset[str]
  12. business_domains_to_flush: frozenset[str]
  13. def plan_cache_invalidation(
  14. dependencies: list[CacheDependency],
  15. *,
  16. changed_point_keys: set[str],
  17. impacted_point_keys: set[str],
  18. dependency_metadata_complete: bool = True,
  19. affected_business_domains: set[str] | None = None,
  20. ) -> CacheInvalidationPlan:
  21. affected_points = changed_point_keys | impacted_point_keys
  22. cache_keys = frozenset(
  23. dependency.cache_key_hash
  24. for dependency in dependencies
  25. if dependency.point_key in affected_points
  26. )
  27. domains = frozenset()
  28. if not dependency_metadata_complete:
  29. domains = frozenset(affected_business_domains or ())
  30. return CacheInvalidationPlan(
  31. cache_key_hashes=cache_keys,
  32. business_domains_to_flush=domains,
  33. )