diff --git a/Filter/AndFilter.php b/Filter/AndFilter.php index b8d1154f276802a0f8894be460358787aac42b0e..a3bfb168b746a68e02c6c2380e85b7b2ee715cd1 100644 --- a/Filter/AndFilter.php +++ b/Filter/AndFilter.php @@ -16,32 +16,60 @@ use ONGR\ElasticsearchBundle\DSL\ParametersTrait; /** * Represents Elasticsearch "and" filter. + * + * @link http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-and-filter.html */ class AndFilter implements BuilderInterface { use ParametersTrait; /** - * @var BuilderInterface[] + * @var array */ - private $filters; - + private $filters = []; + /** - * @param BuilderInterface[] $filters Array. + * @param BuilderInterface[] $filters Filter array. * @param array $parameters Optional parameters. */ - public function __construct($filters, array $parameters = []) + public function __construct(array $filters = [], array $parameters = []) { - $this->filters = $filters; + $this->set($filters); $this->setParameters($parameters); } /** - * {@inheritdoc} + * Sets filters. + * + * @param BuilderInterface[] $filters Filter array. */ - public function getType() + public function set(array $filters) { - return 'and'; + foreach ($filters as $filter) { + $this->add($filter); + } + } + + /** + * Adds filter. + * + * @param BuilderInterface $filter + * + * @return AndFilter + */ + public function add(BuilderInterface $filter) + { + $this->filters[] = [$filter->getType() => $filter->toArray()]; + + return $this; + } + + /** + * Clears filters. + */ + public function clear() + { + $this->filters = []; } /** @@ -49,14 +77,22 @@ class AndFilter implements BuilderInterface */ public function toArray() { - $query = []; + $query = $this->processArray(); - foreach ($this->filters as $filter) { - $query['filters'][] = [$filter->getType() => $filter->toArray()]; + if (count($query) > 0) { + $query['filters'] = $this->filters; + } else { + $query = $this->filters; } - $output = $this->processArray($query); + return $query; + } - return $output; + /** + * {@inheritdoc} + */ + public function getType() + { + return 'and'; } }