
# Náhled nanečisto

`DryRun::generate()` vytváří čitelné příkazy SQL s vloženými hodnotami. Pomocí něj můžete zkontrolovat, co by sloučení provedlo, než ho použijete na databázi.

```php
use Merql\Apply\DryRun;

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

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

Náhled obsahuje příkaz pro každou operaci ve výsledku, seskupené stejně jako v `Applier`: nejprve vložení, pak aktualizace a nakonec odstranění. Úplný výsledek sloučení zahrnuje všechny změny obou stran vůči základu, tedy všechny změny, které by `Merql::apply()` provedl v databázi, jež stále obsahuje základ. Chcete-li zobrazit náhled [vybraného výsledku](https://merql.inline0.dev/cs/docs/merge/plans), uvidíte pouze příkazy pro operace, které plánujete použít.

## Ukázkový výstup

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

Aktualizace nastaví všechny sloupce nesloužící k určení identity, které operace obsahuje, nikoli pouze změněné sloupce. Aktualizace, která by nenastavila žádný sloupec, se vynechá.

## Formátování hodnot

Všechny hodnoty jsou uzavřeny v jednoduchých uvozovkách. Speciální znaky jsou kvůli bezpečnému zobrazení escapovány:

| Znak | Escapován jako |
|---|---|
| `\` (zpětné lomítko) | `\\` |
| `'` (jednoduchá uvozovka) | `''` |
| `\0` (nulový bajt) | `\0` |
| `\n` (nový řádek) | `\n` |
| `\r` (návrat vozíku) | `\r` |

Hodnoty NULL se zobrazují jako neuzavřený literál `NULL`:

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

## Parametry

`DryRun::generate()` přijímá stejné parametry jako `SqlGenerator::generate()`:

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

| Parametr | Typ | Popis |
|---|---|---|
| `$result` | `MergeResult` | Výsledek sloučení k zobrazení v náhledu. |
| `$base` | `?Snapshot` | Základní snímek pro sloupce určující identitu. Pokud chybí, použije se `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Mapa závislostí cizích klíčů pro určení pořadí. |
| `$driver` | `?Driver` | Databázový ovladač pro uvozování identifikátorů. |

## Náhled nanečisto a SqlGenerator

`DryRun` obaluje `SqlGenerator`. Rozdíl:

- `SqlGenerator::generate()` vrací pole `['sql' => '...', 'params' => [...]]` určená pro spuštění adaptérem pomocí připravených příkazů.
- `DryRun::generate()` vrací prosté řetězce s vloženými hodnotami určené ke čtení lidmi.

Výstup náhledu nanečisto nespouštějte jako SQL. Je naformátován k zobrazení, nikoli k bezpečnému provedení. Ke spuštění sloučení použijte přímo `Applier` nebo `SqlGenerator` s připravenými příkazy.

## Použití přes fasádu

Zachyťte přes fasádu výsledek sloučení a zobrazte jeho náhled:

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

Nebo pomocí CLI a příznaku `--dry-run`:

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

CLI vypisuje příkazy bez řazení podle cizích klíčů a bez ovladače, takže identifikátory uzavírá do výchozích zpětných apostrofů bez ohledu na databázi. Předává základní snímek pro sloupce určující identitu. Jeho sloučení pracuje na úrovni sloupců stejně jako `Merql::merge()`.
