elasticsearch_search_api-1.0.x-dev/src/Search/FacetedSearchAction.php
src/Search/FacetedSearchAction.php
<?php
namespace Drupal\elasticsearch_search_api\Search;
use Drupal\elasticsearch_search_api\Search\Facet\FacetCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValueInterface;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValuesCollection;
use Drupal\elasticsearch_search_api\Search\Facet\FlatFacetValue;
/**
* Models the current search action.
*/
class FacetedSearchAction implements FacetedSearchActionInterface {
/**
* The chosen facet values.
*
* @var \Drupal\elasticsearch_search_api\Search\Facet\FacetCollection
*/
protected $chosenFacetValues;
/**
* The available facets.
*
* @var array
*/
protected $availableFacets;
/**
* Position in results to start from.
*
* @var int
*/
protected $from = 0;
/**
* Size of one result set.
*
* @var int
*/
protected $size;
/**
* FacetedSearchAction constructor.
*
* @param int $size
* Desired size of one page in the result set.
* @param \Drupal\elasticsearch_search_api\Search\Facet\FacetCollection|null $facetValues
* The facet values.
* @param array $availableFacets
* All available facets.
*/
public function __construct(
int $size,
FacetCollection $facetValues = NULL,
array $availableFacets = []) {
$this->size = $size;
$this->chosenFacetValues = $facetValues ?: new FacetCollection();
$this->availableFacets = $availableFacets;
}
/**
* {@inheritdoc}
*/
public function getAvailableFacets(): array {
return $this->availableFacets;
}
/**
* {@inheritdoc}
*/
public function getChosenFacetValues(): FacetCollection {
return $this->chosenFacetValues;
}
/**
* {@inheritdoc}
*/
public function facetValueWasChosen(string $facet, string $value): bool {
return $this->chosenFacetValues->has($facet) &&
$this->chosenFacetValues->values($facet)->contains(new FlatFacetValue($value));
}
/**
* {@inheritdoc}
*/
public function withoutFacetValue(string $facet, FacetValueInterface $facetValue): FacetedSearchAction {
if (!$this->chosenFacetValues->has($facet)) {
throw new \InvalidArgumentException(
sprintf('there are no chosen values for facet %s', $facet)
);
}
if (!$this->chosenFacetValues->values($facet)->contains($facetValue)) {
throw new \InvalidArgumentException(
sprintf('value %s is not chosen for facet %s', $facetValue->value(), $facet)
);
}
$c = clone $this;
$values = $c->chosenFacetValues->values($facet)->without($facetValue);
if ($values->isEmpty()) {
$c->chosenFacetValues = $c->chosenFacetValues->without($facet);
}
else {
$c->chosenFacetValues = $c->chosenFacetValues->with(
$facet,
$values
);
}
return $c;
}
/**
* {@inheritdoc}
*/
public function withFacetValue(string $facet, FacetValueInterface $value): FacetedSearchAction {
if ($this->chosenFacetValues->has($facet) && $this->chosenFacetValues->values($facet)->contains($value)) {
throw new \InvalidArgumentException(
sprintf('value %s is already chosen for facet %s', $value->value(), $facet)
);
}
$valuesBase = $this->chosenFacetValues->values($facet);
$c = clone $this;
$c->chosenFacetValues = $c->chosenFacetValues->with($facet, $valuesBase->with($value));
return $c;
}
/**
* {@inheritdoc}
*/
public function withoutFacet(string $facet): FacetedSearchActionInterface {
$c = clone $this;
$c->chosenFacetValues = $c->chosenFacetValues->without($facet);
return $c;
}
/**
* {@inheritdoc}
*/
public function withFacet(string $facet, FacetValuesCollection $facetValues): FacetedSearchActionInterface {
$c = clone $this;
$c->chosenFacetValues = $this->chosenFacetValues->with($facet, $facetValues);
return $c;
}
/**
* {@inheritdoc}
*/
public function withoutFacets(): FacetedSearchActionInterface {
$c = clone $this;
$c->chosenFacetValues = new FacetCollection();
return $c;
}
/**
* {@inheritdoc}
*/
public function getSize(): int {
return $this->size;
}
/**
* {@inheritdoc}
*/
public function getFrom(): int {
return $this->from;
}
/**
* {@inheritdoc}
*/
public function from(int $from): FacetedSearchActionInterface {
$c = clone $this;
$c->from = $from;
return $c;
}
/**
* {@inheritdoc}
*/
public function nextFrom(): int {
return $this->from + $this->size;
}
/**
* {@inheritdoc}
*/
public function hasMorePages(int $total_results): bool {
return $total_results > $this->nextFrom();
}
}
