
# Pārbaudes priekšskatījums

`DryRun::generate()` izveido cilvēkam lasāmus SQL priekšrakstus, kuros vērtības ir ievietotas tieši tekstā. Izmantojiet to, lai pārskatītu apvienošanas darbības pirms to lietošanas datubāzē.

```php
use Merql\Apply\DryRun;

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

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

Priekšskatījumā ir iekļauts priekšraksts katrai rezultāta darbībai, grupējot tās tā, kā to dara `Applier`: vispirms ievietošana, tad atjaunināšana un visbeidzot dzēšana. Pilnā apvienošanas rezultātā ir iekļautas visas abu pušu izmaiņas attiecībā pret bāzi — tās izpildītu `Merql::apply()` datubāzē, kurā joprojām ir bāze. Priekšskatiet [atlasīto rezultātu](https://merql.inline0.dev/lv/docs/merge/plans), lai skatītu tikai to darbību priekšrakstus, ko plānojat lietot.

## Rezultāta piemērs

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

Atjauninājumos tiek iestatītas visas darbībā iekļautās kolonnas, kas nav identitātes kolonnas, nevis tikai izmainītās. Atjauninājums, kurā netiktu iestatīta neviena kolonna, tiek izlaists.

## Vērtību formatēšana

Visas vērtības tiek ietvertas vienpēdiņās. Speciālās rakstzīmes tiek ekrānētas, lai tās varētu droši parādīt:

| Rakstzīme | Ekranētais pieraksts |
|---|---|
| `\` (atpakaļvērstā slīpsvītra) | `\\` |
| `'` (vienpēdiņa) | `''` |
| `\0` (nulles baits) | `\0` |
| `\n` (jauna rinda) | `\n` |
| `\r` (rindas atgrieze) | `\r` |

NULL vērtības tiek attēlotas kā neietverts literālis `NULL`:

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

## Parametri

`DryRun::generate()` pieņem tos pašus parametrus kā `SqlGenerator::generate()`:

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

| Parametrs | Tips | Apraksts |
|---|---|---|
| `$result` | `MergeResult` | Apvienošanas rezultāts, kas jāpriekšskata. |
| `$base` | `?Snapshot` | Bāzes momentuzņēmums identitātes kolonnām. Ja nav norādīts, izmanto `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Ārējo atslēgu atkarību karte darbību secības noteikšanai. |
| `$driver` | `?Driver` | Datubāzes draiveris identifikatoru citēšanai. |

## Pārbaudes režīms un SqlGenerator

`DryRun` ietver sevī `SqlGenerator`. Atšķirība:

- `SqlGenerator::generate()` atgriež `['sql' => '...', 'params' => [...]]` masīvus, kas paredzēti izpildei ar adaptera sagatavotiem priekšrakstiem.
- `DryRun::generate()` atgriež vienkārša teksta virknes ar ievietotām vērtībām, lai tās būtu lasāmas cilvēkiem.

Neizpildiet pārbaudes režīma izvadi kā SQL. Tā ir formatēta attēlošanai, nevis drošai izpildei. Apvienošanas izpildei izmantojiet tieši `Applier` vai `SqlGenerator` kopā ar sagatavotiem priekšrakstiem.

## Izmantošana ar fasādi

Izmantojot fasādi, iegūstiet apvienošanas rezultātu un priekšskatiet to:

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

Vai arī izmantojiet CLI ar karodziņu `--dry-run`:

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

CLI izdrukā priekšrakstus bez ārējo atslēgu secības un draivera, tāpēc identifikatoriem tiek izmantota noklusējuma citēšana ar atpakaļpēdiņām neatkarīgi no datubāzes. Tas padod bāzes momentuzņēmumu identitātes kolonnām. Tā apvienošana ir kolonnu līmenī, tāpat kā `Merql::merge()`.
