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--
 | 
						|
}
 |