[CORE][Cache] Add getListPartialCache, which allows for fetching a list and backing only a portion of it in the cache (useful for feeds and replies to notes, for instance)
This commit is contained in:
		| @@ -317,6 +317,42 @@ abstract class Cache | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get a list partially from cache, partially from the DB | ||||
|      * | ||||
|      * Uses two fetches in the worst case, but the first is likely cached | ||||
|      * | ||||
|      * @param callable(int $limit, int $offset): (array<int,mixed>) $calculate | ||||
|      */ | ||||
|     public static function getListPartialCache(string $key, callable $calculate, int $max_cache_count, int $left, ?int $right = null, string $pool = 'default', float $beta = 1.0): array | ||||
|     { | ||||
|         if ($left < $max_cache_count) { | ||||
|             $middle         = $max_cache_count; | ||||
|             $cached_portion = self::getList( | ||||
|                 $key, | ||||
|                 fn () => $calculate(limit: $max_cache_count, offset: 0), | ||||
|                 pool: $pool, | ||||
|                 max_count: $max_cache_count, | ||||
|                 left: $left, | ||||
|                 right: $right, | ||||
|                 beta: $beta, | ||||
|             ); | ||||
|         } else { | ||||
|             $middle         = $left; | ||||
|             $cached_portion = []; | ||||
|         } | ||||
|  | ||||
|         $right ??= \PHP_INT_MAX; | ||||
|         $limit = $right - $middle; | ||||
|         if ($right > $max_cache_count) { | ||||
|             $non_cached_portion = $calculate(limit: $limit, offset: $middle); | ||||
|         } else { | ||||
|             $non_cached_portion = []; | ||||
|         } | ||||
|  | ||||
|         return [...$cached_portion, ...$non_cached_portion]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Push a value to the list | ||||
|      */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user