
# Predogled preizkusnega zagona

`DryRun::generate()` ustvari berljive stavke SQL z vstavljenimi vrednostmi. Uporabite ga za pregled učinkov združevanja, preden ga uveljavite v zbirki podatkov.

```php
use Merql\Apply\DryRun;

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

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

Predogled vsebuje stavek za vsako operacijo v rezultatu, razvrščene tako,
kot jih razvršča `Applier`: vstavljanja, nato posodobitve in nazadnje brisanja. Celoten
rezultat združevanja zajema vse spremembe obeh strani glede na osnovo, ki bi jih
`Merql::apply()` izvedel v zbirki podatkov, ki še vedno vsebuje osnovno stanje. Če si želite ogledati le stavke za operacije, ki jih nameravate uveljaviti, prikažite predogled [izbranega rezultata](https://merql.inline0.dev/sl/docs/merge/plans).

## Primer izhoda

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

Posodobitve nastavijo vse stolpce, ki jih operacija vsebuje, razen identifikacijskih, ne le spremenjenih; posodobitev, ki ne bi nastavila nobenega stolpca, je izpuščena.

## Oblikovanje vrednosti

Vse vrednosti so obdane z enojnimi narekovaji. Posebni znaki so zaradi varnega prikaza ubežno zapisani:

| Znak | Ubežni zapis |
|---|---|
| `\` (obratna poševnica) | `\\` |
| `'` (enojni narekovaj) | `''` |
| `\0` (ničelni bajt) | `\0` |
| `\n` (nova vrstica) | `\n` |
| `\r` (vrnitev na začetek vrstice) | `\r` |

Vrednosti NULL so prikazane kot necitiran literal `NULL`:

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

## Parametri

`DryRun::generate()` sprejema iste parametre kot `SqlGenerator::generate()`:

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

| Parameter | Type | Description |
|---|---|---|
| `$result` | `MergeResult` | Rezultat združitve za predogled. |
| `$base` | `?Snapshot` | Osnovni posnetek za stolpce identitete. Če ni na voljo, se uporabi `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Zemljevid odvisnosti tujih ključev za določanje vrstnega reda. |
| `$driver` | `?Driver` | Gonilnik podatkovne zbirke za navajanje identifikatorjev. |

## Suhi zagon v primerjavi s SqlGenerator

`DryRun` ovije `SqlGenerator`. Razlika:

- `SqlGenerator::generate()` vrne polja `['sql' => '...', 'params' => [...]]`, namenjena izvajanju prek adapterja s pripravljenimi stavki.
- `DryRun::generate()` vrne enostavne nize z vstavljenimi vrednostmi, namenjene branju.

Izhoda preizkusnega zagona ne izvajajte kot SQL. Oblikovan je za prikaz, ne pa za varno izvajanje. Za izvajanje združevanj uporabite neposredno `Applier` ali `SqlGenerator` s pripravljenimi stavki.

## Uporaba prek fasade

Prek fasade zajemite rezultat združevanja in si oglejte njegov predogled:

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

Ali pa uporabite CLI z zastavico `--dry-run`:

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

CLI izpiše stavke brez razvrščanja glede na tuje ključe in brez gonilnika, zato se za identifikatorje ne glede na zbirko podatkov uporablja privzeto citiranje z obratnimi narekovaji. Posreduje osnovni posnetek za identifikacijske stolpce. Združevanje poteka na ravni stolpcev, kot pri `Merql::merge()`.
