Skip to content
<?php <?php
namespace IQDEV\ElasticSearch\Filter; namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
use IQDEV\Search\Filter\FilterCollection;
class PostFilterCollection extends FilterCollection class PostFilterCollection extends FilterCollection
{ {
......
<?php <?php
namespace IQDEV\ElasticSearch\Filter; namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
use IQDEV\Search\Filter\FilterCollection;
class QueryFilterCollection extends FilterCollection class QueryFilterCollection extends FilterCollection
{ {
......
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
final class Field
{
public function __construct(
protected string $value
) {
}
public function value(): string
{
return $this->value;
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
final class Filter
{
public function __construct(
private Field $field,
private FilterOperator $operator,
private FilterValue $value
) {
}
public function field(): Field
{
return $this->field;
}
public function operator(): FilterOperator
{
return $this->operator;
}
public function value(): FilterValue
{
return $this->value;
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum FilterOperator: string
{
case EQ = 'eq';
case NE = 'ne';
case GT = 'gt';
case LT = 'lt';
case GTE = 'gte';
case LTE = 'lte';
case CONTAINS = 'contains';
case NOT_CONTAINS = 'not_contains';
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum FilterType
{
case POST;
case QUERY;
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
interface FilterValue
{
public function value();
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum LogicOperator: string
{
case AND = 'and';
case OR = 'or';
case NOT = 'not';
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter\Value;
use IQDEV\ElasticSearch\Criteria\Filter\FilterValue;
class FilterKeyword implements FilterValue
{
/**
* @param string|string[] $value
*/
public function __construct(
public string|array $value
) {
}
/**
* @return string|string[]
*/
public function value(): string|array
{
return $this->value;
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Filter\Value;
use IQDEV\ElasticSearch\Criteria\Filter\FilterValue;
class FilterNumber implements FilterValue
{
/**
* @param float $value
*/
public function __construct(
public float $value
) {
}
public function value(): float
{
return $this->value;
}
}
<?php
declare(strict_types=1);
namespace IQDEV\ElasticSearch\Criteria\Match;
use IQDEV\ElasticSearch\Esable;
class QueryMatch implements Esable
{
public function __construct(
private readonly string $key,
private readonly mixed $value,
) {
}
public function es(): array
{
return [
$this->key => [
'query' => $this->value
]
];
}
}
<?php
declare(strict_types=1);
namespace IQDEV\ElasticSearch\Criteria\Match;
use IQDEV\ElasticSearch\Esable;
use Ramsey\Collection\AbstractCollection;
class QueryMatchCollection extends AbstractCollection implements Esable
{
/**
* @inheritDoc
*/
public function getType(): string
{
return QueryMatch::class;
}
public function es(): array
{
$matches = [];
foreach ($this->toArray() as $match) {
/** @var QueryMatch $match */
$matches = array_merge($match->es());
}
return $matches;
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Order;
use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Esable;
abstract class Order implements Esable
{
public function __construct(
protected Property $property,
protected OrderDirection $direction,
protected array $additionalParams = [],
) {
}
public function getProperty(): Property
{
return $this->property;
}
public function getDirection(): OrderDirection
{
return $this->direction;
}
public function getAdditionalParams(): array
{
return $this->additionalParams;
}
}
<?php <?php
namespace IQDEV\ElasticSearch\Order; namespace IQDEV\ElasticSearch\Criteria\Order;
use IQDEV\ElasticSearch\Esable; use IQDEV\ElasticSearch\Esable;
use Ramsey\Collection\AbstractCollection; use Ramsey\Collection\AbstractCollection;
......
<?php
namespace IQDEV\ElasticSearch\Criteria\Order;
enum OrderDirection: string
{
case ASC = 'asc';
case DESC = 'desc';
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Order;
use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Document\Property\PropertyType;
use IQDEV\ElasticSearch\Criteria\Order\Type\BaseOrder;
use IQDEV\ElasticSearch\Criteria\Order\Type\KeywordPropertyOrder;
use IQDEV\ElasticSearch\Criteria\Order\Type\NumberPropertyOrder;
class OrderFactory
{
public static function createByProperty(
Property $property,
OrderDirection $direction,
): Order {
return match ($property->getType()) {
PropertyType::KEYWORD => new KeywordPropertyOrder($property, $direction),
PropertyType::NUMBER => new NumberPropertyOrder($property, $direction),
default => new BaseOrder($property, $direction),
};
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Order\Type;
use IQDEV\ElasticSearch\Criteria\Order\Order;
class BaseOrder extends Order
{
public function es(): array
{
return array_merge(
[$this->property->getKey() => $this->direction->value],
$this->additionalParams
);
}
}
<?php <?php
namespace IQDEV\ElasticSearch\Order; namespace IQDEV\ElasticSearch\Criteria\Order\Type;
class OrderKeywordProperty extends Order use IQDEV\ElasticSearch\Criteria\Order\Order;
class KeywordPropertyOrder extends Order
{ {
public function es(): array public function es(): array
{ {
$order = [ $order = [
'order' => $this->direction::getType(), 'order' => $this->direction->value,
'nested' => [ 'nested' => [
'path' => 'search_data', 'path' => 'search_data',
'filter' => [ 'filter' => [
'bool' => [ 'bool' => [
'must' => [ 'must' => [
'term' => [ 'term' => [
'search_data.keyword_facet.facet_code' => $this->by, 'search_data.keyword_facet.facet_code' => $this->property->getKey(),
] ],
], ],
], ],
], ],
], ],
]; ];
$order = array_merge($order, $this->properties);
return [ return [
'search_data.keyword_facet.facet_value' => $order, 'search_data.keyword_facet.facet_value' => array_merge(
$order,
$this->additionalParams
),
]; ];
} }
} }
<?php <?php
namespace IQDEV\ElasticSearch\Order; namespace IQDEV\ElasticSearch\Criteria\Order\Type;
class OrderNumberProperty extends Order use IQDEV\ElasticSearch\Criteria\Order\Order;
class NumberPropertyOrder extends Order
{ {
public function es(): array public function es(): array
{ {
$order = [ $order = [
'order' => $this->direction::getType(), 'order' => $this->direction->value,
'nested' => [ 'nested' => [
'path' => 'search_data', 'path' => 'search_data',
'filter' => [ 'filter' => [
'bool' => [ 'bool' => [
'must' => [ 'must' => [
'term' => [ 'term' => [
'search_data.number_facet.facet_code' => $this->by, 'search_data.number_facet.facet_code' => $this->property->getKey(),
] ],
], ],
], ],
], ],
], ],
]; ];
$order = array_merge($order, $this->properties);
return [ return [
'search_data.number_facet.facet_value' => $order, 'search_data.number_facet.facet_value' => array_merge(
$order,
$this->additionalParams
),
]; ];
} }
} }
<?php
namespace IQDEV\ElasticSearch\Criteria;
final class Pagination
{
public function __construct(
public int $limit = 20,
public int $offset = 0
) {
}
}