
# Ukážka bez spustenia

`DryRun::generate()` vytvára ľuďom čitateľné príkazy SQL s hodnotami vloženými priamo do príkazu. Použite ho na kontrolu toho, čo by zlúčenie vykonalo, pred jeho použitím v databáze.

```php
use Merql\Apply\DryRun;

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

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

Ukážka obsahuje príkaz pre každú operáciu vo výsledku, zoskupenú rovnako, ako ich zoskupuje `Applier`: najprv vkladania, potom aktualizácie a nakoniec odstraňovania. Úplný výsledok zlúčenia obsahuje každú zmenu oboch strán vzhľadom na základ, teda všetky zmeny, ktoré by `Merql::apply()` vykonalo v databáze, v ktorej sa stále nachádza základ. Ak chcete zobraziť iba príkazy pre operácie, ktoré plánujete použiť, ukážte si náhľad [vybraného výsledku](https://merql.inline0.dev/sk/docs/merge/plans).

## Ukážka výstupu

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

Aktualizácie nastavujú každý nestotožňovací stĺpec zahrnutý v operácii, nielen zmenené stĺpce. Aktualizácia, ktorá by nenastavila žiadny stĺpec, sa vynechá.

## Formátovanie hodnôt

Všetky hodnoty sú uzavreté v jednoduchých úvodzovkách. Špeciálne znaky sa bezpečne zobrazia takto:

| Znak | Escapuje sa ako |
|---|---|
| `\` (spätná lomka) | `\\` |
| `'` (jednoduchá úvodzovka) | `''` |
| `\0` (nulový bajt) | `\0` |
| `\n` (nový riadok) | `\n` |
| `\r` (návrat vozíka) | `\r` |

Hodnoty NULL sa zobrazujú ako neuzatvorený literál `NULL`:

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

## Parametre

`DryRun::generate()` prijíma rovnaké parametre ako `SqlGenerator::generate()`:

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

| Parameter | Typ | Popis |
|---|---|---|
| `$result` | `MergeResult` | Výsledok zlúčenia, ktorého náhľad sa má zobraziť. |
| `$base` | `?Snapshot` | Základný snímok pre stĺpce identity. Ak chýba, použije sa `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Mapa závislostí cudzích kľúčov na určenie poradia. |
| `$driver` | `?Driver` | Databázový ovládač na uzatváranie identifikátorov do úvodzoviek. |

## Ukážka bez spustenia a SqlGenerator

`DryRun` obaluje `SqlGenerator`. Rozdiel:

- `SqlGenerator::generate()` vracia polia `['sql' => '...', 'params' => [...]]` určené na vykonávanie pripravených príkazov adaptérom.
- `DryRun::generate()` vracia ploché reťazce s vloženými hodnotami, určené na čítanie ľuďmi.

Nevykonávajte výstup ukážky bez spustenia ako SQL. Je naformátovaný na zobrazenie, nie na bezpečné vykonanie. Na vykonávanie zlúčení použite priamo `Applier` alebo `SqlGenerator` s pripravenými príkazmi.

## Použitie cez fasádu

Zachyťte výsledok zlúčenia cez fasádu a zobrazte jeho náhľad:

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

Alebo cez CLI s príznakom `--dry-run`:

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

CLI vypisuje príkazy bez poradia cudzích kľúčov a bez ovládača, takže identifikátory používa predvolené uzatváranie spätnými apostrofmi bez ohľadu na databázu. Základný snímok odovzdá pre stĺpce identity. Zlúčenie pracuje na úrovni stĺpcov, rovnako ako `Merql::merge()`.
