
# Преглед без изпълнение

`DryRun::generate()` генерира разбираеми за хората заявки SQL с вградени стойности. Използвайте го, за да прегледате какво би направило едно сливане, преди да го приложите към базата данни.

```php
use Merql\Apply\DryRun;

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

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

Прегледът съдържа по една заявка за всяка операция в резултата, групирани по начина, по който ги групира
`Applier`: първо вмъквания, после актуализации и накрая изтривания. Пълният
резултат от сливането включва всяка промяна от двете страни спрямо основата,
която `Merql::apply()` би приложил към база данни, в която все още се намира
основата. Прегледайте [избран резултат](https://merql.inline0.dev/bg/docs/merge/plans), за да видите само заявките
за операциите, които планирате да приложите.

## Примерен изход

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

Актуализациите задават всички колони, които носят операцията, освен тези за идентичност, а не само променените. Актуализация, която не би задала нито една колона, се пропуска.

## Форматиране на стойности

Всички стойности се ограждат в единични кавички. Специалните символи се екранират за безопасно визуализиране:

| Символ | Екраниран като |
|---|---|
| `\` (обратна наклонена черта) | `\\` |
| `'` (единична кавичка) | `''` |
| `\0` (нулев байт) | `\0` |
| `\n` (нов ред) | `\n` |
| `\r` (връщане на каретката) | `\r` |

Стойностите NULL се извеждат като литерал `NULL` без кавички:

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

## Параметри

`DryRun::generate()` приема същите параметри като `SqlGenerator::generate()`:

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

| Параметър | Тип | Описание |
|---|---|---|
| `$result` | `MergeResult` | Резултатът от сливането за преглед. |
| `$base` | `?Snapshot` | Основна моментна снимка за колоните за идентичност. Ако липсва, се използва `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Съпоставяне на зависимости между външни ключове за подреждане. |
| `$driver` | `?Driver` | Драйвер за базата данни, използван за ограждане на идентификатори с кавички. |

## Преглед без изпълнение и SqlGenerator

`DryRun` обгръща `SqlGenerator`. Разликата:

- `SqlGenerator::generate()` връща масиви `['sql' => '...', 'params' => [...]]`, предназначени за изпълнение от адаптер с подготвени заявки.
- `DryRun::generate()` връща обикновени низове с вградени стойности, предназначени за четене от хора.

Не изпълнявайте изхода от прегледа без изпълнение като SQL. Той е форматиран за показване, а не за безопасно изпълнение. За изпълнение на сливания използвайте директно `Applier` или `SqlGenerator` с подготвени заявки.

## Използване чрез фасадата

Заснемете резултат от сливане чрез фасадата и го прегледайте:

```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 с флага `--dry-run`:

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

CLI извежда заявките без подреждане по външни ключове или драйвер, затова
идентификаторите се ограждат с кавички чрез обратни апострофи по подразбиране, независимо от базата данни. Подават се
основната моментна снимка за колоните за идентичност. Сливането е на ниво колона, както при
`Merql::merge()`.
