54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nulib\cache;
 | |
| 
 | |
| use Closure;
 | |
| use IteratorAggregate;
 | |
| use nulib\cache\CacheChannel;
 | |
| use nulib\cache\cache;
 | |
| use nulib\cl;
 | |
| use nulib\db\CapacitorChannel;
 | |
| use Traversable;
 | |
| 
 | |
| class CacheDataChannel extends CapacitorChannel implements IteratorAggregate {
 | |
|   const COLUMN_DEFINITIONS = [
 | |
|     "key" => "varchar(128) primary key not null",
 | |
|     "all_values" => "mediumtext",
 | |
|   ];
 | |
| 
 | |
|   function __construct($id, callable $builder, ?string $duration=null) {
 | |
|     $this->cacheIds = $cacheIds = CacheChannel::get_cache_ids($id);
 | |
|     $this->builder = Closure::fromCallable($builder);
 | |
|     $this->duration = $duration;
 | |
|     $name = "{$cacheIds["group_id"]}-{$cacheIds["id"]}";
 | |
|     parent::__construct($name);
 | |
|   }
 | |
| 
 | |
|   protected array $cacheIds;
 | |
| 
 | |
|   protected Closure $builder;
 | |
| 
 | |
|   protected ?string $duration = null;
 | |
| 
 | |
|   function getItemValues($item): ?array {
 | |
|     $key = array_keys($item)[0];
 | |
|     $row = $item[$key];
 | |
|     return [
 | |
|       "key" => $key,
 | |
|       "item" => $row,
 | |
|       "all_values" => implode(" ", cl::filter_n(cl::with($row))),
 | |
|     ];
 | |
|   }
 | |
| 
 | |
|   function getIterator(): Traversable {
 | |
|     $cm = cache::get();
 | |
|     if ($cm->shouldUpdate($this->cacheIds)) {
 | |
|       $this->capacitor->reset();
 | |
|       foreach (($this->builder)() as $key => $row) {
 | |
|         $this->charge([$key => $row]);
 | |
|       }
 | |
|       $cm->setCached($this->cacheIds, $this->duration);
 | |
|     }
 | |
|     return $this->discharge(false);
 | |
|   }
 | |
| }
 |