Skip to content

Рефакторинг Sphix адаптера для пагинации #85

@someApprentice

Description

@someApprentice

#54 (comment)

По адаптеру - мне конечно не очень нравится идея выносить SQL-запросы в адаптер пагинации. По моему, лучше бы было, если бы в сервисе поиска были методы получения количества и результатов, и далее они бы как-нибудь передавались в пагинатор (например, через FixedAdapter). То есть по моему, это задача сервиса поиска - искать данные или определять их количество, а не пагинатора. Задача пагинатора только рассчитывать и помогать с выводом номеров страниц.

Также, Сфинкс умеет за один запрос делать поиск и вычислять количество результатов (SHOW META LIKE). Это можно было бы использовать в описанном мной варианте - сделать метод, который возвращает сразу результаты и общее количество, и далее они передаются в пагинатор. Это может выглядеть например, так:

class SearchService 
{
    // вместо NO_LIMIT можно бы использовать \INF, но она не попадает в диапазон int
    public function search(string $query, int $limit = SearchService::NO_LIMIT, int $offset = 0): SearchResult {}
}

// Напоминает SearchAdapter, при желании можно даже реализовать тут его интерфейс
class SearchResult
{
    public function getTotalCount(): int {}
    public function getOffset(): int {} // не обязательно, но может пригодиться при выводе
    public function getLimit(): int {} 
    public function getResults(): array {}
}

class SearchResultItem
{
    public $post; // можно сделать и методами
    public $snippet;
}

Еще один маленький подвох - возможно (хоть и маловероятно), что по каким-то причинам пост есть в индексе, но его нет в базе. Такие посты можно пропускать, хоть они и приведут к уменьшению числа результатов на странице.

#54 (comment)

Касательно пагинации - конечно, наш SphinxAdapter не переиспользуемый. Адаптер должен конвертировать один интерфейс другой и ничего более. Вот тут whiteoctober/Pagerfanta#218 пример получше, но его не вмерджили из-за отсутствия тестов. Ну и он не использует SHOW META LIKE

Напоминает SearchAdapter, при желании можно даже реализовать тут его интерфейс

Нужно его и реализовать, благодаря этому результат можно пагинировать и использовать код библиотеки Pagerfanta для формирования HTML, а не велосипедить. Pagerfanta уже используется для пагинации данных из БД.

Можно ещё заморочится с тем, чтобы SearchService ничего не знал про Pagerfanta - из SearchService возвращаем SearchResult, потом его адаптируем для Pagerfanta, но у нас не библиотека для всеобщего использования и думаю можно сделать по-простому:


use Pagerfanta\Adapter\AdapterInterface;

class SearchService
{
    // возвращаем SearchResult, реализующий AdapterInterface
    public function search(string $query, ...): AdapterInterface
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions