
# Tvůrce dotazů

`DocStore` a `SegmentedLog` zpřístupňují `query()`. `DocStore` může využívat sekundární indexy; `SegmentedLog` používá stejné predikáty nad streamovanými 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žitečné koncové metody:

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

Na `DocStore` mohou dvě podmínky `eq` nad neunikátními poli indexovanými pro rovnost využít automatický složený segment. Jednoduchá rovnost, `in` a operátory rozsahu nadále 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í zpětná volání, protože `and` a `or` jsou vyhrazená klíčová slova PHP:

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

Zřetězená volání `where()` se kombinují pomocí AND; každá větev `orWhere()` přidává alternativu.

## Jak se provádějí

Každá podmínka funguje nad každou kolekcí; indexy mění pouze náročnost. Na `DocStore` se `eq` a `in` vyhodnocují pomocí indexů rovnosti, operátory rozsahu a `prefix` pomocí indexů rozsahu a `orderBy` s `limit` nad polem indexovaným podle rozsahu čte v pořadí indexu. Vše ostatní filtruje procházené záznamy. `orderBy` nad polem, které plánovač nedokáže obsloužit indexem, řadí odpovídající záznamy v PHP; u velkých kolekcí ho proto kombinujte s podmínkami využívajícími index. `count()` používá počty položek indexu na `DocStore` a čítače v paměti na `SegmentedLog`, pokud filtr obsahuje jedinou podmínku rovnosti.

`cursor($id)` omezuje výsledky na záznamy následující po daném ID a v kombinaci s `page()` umožňuje stabilní stránkování seřazené podle ID záznamu. Streamovací filtry bez tvůrce dotazů najdete v části [Dotazy](https://storh.inline0.dev/cs/docs/queries).
