%PDF- %PDF-
| Direktori : /home/graphicd/public_html/vebto/vendor/meilisearch/meilisearch-php/src/Search/ |
| Current File : /home/graphicd/public_html/vebto/vendor/meilisearch/meilisearch-php/src/Search/SearchResult.php |
<?php
declare(strict_types=1);
namespace MeiliSearch\Search;
use function array_filter;
use ArrayIterator;
use Countable;
use IteratorAggregate;
class SearchResult implements Countable, IteratorAggregate
{
/**
* @var array<int, array<string, mixed>>
*/
private $hits;
/**
* @var int
*/
private $offset;
/**
* @var int
*/
private $limit;
/**
* `nbHits` is the attributes returned by the MeiliSearch server
* and its value will not be modified by the methods in this class.
* Please, use `hitsCount` if you want to know the real size of the `hits` array at any time.
*
* @var int
*/
private $nbHits;
/**
* @var int
*/
private $hitsCount;
/**
* @var bool
*/
private $exhaustiveNbHits;
/**
* @var int
*/
private $processingTimeMs;
/**
* @var string
*/
private $query;
/**
* @var bool|null
*/
private $exhaustiveFacetsCount;
/**
* @var array<string, mixed>
*/
private $facetsDistribution;
/**
* @var array<string, mixed>
*/
private $raw;
public function __construct(array $body)
{
$this->hits = $body['hits'] ?? [];
$this->offset = $body['offset'];
$this->limit = $body['limit'];
$this->nbHits = $body['nbHits'];
$this->hitsCount = \count($body['hits']);
$this->exhaustiveNbHits = $body['exhaustiveNbHits'] ?? false;
$this->processingTimeMs = $body['processingTimeMs'];
$this->query = $body['query'];
$this->exhaustiveFacetsCount = $body['exhaustiveFacetsCount'] ?? null;
$this->facetsDistribution = $body['facetsDistribution'] ?? [];
$this->raw = $body;
}
/**
* Return a new {@see SearchResult} instance.
*
* The $options parameter is an array, and the following keys are accepted:
* - removeZeroFacets (boolean)
* - transformFacetsDistribution (callable)
* - transformHits (callable)
*
* The method does NOT trigger a new search.
*
* @return SearchResult
*/
public function applyOptions($options): self
{
if (\array_key_exists('removeZeroFacets', $options) && true === $options['removeZeroFacets']) {
$this->removeZeroFacets();
}
if (\array_key_exists('transformHits', $options) && \is_callable($options['transformHits'])) {
$this->transformHits($options['transformHits']);
}
if (\array_key_exists('transformFacetsDistribution', $options) && \is_callable($options['transformFacetsDistribution'])) {
$this->transformFacetsDistribution($options['transformFacetsDistribution']);
}
return $this;
}
public function transformHits(callable $callback): self
{
$this->hits = $callback($this->hits);
$this->hitsCount = \count($this->hits);
return $this;
}
public function transformFacetsDistribution(callable $callback): self
{
$this->facetsDistribution = $callback($this->facetsDistribution);
return $this;
}
public function removeZeroFacets(): self
{
$filterAllFacets = function (array $facets): array {
$filterOneFacet = function (array $facet): array {
return array_filter(
$facet,
function (int $facetValue): bool { return 0 !== $facetValue; },
ARRAY_FILTER_USE_BOTH
);
};
return array_map($filterOneFacet, $facets);
};
return $this->transformFacetsDistribution($filterAllFacets);
}
public function getHit(int $key, $default = null)
{
return $this->hits[$key] ?? $default;
}
/**
* @return array<int, array>
*/
public function getHits(): array
{
return $this->hits;
}
public function getOffset(): int
{
return $this->offset;
}
public function getLimit(): int
{
return $this->limit;
}
public function getHitsCount(): int
{
return $this->hitsCount;
}
public function count(): int
{
return $this->hitsCount;
}
public function getNbHits(): int
{
return $this->nbHits;
}
public function getExhaustiveNbHits(): bool
{
return $this->exhaustiveNbHits;
}
public function getProcessingTimeMs(): int
{
return $this->processingTimeMs;
}
public function getQuery(): string
{
return $this->query;
}
public function getExhaustiveFacetsCount(): ?bool
{
return $this->exhaustiveFacetsCount;
}
/**
* @return array<string, mixed>
*/
public function getFacetsDistribution(): array
{
return $this->facetsDistribution;
}
/**
* Return the original search result.
*
* @return array<string, mixed>
*/
public function getRaw(): array
{
return $this->raw;
}
public function toArray(): array
{
return [
'hits' => $this->hits,
'offset' => $this->offset,
'limit' => $this->limit,
'nbHits' => $this->nbHits,
'hitsCount' => $this->hitsCount,
'exhaustiveNbHits' => $this->exhaustiveNbHits,
'processingTimeMs' => $this->processingTimeMs,
'query' => $this->query,
'exhaustiveFacetsCount' => $this->exhaustiveFacetsCount,
'facetsDistribution' => $this->facetsDistribution,
];
}
public function toJSON(): string
{
return json_encode($this->toArray(), JSON_PRETTY_PRINT);
}
public function getIterator(): ArrayIterator
{
return new ArrayIterator($this->hits);
}
}