Skip to content
<?php
namespace IQDEV\ElasticSearch\Filter;
use IQDEV\Search\Filter\FilterCollection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
class PostFilterCollection extends FilterCollection
{
......
<?php
namespace IQDEV\ElasticSearch\Filter;
use IQDEV\Search\Filter\FilterCollection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
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
namespace IQDEV\ElasticSearch\Order;
namespace IQDEV\ElasticSearch\Criteria\Order;
use IQDEV\ElasticSearch\Esable;
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
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
{
$order = [
'order' => $this->direction::getType(),
'order' => $this->direction->value,
'nested' => [
'path' => 'search_data',
'filter' => [
'bool' => [
'must' => [
'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 [
'search_data.keyword_facet.facet_value' => $order,
'search_data.keyword_facet.facet_value' => array_merge(
$order,
$this->additionalParams
),
];
}
}
<?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
{
$order = [
'order' => $this->direction::getType(),
'order' => $this->direction->value,
'nested' => [
'path' => 'search_data',
'filter' => [
'bool' => [
'must' => [
'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 [
'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
) {
}
}