
# Anteprima dell'esecuzione simulata

`DryRun::generate()` produce istruzioni SQL leggibili con i valori interpolati direttamente. Usalo per controllare cosa farebbe un'unione prima di applicarla al database.

```php
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

L'anteprima contiene un'istruzione per ogni operazione del risultato, raggruppate come fa `Applier`: prima gli inserimenti, poi gli aggiornamenti e infine le eliminazioni. Per il risultato completo di un'unione, comprende tutte le modifiche di entrambi i lati rispetto alla base, ossia quelle che `Merql::apply()` eseguirebbe su un database che conserva ancora la base. Visualizza in anteprima un [risultato selezionato](https://merql.inline0.dev/it/docs/merge/plans) per vedere solo le istruzioni relative alle operazioni che intendi applicare.

## Esempio di output

```sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';
```

Gli aggiornamenti impostano ogni colonna non d'identità inclusa nell'operazione, non solo quelle modificate; gli aggiornamenti che non imposterebbero alcuna colonna vengono omessi.

## Formattazione dei valori

Tutti i valori sono racchiusi tra apici singoli. I caratteri speciali vengono sottoposti a escape per una visualizzazione sicura:

| Carattere | Forma con escape |
|---|---|
| `\` (barra rovesciata) | `\\` |
| `'` (apice singolo) | `''` |
| `\0` (byte nullo) | `\0` |
| `\n` (nuova riga) | `\n` |
| `\r` (ritorno a capo) | `\r` |

I valori NULL vengono rappresentati con il letterale non racchiuso tra virgolette `NULL`:

```sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
```

## Parametri

`DryRun::generate()` accetta gli stessi parametri di `SqlGenerator::generate()`:

```php
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
```

| Parametro | Tipo | Descrizione |
|---|---|---|
| `$result` | `MergeResult` | Il risultato della fusione da visualizzare in anteprima. |
| `$base` | `?Snapshot` | Snapshot di base per le colonne di identità. In mancanza, viene usato `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Mappa delle dipendenze delle chiavi esterne per l'ordinamento. |
| `$driver` | `?Driver` | Driver del database per la corretta quotatura degli identificatori. |

## Esecuzione di prova e SqlGenerator

`DryRun` usa `SqlGenerator` come wrapper. La differenza è la seguente:

- `SqlGenerator::generate()` restituisce array `['sql' => '...', 'params' => [...]]` destinati all'esecuzione con prepared statement dell'adapter.
- `DryRun::generate()` restituisce stringhe semplici con i valori incorporati, destinate alla lettura da parte delle persone.

Non eseguite l'output dell'esecuzione di prova come SQL. È formattato per la visualizzazione, non per un'esecuzione sicura. Per eseguire le fusioni, usate direttamente `Applier` o `SqlGenerator` con prepared statement.

## Uso con la facciata

Tramite la facciata, acquisite il risultato della fusione e visualizzatene l'anteprima:

```php
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

Oppure da CLI con il flag `--dry-run`:

```bash
vendor/bin/merql merge base ours theirs --dry-run
```

CLI stampa le istruzioni senza ordinamento per chiave esterna né driver, quindi
usa la quotatura predefinita con backtick per gli identificatori, indipendentemente dal database. Passa lo snapshot di base per le colonne di identità. La fusione opera a livello di colonna, come
`Merql::merge()`.
