
# Vorschau für Probelauf

`DryRun::generate()` erzeugt menschenlesbare SQL-Anweisungen mit direkt eingefügten Werten. Damit kannst du prüfen, was eine Zusammenführung bewirken würde, bevor du sie auf die Datenbank anwendest.

```php
use Merql\Apply\DryRun;

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

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

Die Vorschau enthält für jede Operation im Ergebnis eine Anweisung, gruppiert wie von
`Applier`: zuerst Einfügungen, dann Aktualisierungen, dann Löschungen. Das vollständige
Ergebnis einer Zusammenführung umfasst alle Änderungen beider Seiten gegenüber der Basis,
also genau das, was `Merql::apply()` in einer Datenbank ausführen würde, die noch den
Basiszustand enthält. Zeige eine [ausgewählte Ergebnisversion](https://merql.inline0.dev/de/docs/merge/plans) an, um nur die Anweisungen
für die geplanten Operationen zu sehen.

## Beispielausgabe

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

Aktualisierungen setzen alle Nicht-Identitätsspalten, die die Operation enthält, nicht nur die
geänderten. Eine Aktualisierung, die keine Spalte setzen würde, wird ausgelassen.

## Formatierung der Werte

Alle Werte stehen in einfachen Anführungszeichen. Sonderzeichen werden für eine sichere Anzeige maskiert:

| Zeichen | Maskiert als |
|---|---|
| `\` (Backslash) | `\\` |
| `'` (einfaches Anführungszeichen) | `''` |
| `\0` (Nullbyte) | `\0` |
| `\n` (Zeilenumbruch) | `\n` |
| `\r` (Wagenrücklauf) | `\r` |

NULL-Werte werden als unquoted Literal `NULL` dargestellt:

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

## Parameter

`DryRun::generate()` akzeptiert dieselben Parameter wie `SqlGenerator::generate()`:

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

| Parameter | Typ | Beschreibung |
|---|---|---|
| `$result` | `MergeResult` | Das Ergebnis der Zusammenführung für die Vorschau. |
| `$base` | `?Snapshot` | Basis-Snapshot für Identitätsspalten. Fällt auf `$result->baseSnapshot()` zurück. |
| `$fkDependencies` | `array` | Abbildung der Fremdschlüsselabhängigkeiten für die Reihenfolge. |
| `$driver` | `?Driver` | Datenbanktreiber zum Maskieren von Bezeichnern. |

## Probelauf und SqlGenerator

`DryRun` umschließt `SqlGenerator`. Der Unterschied:

- `SqlGenerator::generate()` gibt `['sql' => '...', 'params' => [...]]`-Arrays für die Ausführung mit vorbereiteten Adapter-Anweisungen zurück.
- `DryRun::generate()` gibt flache Zeichenfolgen mit eingefügten Werten zurück, die für Menschen lesbar sind.

Führe die Ausgabe des Probelaufs nicht als SQL aus. Sie ist für die Anzeige formatiert, nicht für eine sichere Ausführung. Verwende zum Ausführen von Zusammenführungen direkt `Applier` oder `SqlGenerator` mit vorbereiteten Anweisungen.

## Mit der Fassade verwenden

Erfasse über die Fassade ein Zusammenführungsergebnis und zeige eine Vorschau an:

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

Oder über CLI mit dem Flag `--dry-run`:

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

CLI gibt die Anweisungen ohne Fremdschlüsselreihenfolge oder Treiber aus. Daher werden
Bezeichner unabhängig von der Datenbank standardmäßig mit Backticks maskiert. Die
Basis-Snapshot wird für Identitätsspalten übergeben. Die Zusammenführung erfolgt auf Spaltenebene wie bei
`Merql::merge()`.
