
# Testisuorituksen esikatselu

`DryRun::generate()` tuottaa ihmisluettavia SQL-lauseita, joissa arvot on sijoitettu suoraan. Käytä sitä tarkistaaksesi, mitä yhdistäminen tekisi, ennen kuin sovellat sitä tietokantaan.

```php
use Merql\Apply\DryRun;

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

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

Esikatselu sisältää jokaisesta tuloksen operaatiosta lausekkeen, ja ne on ryhmitelty samalla tavalla kuin `Applier` ryhmittelee ne: ensin lisäykset, sitten päivitykset ja lopuksi poistot. Yhdistämisen koko tulos sisältää molempien puolten kaikki muutokset suhteessa pohjaan, eli kaiken, minkä `Merql::apply()` suorittaisi tietokantaan, jossa on yhä pohjatila. Esikatsele [valittua tulosta](https://merql.inline0.dev/fi/docs/merge/plans) nähdäksesi vain niiden operaatioiden lausekkeet, jotka aiot ottaa käyttöön.

## Esimerkkituloste

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

Päivitykset asettavat kaikki operaation sisältämät sarakkeet identiteettisarakkeita lukuun ottamatta, eivät vain muuttuneita sarakkeita. Päivitys, joka ei asettaisi yhtään saraketta, jätetään pois.

## Arvojen muotoilu

Kaikki arvot ympäröidään yksinkertaisilla lainausmerkeillä. Erikoismerkit suojataan turvallista näyttämistä varten:

| Merkki | Suojattu muoto |
|---|---|
| `\` (kenoviiva) | `\\` |
| `'` (yksinkertainen lainausmerkki) | `''` |
| `\0` (null-tavu) | `\0` |
| `\n` (rivinvaihto) | `\n` |
| `\r` (vaununpalautus) | `\r` |

NULL-arvot näytetään lainaamattomana literaalina `NULL`:

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

## Parametrit

`DryRun::generate()` hyväksyy samat parametrit kuin `SqlGenerator::generate()`:

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

| Parametri | Tyyppi | Kuvaus |
|---|---|---|
| `$result` | `MergeResult` | Esikatseltava yhdistämistulos. |
| `$base` | `?Snapshot` | Identiteettisarakkeiden pohjan tilannevedos. Oletuksena käytetään arvoa `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Viiteavainriippuvuuksien kartta järjestämistä varten. |
| `$driver` | `?Driver` | Tietokanta-ajuri tunnisteiden lainausmerkkien valintaa varten. |

## Koeajo ja SqlGenerator

`DryRun` käärii `SqlGenerator`-toiminnon. Ero on seuraava:

- `SqlGenerator::generate()` palauttaa `['sql' => '...', 'params' => [...]]`-taulukoita, jotka on tarkoitettu adapterin valmisteltujen lausekkeiden suorittamiseen.
- `DryRun::generate()` palauttaa litteitä merkkijonoja, joihin arvot on sijoitettu ja jotka on tarkoitettu ihmisluettaviksi.

Älä suorita koeajon tulostetta muodossa SQL. Se on muotoiltu näyttämistä, ei turvallista suoritusta varten. Käytä yhdistämisten suorittamiseen suoraan funktioita `Applier` tai `SqlGenerator` valmisteltujen lausekkeiden kanssa.

## Käyttö julkisivun kautta

Tallenna yhdistämistulos julkisivun kautta ja esikatsele sitä:

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

Tai käytä CLI-komentoa lipulla `--dry-run`:

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

CLI tulostaa lausekkeet ilman viiteavainten mukaista järjestystä tai ajuria, joten tunnisteissa käytetään oletusarvoisia kenoviivoja tietokannasta riippumatta. Pohjan tilannevedos välitetään identiteettisarakkeita varten. Yhdistäminen tehdään saraketasolla kuten toiminnossa `Merql::merge()`.
