
# Prořezávání stavu

Jak workflow prochází mnoha kroky, nahromaděný stav může výrazně narůst. Automatické prořezávání stavu odstraňuje výstupy starých kroků, aby stav JSON zůstal omezený a přitom zachoval důležitá data.

## Zapnutí prořezávání stavu

Zavolejte `prune_state_after()` na builderu workflow. Argument určuje počet posledních kroků, jejichž výstup se má zachovat:

```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 ] );
```

Při `prune_state_after( 2 )` se po dokončení kroku D odstraní ze stavu výstupy kroků A a B. Kroky C a D (dva nejnovější) zůstanou zachovány.

## Jak prořezávání funguje

Když je prořezávání stavu zapnuté, Queuety sleduje, které klíče každý krok přidá do stavu, a ukládá je do vyhrazeného pole `_step_outputs`. Po přechodu na nový krok se odstraní klíče přidané kroky staršími, než určuje limit.

Například při `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
```

## Co zůstává zachováno

Queuety nikdy neprořezává vyhrazené klíče začínající na `_`, například `_steps`, `_queue`, `_priority`, `_max_attempts`, `_on_cancel`, `_prune_state_after` a `_step_outputs`. Zachovají se také klíče počátečních dat předaných do `dispatch()`, protože se od začátku nesledují jako výstupy kroků. Kromě toho Queuety ponechá N nejnovějších výstupů kroků podle nastaveného limitu.

## Kdy jej použít

Prořezávání stavu je užitečné u workflow s mnoha kroky, kde každý krok vytváří data, která pozdější kroky ve skutečnosti nepotřebují. Typickými příklady jsou dlouhé pipeline, v nichž každý krok potřebuje jen jeden nebo dva předchozí výstupy, ETL workflow vytvářející objemné mezistruktury a rekurzivní nebo opakující se workflow, která by jinak hromadila opakující se stav. Pokud má vaše workflow jen několik kroků nebo pozdější kroky stále závisí na výstupech z počátku, prořezávání nejspíš vůbec nepotřebujete.

## Výchozí chování

Prořezávání stavu je ve výchozím nastavení vypnuté. Metoda `prune_state_after()` přijímá celočíselný argument. Pokud ji zavoláte bez argumentu, použije se výchozí hodnota 2:

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