
# Zostavovač dotazov

`DocStore` a `SegmentedLog` sprístupňujú `query()`. `DocStore` dokáže používať sekundárne
indexy; `SegmentedLog` uplatňuje rovnaké predikáty na streamované záznamy.

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

Užitočné terminálové metódy:

```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();
```

V `DocStore` môžu dve podmienky `eq` na poliach s indexom rovnosti, ktoré nie sú jedinečné,
používať automatický zložený blok. Jednoduchá rovnosť, `in` a operátory rozsahu
naďalej používajú nakonfigurované indexy polí.

Operátory:

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

`andWhere` a `orWhere` používajú spätné volania, pretože `and` a `or` sú vyhradené kľúčové slová PHP:

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

Zreťazené volania `where()` sa kombinujú pomocou AND; každá vetva `orWhere()` pridáva
ďalšiu možnosť.

## Ako sa vykonávajú operácie

Každá podmienka funguje v každej kolekcii; indexy menia iba náklady.
V `DocStore` sa `eq` a `in` vyhodnocujú pomocou indexov rovnosti, operátory rozsahu a `prefix` pomocou rozsahových indexov a `orderBy` s `limit` na poli s rozsahovým indexom číta v poradí indexu. Všetko ostatné
filtruje skenovanie záznamov. `orderBy` na poli, ktoré plánovač nedokáže spracovať pomocou indexu, zoradí zodpovedajúce záznamy v PHP, preto pri veľkých kolekciách používajte túto operáciu spolu s indexovanými
podmienkami. `count()` používa počty položiek indexu v `DocStore` a počítadlá v pamäti v `SegmentedLog`, keď filter predstavuje jednu rovnosť.

`cursor($id)` obmedzí výsledky na záznamy po danom ID. V kombinácii s `page()` umožňuje stabilné stránkovanie zoradené podľa ID záznamu. O filtroch určených na obyčajné streamovanie bez zostavovača sa dočítate v časti [Dotazy](https://storh.inline0.dev/sk/docs/queries).
