modifs.mineures sans commentaires
This commit is contained in:
		
							parent
							
								
									8079d111cc
								
							
						
					
					
						commit
						94d6d5cf3e
					
				
							
								
								
									
										72
									
								
								src/cache/CacheChannel.php
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								src/cache/CacheChannel.php
									
									
									
									
										vendored
									
									
								
							| @ -10,19 +10,6 @@ use nulib\php\func; | ||||
| use Traversable; | ||||
| 
 | ||||
| class CacheChannel extends CapacitorChannel implements IteratorAggregate { | ||||
|   const NAME = "cache"; | ||||
|   const TABLE_NAME = "cache"; | ||||
| 
 | ||||
|   const COLUMN_DEFINITIONS = [ | ||||
|     "group_id" => "varchar(32) not null", // groupe de curseur
 | ||||
|     "id" => "varchar(128) not null", // nom du curseur
 | ||||
|     "key_index" => "integer not null", | ||||
|     "key" => "varchar(128) not null", | ||||
|     "search" => "varchar(255)", | ||||
| 
 | ||||
|     "primary key (group_id, id, key_index)", | ||||
|   ]; | ||||
| 
 | ||||
|   static function with(?iterable $rows=null, $cursorId=null, ?CapacitorStorage $storage=null): self { | ||||
|     $storage ??= cache::storage(); | ||||
|     $channel = (new static($cursorId))->initStorage($storage); | ||||
| @ -30,23 +17,53 @@ class CacheChannel extends CapacitorChannel implements IteratorAggregate { | ||||
|     return $channel; | ||||
|   } | ||||
| 
 | ||||
|   const NAME = "cache"; | ||||
|   const TABLE_NAME = "cache"; | ||||
| 
 | ||||
|   const COLUMN_DEFINITIONS = [ | ||||
|     "group_id_" => "varchar(32) not null", // groupe de curseur
 | ||||
|     "id_" => "varchar(128) not null", // nom du curseur
 | ||||
|     "key_index_" => "integer not null", | ||||
|     "key_" => "varchar(128) not null", | ||||
|     "search_" => "varchar(255)", | ||||
| 
 | ||||
|     "primary key (group_id_, id_, key_index_)", | ||||
|   ]; | ||||
| 
 | ||||
|   const ADD_COLUMNS = null; | ||||
| 
 | ||||
|   protected function COLUMN_DEFINITIONS(): ?array { | ||||
|     return cl::merge(self::COLUMN_DEFINITIONS, static::ADD_COLUMNS); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * @param array|string $cursorId | ||||
|    */ | ||||
|   function __construct($cursorId) { | ||||
|     parent::__construct(); | ||||
|     cache::verifix_id($cursorId); | ||||
|     $this->cursorId = $cursorId; | ||||
|     [ | ||||
|       "group_id" => $this->groupId, | ||||
|       "id" => $this->id, | ||||
|     ] = $cursorId; | ||||
|   } | ||||
| 
 | ||||
|   protected array $cursorId; | ||||
|   protected string $groupId; | ||||
| 
 | ||||
|   protected string $id; | ||||
| 
 | ||||
|   function getCursorId(): array { | ||||
|     return $this->cursorId; | ||||
|     return [ | ||||
|       "group_id" => $this->groupId, | ||||
|       "id" => $this->id, | ||||
|     ]; | ||||
|   } | ||||
| 
 | ||||
|   function getBaseFilter(): ?array { | ||||
|     return $this->cursorId; | ||||
|     return [ | ||||
|       "group_id_" => $this->groupId, | ||||
|       "id_" => $this->id, | ||||
|     ]; | ||||
|   } | ||||
| 
 | ||||
|   protected int $index = 0; | ||||
| @ -61,10 +78,17 @@ class CacheChannel extends CapacitorChannel implements IteratorAggregate { | ||||
|     $index = $this->index++; | ||||
|     $key = $key ?? $index; | ||||
|     $key = substr(strval($key), 0, 128); | ||||
|     return cl::merge($this->cursorId, [ | ||||
|       "key_index" => $index, | ||||
|       "key" => $key, | ||||
|       "search" => $this->getSearch($item), | ||||
|     $addColumns = static::ADD_COLUMNS ?? []; | ||||
|     $addColumns = cl::select($item, | ||||
|       array_filter(array_keys($addColumns), function ($key) { | ||||
|         return is_string($key); | ||||
|       })); | ||||
|     return cl::merge($addColumns, [ | ||||
|       "group_id_" => $this->groupId, | ||||
|       "id_" => $this->id, | ||||
|       "key_index_" => $index, | ||||
|       "key_" => $key, | ||||
|       "search_" => $this->getSearch($item), | ||||
|     ]); | ||||
|   } | ||||
| 
 | ||||
| @ -85,18 +109,18 @@ class CacheChannel extends CapacitorChannel implements IteratorAggregate { | ||||
|   } | ||||
| 
 | ||||
|   function build(?iterable $items): self { | ||||
|     $this->reset(true); | ||||
|     $this->delete(null); | ||||
|     $this->chargeAll($items); | ||||
|     return $this; | ||||
|   } | ||||
| 
 | ||||
|   function getIterator(): Traversable { | ||||
|     $rows = $this->dbAll([ | ||||
|       "cols" => ["key", "item__"], | ||||
|       "cols" => ["key_", "item__"], | ||||
|       "where" => $this->getBaseFilter(), | ||||
|     ]); | ||||
|     foreach ($rows as $row) { | ||||
|       $key = $row["key"]; | ||||
|       $key = $row["key_"]; | ||||
|       $item = $this->unserialize($row["item__"]); | ||||
|       yield $key => $item; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										6
									
								
								src/cache/TODO.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								src/cache/TODO.md
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +0,0 @@ | ||||
| # nulib\cache | ||||
| 
 | ||||
| * CacheChannel | ||||
|   * spécifier des clés supplémentaires utilisable dans la recherche | ||||
| 
 | ||||
| -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary | ||||
							
								
								
									
										4
									
								
								src/cache/cache.php
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								src/cache/cache.php
									
									
									
									
										vendored
									
									
								
							| @ -64,14 +64,14 @@ class cache { | ||||
| 
 | ||||
|   static function get(callable $compute, $dataId=null, ?string $file=null) { | ||||
|     self::verifix_id($dataId); | ||||
|     $file ??= "{$dataId["group_id"]}-{$dataId["id"]}"; | ||||
|     $file ??= "{$dataId["group_id"]}_{$dataId["id"]}"; | ||||
|     $noCache = !self::should_cache($dataId["id"], $dataId["group_id"]); | ||||
|     return CacheFile::with($compute, $file)->get(null, $noCache); | ||||
|   } | ||||
| 
 | ||||
|   static function all(?iterable $rows, $cursorId=null, ?string $file=null): iterable { | ||||
|     self::verifix_id($cursorId); | ||||
|     $file ??= "{$cursorId["group_id"]}-{$cursorId["id"]}--rows"; | ||||
|     $file ??= "{$cursorId["group_id"]}_{$cursorId["id"]}_rows"; | ||||
|     $ccursorId = new CacheFile($file, function() use ($rows, $cursorId) { | ||||
|       CacheChannel::with(null, $cursorId)->build($rows); | ||||
|       return $cursorId; | ||||
|  | ||||
							
								
								
									
										2
									
								
								tests/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| *.db* | ||||
| *.cache | ||||
							
								
								
									
										2
									
								
								tests/cache/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								tests/cache/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +0,0 @@ | ||||
| /*.db* | ||||
| /*.cache | ||||
							
								
								
									
										38
									
								
								tests/cache/CacheChannelTest.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								tests/cache/CacheChannelTest.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| <?php | ||||
| namespace nulib\cache; | ||||
| 
 | ||||
| use nulib\output\msg; | ||||
| 
 | ||||
| class CacheChannelTest extends _TestCase { | ||||
|   const DATA = [ | ||||
|     "fr" => ["a" => "un", "b" => "deux"], | ||||
|     "eng" => ["a" => "one", "b" => "two"], | ||||
|     ["a" => 1, "b" => 2], | ||||
|   ]; | ||||
| 
 | ||||
|   function testUsage() { | ||||
|     $channel = CacheChannel::with(self::DATA, "numbers", self::$storage); | ||||
|     $count = 0; | ||||
|     foreach ($channel as $key => $item) { | ||||
|       msg::info("one: $key => {$item["a"]}"); | ||||
|       $count++; | ||||
|     } | ||||
|     self::assertSame(3, $count); | ||||
|   } | ||||
| 
 | ||||
|   function testAddColumns() { | ||||
|     $channel = (new class("numbers") extends CacheChannel { | ||||
|       const NAME = "numbersac"; | ||||
|       const TABLE_NAME = self::NAME; | ||||
|       const ADD_COLUMNS = [ | ||||
|         "a" => "varchar(30)", | ||||
|       ]; | ||||
|     })->initStorage(self::$storage)->build(self::DATA); | ||||
|     $count = 0; | ||||
|     foreach ($channel as $key => $item) { | ||||
|       msg::info("one: $key => {$item["a"]}"); | ||||
|       $count++; | ||||
|     } | ||||
|     self::assertSame(3, $count); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										22
									
								
								tests/cache/CursorChannelTest.php
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								tests/cache/CursorChannelTest.php
									
									
									
									
										vendored
									
									
								
							| @ -1,22 +0,0 @@ | ||||
| <?php | ||||
| namespace nulib\cache; | ||||
| 
 | ||||
| use nulib\output\msg; | ||||
| 
 | ||||
| class CursorChannelTest extends _TestCase { | ||||
|   function testUsage() { | ||||
|     $data = [ | ||||
|       "fr" => ["a" => "un", "b" => "deux"], | ||||
|       "eng" => ["a" => "one", "b" => "two"], | ||||
|       ["a" => 1, "b" => 2], | ||||
|     ]; | ||||
| 
 | ||||
|     $channel = CacheChannel::with($data, "numbers", self::$storage); | ||||
|     $count = 0; | ||||
|     foreach ($channel as $key => $item) { | ||||
|       msg::info("one: $key => {$item["a"]}"); | ||||
|       $count++; | ||||
|     } | ||||
|     self::assertSame(3, $count); | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user