146 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\item;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\b\params\Tparametrable;
 | |
| use nur\b\ValueException;
 | |
| use nur\mapper\base\capacitor\Capacitor;
 | |
| use nur\mapper\base\Mapper;
 | |
| use Traversable;
 | |
| 
 | |
| /**
 | |
|  * Class StreamMapper: un mapper qui fait des opérations sur le flux
 | |
|  *
 | |
|  * --autogen-properties-and-methods--
 | |
|  * @method string setAction(string $value)
 | |
|  * @method int setMaxCount(int $value)
 | |
|  */
 | |
| class StreamMapper extends Mapper {
 | |
|   use Tparametrable;
 | |
| 
 | |
|   const MAP_EOF = true;
 | |
| 
 | |
|   /** @var Capacitor */
 | |
|   protected $capacitor;
 | |
| 
 | |
|   function setCapacitor(Capacitor $capacitor): self {
 | |
|     $this->capacitor = $capacitor;
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   protected function capacitor(): Capacitor {
 | |
|     if ($this->capacitor === null) $this->capacitor = new Capacitor();
 | |
|     return $this->capacitor;
 | |
|   }
 | |
| 
 | |
|   const ACTION_SPLIT = "split";
 | |
|   const ACTION_JOIN = "join";
 | |
| 
 | |
|   const PARAMETRABLE_PARAMS_SCHEMA = [
 | |
|     "action" => ["string", null, "action à effectuer sur le flux"],
 | |
|     "max_count" => ["int", null, "nombre d'élément par batch"],
 | |
|   ];
 | |
| 
 | |
|   /** @var string */
 | |
|   protected $ppAction;
 | |
| 
 | |
|   /** @var int */
 | |
|   protected $ppMaxCount = 0;
 | |
| 
 | |
|   function pp_setAction(?string $action, ?int $maxCount=null): void {
 | |
|     switch ($action) {
 | |
|     case "split":
 | |
|     case "s":
 | |
|       $this->ppAction = self::ACTION_SPLIT;
 | |
|       break;
 | |
|     case "join":
 | |
|     case "j":
 | |
|       $this->ppAction = self::ACTION_JOIN;
 | |
|       $this->count = 0;
 | |
|       break;
 | |
|     default:
 | |
|       if ($action !== null) {
 | |
|         throw ValueException::invalid_value($action, "action");
 | |
|       }
 | |
|     }
 | |
|     if ($maxCount !== null) $this->ppMaxCount = $maxCount;
 | |
|   }
 | |
| 
 | |
|   function setActionSplit(): self {
 | |
|     $this->pp_setAction("split");
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   function setActionJoin(?int $maxCount=null): self {
 | |
|     $this->pp_setAction("join", $maxCount);
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   function pp_setMaxCount(int $maxCount): self {
 | |
|     $this->pp_setAction(null, $maxCount);
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   protected $count;
 | |
| 
 | |
|   function mapper($item) {
 | |
|     switch ($this->ppAction) {
 | |
|     case self::ACTION_SPLIT:
 | |
|       if (!is_iterable($item)) $item = A::with($item);
 | |
|       return $this->mapTo($item);
 | |
|     case self::ACTION_JOIN:
 | |
|       if (!$this->eof) $this->capacitor()->charge($item);
 | |
|       $this->count++;
 | |
|       $discharge = $this->ppMaxCount > 0 && $this->count >= $this->ppMaxCount;
 | |
|       if ($discharge || $this->eof) {
 | |
|         $values = $this->capacitor()->discharge();
 | |
|         $this->count = 0;
 | |
|         if ($values instanceof Traversable) $values = iterator_to_array($values);
 | |
|         $item = $values? [$values]: null;
 | |
|       } else {
 | |
|         $item = null;
 | |
|       }
 | |
|       return $this->mapTo($item);
 | |
|     }
 | |
|     return $item;
 | |
|   }
 | |
| 
 | |
|   #############################################################################
 | |
|   const _AUTOGEN_CONSTS = [
 | |
|     "" => [self::class, "_autogen_consts"],
 | |
|   ];
 | |
|   const _AUTOGEN_LITERALS = /*autogen*/[
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '\\nur\\b\\params\\parametrable_utils::class',
 | |
|     ],
 | |
|     [
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       'self::PARAMETRABLE_PARAMS_SCHEMA',
 | |
|     ],
 | |
|   ];
 | |
|   const _AUTOGEN_METHODS = /*autogen*/[
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '_autogen_methods_getters',
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       null,
 | |
|     ],
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '_autogen_methods_setters',
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       null,
 | |
|     ],
 | |
|   ];
 | |
|   const _AUTO_GETTERS = /*autogen*/[
 | |
|     'getAction' => 'action',
 | |
|     'getMaxCount' => 'max_count',
 | |
|   ];
 | |
|   const _AUTO_SETTERS = /*autogen*/[
 | |
|     'setAction' => 'action',
 | |
|     'setMaxCount' => 'max_count',
 | |
|   ];
 | |
|   #--autogen-dynamic--
 | |
| }
 |