
# Previzualizare de simulare

`DryRun::generate()` generează instrucțiuni SQL ușor de citit, cu valorile inserate direct. Folosiți-l pentru a verifica ce ar face o îmbinare înainte de a o aplica bazei de date.

```php
use Merql\Apply\DryRun;

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

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

Previzualizarea conține câte o instrucțiune pentru fiecare operație din rezultat, grupate așa cum le grupează `Applier`: inserări, apoi actualizări, apoi ștergeri. Pentru rezultatul complet al unei îmbinări, sunt incluse toate modificările ambelor părți față de bază, adică exact ce ar executa `Merql::apply()` asupra unei baze de date care încă păstrează baza. Previzualizați un [rezultat selectat](https://merql.inline0.dev/ro/docs/merge/plans) pentru a vedea doar instrucțiunile operațiilor pe care intenționați să le aplicați.

## Exemplu de ieșire

```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';
```

Actualizările setează fiecare coloană care nu este de identitate și pe care o conține operația, nu doar coloanele modificate; o actualizare care nu ar seta nicio coloană este omisă.

## Formatarea valorilor

Toate valorile sunt încadrate între ghilimele simple. Caracterele speciale sunt escape-uite pentru afișare sigură:

| Caracter | Reprezentare escape-uită |
|---|---|
| `\` (bară oblică inversă) | `\\` |
| `'` (ghilimea simplă) | `''` |
| `\0` (octet null) | `\0` |
| `\n` (linie nouă) | `\n` |
| `\r` (retur de car) | `\r` |

Valorile NULL sunt afișate ca literalul neîncadrat în ghilimele `NULL`:

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

## Parametri

`DryRun::generate()` acceptă aceiași parametri ca `SqlGenerator::generate()`:

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

| Parametru | Tip | Descriere |
|---|---|---|
| `$result` | `MergeResult` | Rezultatul îmbinării de previzualizat. |
| `$base` | `?Snapshot` | Instantaneul de bază pentru coloanele de identitate. În lipsă, se folosește `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Harta dependențelor dintre cheile străine, folosită pentru ordonare. |
| `$driver` | `?Driver` | Driverul bazei de date pentru citarea identificatorilor. |

## Rulare de probă vs SqlGenerator

`DryRun` învelește `SqlGenerator`. Diferența:

Nu executați rezultatul simulării ca `SqlGenerator::generate()`. Este formatat pentru afișare, nu pentru executare sigură. Pentru a executa îmbinări, folosiți direct `['sql' => '...', 'params' => [...]]` sau `DryRun::generate()` cu instrucțiuni pregătite.

Nu executați rezultatul rulării de probă ca SQL. Este formatat pentru afișare, nu pentru execuție sigură. Pentru a executa îmbinări, folosiți direct `Applier` sau `SqlGenerator` cu instrucțiuni pregătite.

## Utilizarea fațadei

Prin fațadă, capturați rezultatul unei îmbinări și previzualizați-l:

```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";
}
```

CLI afișează instrucțiunile fără ordonarea după chei străine sau un driver, așa că identificatorii folosesc citarea implicită cu backtick-uri, indiferent de baza de date. Transmite instantaneea de bază pentru coloanele de identitate. Îmbinarea sa operează la nivel de coloană, la fel ca `--dry-run`.

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

CLI afișează instrucțiunile fără ordonarea cheilor străine sau un driver, așa că identificatorii folosesc citarea implicită cu backtick-uri, indiferent de baza de date. Transmite instantaneul de bază pentru coloanele de identitate. Îmbinarea sa este la nivel de coloană, la fel ca `Merql::merge()`.
