first upload all files

This commit is contained in:
NW
2023-06-11 13:14:03 +01:00
parent f14dbc52b5
commit c08b36d1b6
1705 changed files with 106852 additions and 0 deletions

View File

@@ -0,0 +1,115 @@
<?php
namespace Modules\Support\Search;
class Builder
{
/**
* The model instance.
*
* @var \Illuminate\Database\Eloquent\Model
*/
private $model;
/**
* The scout builder instance.
*
* @var \Laravel\Scout\Builder
*/
private $scoutBuilder;
/**
* Keys of search results.
*
* @var array
*/
private $keys = [];
/**
* Create a new instance.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param \Laravel\Scout\Builder $scoutBuilder
* @return void
*/
public function __construct($model, $scoutBuilder)
{
$this->model = $model;
$this->scoutBuilder = $scoutBuilder;
}
/**
* Apply filter to the search results.
*
* @return mixed
*/
public function filter($filter)
{
return $filter->apply($this->query());
}
/**
* Get the query builder of the model.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function query()
{
$query = $this->model->whereIn($this->model->getQualifiedKeyName(), $this->keys());
if ($this->shouldOrderByRelevance()) {
$this->orderByRelevance($query);
}
return $query;
}
/**
* Get keys of search result.
*
* @return \Illuminate\Support\Collection
*/
public function keys()
{
if (empty($this->keys)) {
$this->keys = $this->scoutBuilder->keys();
}
return $this->keys;
}
/**
* Determine if query should order by relevance.
*
* @return bool
*/
private function shouldOrderByRelevance()
{
return ! request()->has('sort') || request('sort') === 'relevance';
}
/**
* Order query by relevance.
*
* @param \Illuminate\Database\Query\Builder $query
* @return void
*/
private function orderByRelevance($query)
{
$ids = $this->keys()->filter();
if ($ids->isNotEmpty()) {
$query->orderByRaw("FIELD({$this->model->getQualifiedKeyName()}, {$ids->implode(',')})");
}
}
/**
* Get the results of the search.
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public function get()
{
return $this->query()->get();
}
}

View File

@@ -0,0 +1,173 @@
<?php
namespace Modules\Support\Search;
use Laravel\Scout\Builder;
use Laravel\Scout\Engines\Engine;
use Illuminate\Support\Facades\DB;
class MySqlSearchEngine extends Engine
{
public function update($models)
{
//
}
public function delete($models)
{
//
}
/**
* Pluck and return the primary keys of the given results.
*
* @param mixed $results
* @return \Illuminate\Support\Collection
*/
public function mapIds($results)
{
return $results['results'];
}
/**
* Perform the given search on the engine.
*
* @param \Laravel\Scout\Builder $builder
* @return mixed
*/
public function search(Builder $builder)
{
$result = [];
$query = DB::table($builder->model->searchTable());
$columns = implode(',', $builder->model->searchColumns());
$query->whereRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE)", $this->getSearchKeyword($builder));
if ($builder->callback) {
$query = call_user_func($builder->callback, $query, $this);
}
$result['count'] = $query->count();
if (property_exists($builder, 'orders') && ! empty($builder->orders)) {
foreach ($builder->orders as $order) {
$query->orderBy($order['column'], $order['direction']);
}
}
if ($builder->limit) {
$query = $query->take($builder->limit);
}
if (property_exists($builder, 'offset') && $builder->offset) {
$query = $query->skip($builder->offset);
}
$result['results'] = $query->pluck($builder->model->searchKey());
return $result;
}
/**
* Get the search query.
*
* @param \Laravel\Scout\Builder $builder
* @return string
*/
private function getSearchKeyword($builder)
{
if (is_null($builder->query)) {
return '';
}
return '+' . preg_replace('/[-+~*()><@"]/', ' ', $builder->query) . '*';
}
/**
* Perform the given search on the engine.
*
* @param \Modules\Support\Search\Builder $builder
* @param int $perPage
* @param int $page
* @return mixed
*/
public function paginate(Builder $builder, $perPage, $page)
{
$builder->limit = $perPage;
$builder->offset = ($perPage * $page) - $perPage;
return $this->search($builder);
}
/**
* Map the given results to instances of the given model.
*
* @param Laravel\Scout\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return \Illuminate\Support\Collection
*/
public function map(Builder $builder, $results, $model)
{
return $results['results'];
}
/**
* Map the given results to instances of the given model via a lazy collection.
*
* @param \Laravel\Scout\Builder $builder
* @param mixed $results
* @param \Illuminate\Database\Eloquent\Model $model
* @return \Illuminate\Support\LazyCollection
*/
public function lazyMap(Builder $builder, $results, $model)
{
//
}
/**
* Get the total count from a raw result returned by the engine.
*
* @param mixed $results
* @return int
*/
public function getTotalCount($results)
{
return $results['count'];
}
/**
* Flush all of the model's records from the engine.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function flush($model)
{
//
}
/**
* Create a search index.
*
* @param string $name
* @param array $options
* @return mixed
*/
public function createIndex($name, array $options = [])
{
//
}
/**
* Delete a search index.
*
* @param string $name
* @return mixed
*/
public function deleteIndex($name)
{
//
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace Modules\Support\Search;
use Laravel\Scout\Searchable as ScoutSearchable;
trait Searchable
{
use ScoutSearchable {
ScoutSearchable::search as scoutSearch;
}
/**
* Perform a search against the model's indexed data.
*
* @param string $query
* @param Closure $callback
* @return \Modules\Support\Search\Builder
*/
public function search($query, $callback = null)
{
$scoutBuilder = $this->scoutSearch($query, $callback);
return new Builder($this, $scoutBuilder);
}
}