
# Olekute kärpimine

Kui töövoog läbib palju etappe, võib kogunenud olek suureks kasvada. Olekute kärpimine eemaldab automaatselt vanad etappide väljundid, et oleku JSON maht püsiks piiratud, säilitades samal ajal olulised andmed.

## Olekute kärpimise lubamine

Kutsuge töövoo koostajal välja `prune_state_after()`. Argumendiga määratakse, mitme viimase etapi väljundit säilitada:

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

Kui kasutusel on `prune_state_after( 2 )`, eemaldatakse pärast D-etapi lõpetamist olekust A- ja B-etapi väljundid. C- ja D-etapp (kaks viimast) säilivad.

## Kuidas kärpimine töötab

Kui olekute kärpimine on lubatud, jälgib Queuety iga etapi olekusse lisatud võtmeid reserveeritud massiivis `_step_outputs`. Uuele etapile liikudes eemaldatakse kõik võtmed, mille lisasid läve ületavalt vanad etapid.

Näiteks väärtusega `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
```

## Mis säilib

Queuety ei kärbi kunagi reserveeritud võtmeid, mis algavad prefiksiga `_`, näiteks `_steps`, `_queue`, `_priority`, `_max_attempts`, `_on_cancel`, `_prune_state_after` ja `_step_outputs`. Ka `dispatch()`-ile edastatud algse payload’i võtmed säilivad, sest neid ei jälgita algusest peale etappide väljunditena. Lisaks säilitab Queuety seadistatud läve järgi N viimase etapi väljundit.

## Millal seda kasutada

Olekute kärpimine on kasulik paljude etappidega töövoogudes, kus iga etapp toodab andmeid, mida hilisemad etapid tegelikult ei vaja. Tüüpilised näited on pikad töötlusahelad, kus iga etapp vajab vaid ühe või kahe eelmise etapi väljundit, mahukaid vaheandmestruktuure loovad ETL-töövood ning rekursiivsed või korduvad töövood, mis muidu koguksid korduvat olekut. Kui teie töövoos on vaid mõni etapp või kui hilisemad etapid sõltuvad endiselt varasematest väljunditest, pole kärpimist tõenäoliselt vaja.

## Vaikekäitumine

Olekute kärpimine on vaikimisi keelatud. Meetod `prune_state_after()` võtab täisarvulise argumendi. Ilma argumendita kutsudes on vaikeväärtus 2:

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