|Model $model */ public static function getSearch(Model|string $model, Criteria $criteria): Search { $model = $model instanceof Model ? $model : new $model; return match ($driver = Config::get('scout.driver')) { 'collection' => App::make(CollectionSearch::class, ['model' => $model, 'criteria' => $criteria]), 'elastic' => App::make(Elasticsearch::class, ['model' => $model, 'criteria' => $criteria]), 'typesense' => App::make(Typesense::class, ['model' => $model, 'criteria' => $criteria]), default => throw new RuntimeException("Unsupported {$driver} search driver configured."), }; } /** * Should the search be performed? */ abstract public function shouldSearch(): bool; /** * Perform the search. */ abstract public function searchViaJSONAPI( Query $query, EloquentSchema $schema, PaginationStrategy $paginationStrategy ): Collection|Paginator; /** * @param Closure(EloquentBuilder): mixed $callback * @param array $sorts */ abstract public function search(?Closure $callback = null, int $perPage = 15, int $page = 1, array $sorts = []): LengthAwarePaginator; }