
# Proovikäigu eelvaade

`DryRun::generate()` loob inimesele loetavad SQL-laused, milles väärtused on teksti sisse paigutatud. Kasutage seda, et vaadata üle, mida liitmine teeks, enne kui selle andmebaasis rakendate.

```php
use Merql\Apply\DryRun;

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

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

Eelvaade sisaldab iga tulemuses oleva toimingu kohta üht lauset, rühmitatuna nii, nagu `Applier` need rühmitab: esmalt lisamised, seejärel uuendused ja kustutamised. Ühendamise täielik tulemus hõlmab mõlema poole kõiki muudatusi baasi suhtes; need käivitaks `Merql::apply()` andmebaasi vastu, milles on endiselt baas. Ainult kavandatud toimingute lausete nägemiseks eelvaadake [valitud tulemust](https://merql.inline0.dev/et/docs/merge/plans).

## Näidisväljund

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

Uuendused määravad kõik operatsiooniga kaasas olevad mitteidentiteedi veerud, mitte ainult muudetud veerud. Uuendus, mis ei määraks ühtegi veergu, jäetakse välja.

## Väärtuste vormindamine

Kõik väärtused pannakse ühekordsete jutumärkide vahele. Kuvamise ohutuse tagamiseks erimärgid paomärgistatakse:

| Märk | Paomärgistatud kujul |
|---|---|
| `\` (kaldkriips) | `\\` |
| `'` (ühekordne jutumärk) | `''` |
| `\0` (nullbait) | `\0` |
| `\n` (reavahetus) | `\n` |
| `\r` (käru tagastus) | `\r` |

NULL-väärtused kuvatakse jutumärkideta literaalina `NULL`:

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

## Parameetrid

`DryRun::generate()` kasutab samu parameetreid nagu `SqlGenerator::generate()`:

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

| Parameeter | Tüüp | Kirjeldus |
|---|---|---|
| `$result` | `MergeResult` | Eelvaates kuvatav liitmise tulem. |
| `$base` | `?Snapshot` | Identiteediveergude baasil hetktõmmis. Vaikimisi kasutatakse väärtust `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Võõrvõtmete sõltuvuskaart järjestamiseks. |
| `$driver` | `?Driver` | Andmebaasi draiver identifikaatorite jutumärkidesse panemiseks. |

## Proovikäik ja SqlGenerator

`DryRun` kasutab `SqlGenerator`. Erinevus:

- `SqlGenerator::generate()` tagastab massiivid kujul `['sql' => '...', 'params' => [...]]`, mis on mõeldud adapteri ettevalmistatud päringute käivitamiseks.
- `DryRun::generate()` tagastab lihtteksti stringid, milles väärtused on sisse kirjutatud ja mis on mõeldud inimestele lugemiseks.

Ärge käivitage proovikäigu väljundit kujul SQL. See on vormindatud kuvamiseks, mitte turvaliseks käivitamiseks. Liitmiste käivitamiseks kasutage ettevalmistatud päringutega otse väärtust `Applier` või `SqlGenerator`.

## Fassaadi kasutamine

Fassaadi kaudu saate liitmise tulemuse salvestada ja selle eelvaadet vaadata:

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

Või kasutage CLI-i ja lippu `--dry-run`:

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

CLI väljastab laused ilma võõrvõtmete järjestuse ega draiverita, seega kasutatakse identifikaatorite jaoks andmebaasist olenemata vaikimisi tagurpidi ühekordseid jutumärke. See edastab baashetktõmmise identiteediveergude jaoks. Selle liitmine on veerutasemel nagu `Merql::merge()`.
