
# Bandomasis peržiūros vykdymas

`DryRun::generate()` sukuria žmogui skaitomus SQL sakinius su tiesiogiai įterptomis reikšmėmis. Naudokite jį, kad peržiūrėtumėte, ką sujungimas atliktų, prieš pritaikydami jį duomenų bazei.

```php
use Merql\Apply\DryRun;

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

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

Peržiūroje pateikiamas sakinys kiekvienai rezultato operacijai, sugrupuotas taip, kaip jas grupuoja `Applier`: pirmiausia įterpimai, tada atnaujinimai, galiausiai trynimai. Visas sujungimo rezultatas apima visus abiejų pusių pakeitimus, palyginti su bazine versija; būtent juos `Merql::apply()` vykdytų duomenų bazėje, kurioje vis dar yra bazinė versija. Peržiūrėkite [pasirinktą rezultatą](https://merql.inline0.dev/lt/docs/merge/plans), kad matytumėte tik operacijų, kurias ketinate pritaikyti, sakinius.

## Pavyzdinė išvestis

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

Atnaujinant nustatomi visi operacijos perduodami ne tapatybės stulpeliai, o ne vien pakeisti stulpeliai; atnaujinimo, kuris nenustatytų nė vieno stulpelio, atsisakoma.

## Reikšmių formatavimas

Visos reikšmės apgaubiamos viengubomis kabutėmis. Specialieji simboliai saugiai atvaizduojami juos pakeičiant:

| Simbolis | Atvaizduojamas kaip |
|---|---|
| `\` (atvirkštinis brūkšnys) | `\\` |
| `'` (vienguba kabutė) | `''` |
| `\0` (nulinis baitas) | `\0` |
| `\n` (nauja eilutė) | `\n` |
| `\r` (grįžimas į eilutės pradžią) | `\r` |

NULL reikšmės pateikiamos kaip kabutėmis neapgaubtas literalas `NULL`:

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

## Parametrai

`DryRun::generate()` priima tuos pačius parametrus kaip `SqlGenerator::generate()`:

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

| Parametras | Tipas | Aprašymas |
|---|---|---|
| `$result` | `MergeResult` | Sujungimo rezultatas, kurį norite peržiūrėti. |
| `$base` | `?Snapshot` | Tapatybės stulpelių bazinė momentinė kopija. Jei nenurodyta, naudojama `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Svetimųjų raktų priklausomybių žemėlapis operacijų tvarkai nustatyti. |
| `$driver` | `?Driver` | Duomenų bazės tvarkyklė identifikatoriams cituoti. |

## Bandomasis vykdymas ir „SqlGenerator“

`DryRun` apgaubia `SqlGenerator`. Skirtumas:

- `SqlGenerator::generate()` grąžina `['sql' => '...', 'params' => [...]]` masyvus, skirtus vykdyti adapterio paruoštais sakiniais.
- `DryRun::generate()` grąžina paprastas eilutes su įterptomis reikšmėmis, skirtas skaityti žmonėms.

Nevykdykite bandomojo vykdymo išvesties kaip SQL. Ji suformatuota peržiūrai, o ne saugiam vykdymui. Sujungimams vykdyti naudokite tiesiogiai `Applier` arba `SqlGenerator` su paruoštais sakiniais.

## Naudojimas per fasadą

Per fasadą užfiksuokite sujungimo rezultatą ir peržiūrėkite jį:

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

Arba per CLI, naudodami vėliavėlę `--dry-run`:

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

CLI išveda sakinius be svetimųjų raktų tvarkos ar tvarkyklės, todėl identifikatoriams visada naudojamos numatytosios atvirkštinės kabutės, nesvarbu, kokia duomenų bazė. Bazinė momentinė kopija perduodama tapatybės stulpeliams. Sujungimas atliekamas stulpelių lygmeniu, kaip ir `Merql::merge()`.
