
# 状態の整理

ワークフローのステップが増えるにつれて、蓄積された状態データは大きくなることがあります。状態の整理では、重要なデータを保持しながら、古いステップの出力を自動的に削除して状態をJSON以内に保ちます。

## 状態の整理を有効にする

ワークフロービルダーで`prune_state_after()`を呼び出します。引数には、出力を保持する直近のステップ数を指定します。

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

`prune_state_after( 2 )`を設定すると、ステップDの完了後に、ステップAとBの出力が状態から削除されます。直近の2つであるステップCとDは保持されます。

## 整理の仕組み

状態の整理を有効にすると、Queuetyは各ステップが状態に追加するキーを、予約済みの`_step_outputs`配列で追跡します。次のステップへ進むとき、しきい値より古いステップが追加したキーは削除されます。

例として、`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
```

## 保持されるデータ

Queuetyは、`_`で始まる予約済みキー（`_steps`、`_queue`、`_priority`、`_max_attempts`、`_on_cancel`、`_prune_state_after`、`_step_outputs`など）を削除しません。`dispatch()`に渡された初期ペイロードのキーも、ステップ出力として追跡されないため保持されます。それ以外では、Queuetyは設定したしきい値に従って、直近Nステップ分の出力を保持します。

## 使用する場面

状態の整理は、各ステップが後続ステップで不要なデータを生成する、多数のステップを含むワークフローで役立ちます。たとえば、各ステップで直前の1つか2つの出力だけを使う長いパイプライン、大きな中間データを生成するETLワークフロー、整理しないと同じ状態が繰り返し蓄積される再帰型または反復型ワークフローです。ステップが少ない場合や、後半のステップが初期の出力に依存する場合は、整理する必要はないでしょう。

## デフォルトの動作

状態の整理はデフォルトで無効です。`prune_state_after()`メソッドは整数の引数を受け取ります。引数なしで呼び出すと、デフォルトの2が使われます。

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