
# Orezávanie stavov

Počas postupu workflow cez mnohé kroky môže nahromadený stav výrazne narásť. Orezávanie stavov automaticky odstraňuje staré výstupy krokov, aby sa stav udržal JSON v stanovených medziach a zároveň sa zachovali dôležité údaje.

## Zapnutie orezávania stavov

Zavolajte `prune_state_after()` na tvorbe workflow. Argument určuje počet nedávnych krokov, ktorých výstupy sa majú zachovať:

```php
use Queuety\Queuety;

Queuety::workflow( 'long_pipeline' )
    ->then( StepA::class )
    ->then( StepB::class )
    ->then( StepC::class )
    ->then( StepD::class )
    ->then( StepE::class )
    ->prune_state_after( 2 )
    ->dispatch( [ 'input' => $data ] );
```

Pri nastavení `prune_state_after( 2 )` sa po dokončení kroku D zo stavu odstránia výstupy krokov A a B. Kroky C a D, teda dva najnovšie, sa zachovajú.

## Ako funguje orezávanie

Keď je orezávanie stavov zapnuté, Queuety sleduje, ktoré kľúče pridáva každý krok do stavu, a ukladá ich do vyhradenej poľa `_step_outputs`. Po prechode na nový krok sa odstránia všetky kľúče pridané krokmi staršími než nastavený limit.

Napríklad pri nastavení `prune_state_after( 2 )`:

```
After step 0 (StepA): state has keys from StepA + initial payload
After step 1 (StepB): state has keys from StepA + StepB + initial payload
After step 2 (StepC): state has keys from StepA + StepB + StepC + initial payload
  -> prune: StepA output removed (only 2 most recent kept)
After step 3 (StepD): state has keys from StepB + StepC + StepD + initial payload
  -> prune: StepB output removed
```

## Čo sa zachováva

Queuety nikdy neorezáva vyhradené kľúče začínajúce sa na `_`, ako napríklad `_steps`, `_queue`, `_priority`, `_max_attempts`, `_on_cancel`, `_prune_state_after` a `_step_outputs`. Zachovajú sa aj kľúče počiatočného obsahu odovzdané pomocou `dispatch()`, pretože sa od začiatku nesledujú ako výstupy krokov. Okrem toho Queuety zachová N najnovších výstupov krokov podľa nastaveného limitu.

## Kedy ho použiť

Orezávanie stavov je užitočné pre workflow s mnohými krokmi, v ktorých každý krok vytvára údaje, ktoré neskoršie kroky v skutočnosti nepotrebujú. Typickým príkladom sú dlhé postupnosti, v ktorých každý krok potrebuje iba jeden či dva predchádzajúce výstupy, ETL workflow vytvárajúce objemné medzivýsledky a rekurzívne alebo opakujúce sa workflow, v ktorých by sa inak hromadil opakujúci sa stav. Ak má váš workflow iba niekoľko krokov alebo neskoršie kroky stále závisia od skorých výstupov, orezávanie pravdepodobne vôbec nepotrebujete.

## Predvolené správanie

Orezávanie stavov je predvolene vypnuté. Metóda `prune_state_after()` prijíma celočíselný argument. Ak ju zavoláte bez argumentu, predvolená hodnota je 2:

```php
->prune_state_after()     // keeps the 2 most recent step outputs
->prune_state_after( 5 )  // keeps the 5 most recent step outputs
```
