Commit ae723d87 authored by Pavel's avatar Pavel
Browse files

nested filter collections, logic operator

parent ae29226d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -2,23 +2,23 @@

namespace IQDEV\Search;

use IQDEV\Search\Filter\FilterCollection;
use IQDEV\Search\Filter\FilterGroupCollection;
use IQDEV\Search\Order\OrderCollection;

final class Criteria
{
    private FilterCollection $filters;
    private FilterGroupCollection $filters;
    private OrderCollection $sorting;
    private Pagination $pagination;

    public function __construct()
    {
        $this->filters = new FilterCollection();
        $this->filters = new FilterGroupCollection();
        $this->sorting = new OrderCollection();
        $this->pagination = new Pagination();
    }

    public function filters(): FilterCollection
    public function filters(): FilterGroupCollection
    {
        return $this->filters;
    }
+22 −0
Original line number Diff line number Diff line
@@ -6,6 +6,14 @@ use Ramsey\Collection\AbstractCollection;

class FilterCollection extends AbstractCollection
{
    /** @var LogicOperator Тип логической операции для коллекции */
    protected LogicOperator $type;

    public function __construct(array $data = [])
    {
        parent::__construct($data);
        $this->type = new LogicOperator(LogicOperator::AND);
    }

    /**
     * @inheritDoc
@@ -14,4 +22,18 @@ class FilterCollection extends AbstractCollection
    {
        return Filter::class;
    }

    /**
     * Установка типа логической операции
     *
     * @param LogicOperator $type
     *
     * @return $this
     */
    public function setLogicalType(LogicOperator $type): self
    {
        $this->type = $type;

        return $this;
    }
}
+39 −0
Original line number Diff line number Diff line
<?php

namespace IQDEV\Search\Filter;

use Ramsey\Collection\AbstractCollection;

class FilterGroupCollection extends AbstractCollection
{
    /** @var LogicOperator Тип логической операции для коллекции */
    protected LogicOperator $type;

    public function __construct(array $data = [])
    {
        parent::__construct($data);
        $this->type = new LogicOperator(LogicOperator::AND);
    }

    /**
     * @inheritDoc
     */
    public function getType(): string
    {
        return FilterCollection::class;
    }

    /**
     * Установка типа логической операции
     *
     * @param LogicOperator $type
     *
     * @return $this
     */
    public function setLogicalType(LogicOperator $type): self
    {
        $this->type = $type;

        return $this;
    }
}
+35 −0
Original line number Diff line number Diff line
<?php

namespace IQDEV\Search\Filter;

final class LogicOperator
{
    public const AND = 'AND';
    public const OR = 'OR';
    private string $operator;

    public function __construct(string $operator)
    {
        if (!in_array($operator, self::toArray(), true)) {
            throw new \InvalidArgumentException(sprintf('invalid operator %s', $operator));
        }

        $this->operator = $operator;
    }

    public function value(): string
    {
        return $this->operator;
    }

    /**
     * @return string[]
     */
    public static function toArray(): array
    {
        return [
            self::AND,
            self::OR
        ];
    }
}