
# Päringukoostaja

`DocStore` ja `SegmentedLog` pakuvad `query()`. `DocStore` saab kasutada sekundaarseid indekseid; `SegmentedLog` rakendab samu tingimusi voogedastusega kirjete puhul.

```php
$records = $docs
    ->query()
    ->where('kind')->eq('page')
    ->where('status')->in(['draft', 'published'])
    ->where('publishedAt')->between($from, $until)
    ->orderBy('publishedAt', 'desc')
    ->limit(50)
    ->get();
```

Kasulikud lõppmeetodid:

```php
$docs->query()->where('slug')->eq('home')->first();
$docs->query()->where('kind')->eq('page')->count();
$docs->query()->cursor($lastId)->page(100)->get();
$docs->query()->where('slug')->eq('home')->explain();
```

`DocStore` puhul saavad kaks `eq` tingimust mitteunikaalsetel võrdsusindekseeritud väljadel kasutada automaatset liitindeksi ämbrit. Üksik võrdsus, `in` ja vahemikuoperaatorid kasutavad endiselt seadistatud väljade indekseid.

Operaatorid:

- `eq`, `neq`
- `in`, `notIn`
- `gt`, `gte`, `lt`, `lte`, `between`
- `exists`, `missing`
- `prefix`
- `andWhere`, `orWhere`
- `orderBy`, `limit`, `cursor`, `page`

`andWhere` ja `orWhere` kasutavad tagasikutseid, sest `and` ja `or` on reserveeritud PHP märksõnad:

```php
$docs->query()
    ->where('kind')->eq('page')
    ->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
    ->get();
```

Aheldatud `where()` kutsed ühendatakse operaatoriga AND; iga `orWhere()` haru lisab alternatiivi.

## Mida eri moodi käivitatakse

Iga tingimus töötab iga kogumiga; indeksid mõjutavad ainult töö mahtu. `DocStore` puhul lahendatakse `eq` ja `in` võrdsusindeksite abil, vahemikuoperaatorid ja `prefix` vahemikuindeksite abil ning `orderBy` koos vahemikuindekseeritud välja `limit`-ga loeb andmeid indeksi järjestuses. Kõik muu filtreeritakse kirjete skannimisel. Kui päringuplaanur ei saa välja `orderBy` indeksist teenindada, sordib see sobivad kirjed PHP-is, mistõttu tasub seda suurte kogumite puhul kasutada koos indekseeritud tingimustega. `count()` kasutab `DocStore` puhul indeksikirjete arvu ja `SegmentedLog` puhul mälus olevaid loendureid, kui filter on üks võrdsustingimus.

`cursor($id)` piirab tulemused kirjetega, mis järgnevad sellele ID-le. Koos valikuga `page()` võimaldab see lehekülgi stabiilselt kirje ID järgi järjestada. Lihtsamate voogedastusega filtrite jaoks ilma koostajata vaata lehte [Päringud](https://storh.inline0.dev/et/docs/queries).
