Skip to content
Snippets Groups Projects
QueryAndPostFilterTest.php 19.33 KiB
<?php

namespace IQDEV\ElasticSearchTests\Filter;

use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient;
use IQDEV\Search\Criteria;
use IQDEV\Search\Filter\Field;
use IQDEV\Search\Filter\Filter;
use IQDEV\Search\Filter\FilterGroupCollection;
use IQDEV\Search\Filter\FilterKeyword;
use IQDEV\Search\Filter\FilterNumber;
use IQDEV\Search\Filter\FilterOperator;
use IQDEV\Search\Filter\FilterType;
use IQDEV\Search\Filter\LogicOperator;
use IQDEV\Search\Query\SearchQuery;

class QueryAndPostFilterTest extends AbstractTestCase
{
    /**
     * query по не сущ бренду
     */
    public function testQueryNonExistentBrand()
    {
        $criteria = new Criteria();

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('not')
            )
        ]);
        $filterCollectionBrand->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => []
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ бренду
     * @return void
     */
    public function testQueryExistingBrand()
    {
        $criteria = new Criteria();

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('adidas')
            )
        ]);
        $filterCollectionBrand->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                's1',
                's2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ бренду и post_filter по бренду
     * @return void
     */
    public function testQueryExistingBrandAndPostFilterExistingBrand()
    {
        $criteria = new Criteria();

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('adidas')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $criteria->filters()->add($filterCollectionBrand);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                's4',
                'h1',
                'h2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ бренду и post_filter по цвету
     * @return void
     */
    public function testQueryExistingBrandAndPostFilterExistingColor()
    {
        $criteria = new Criteria();
        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('white')
            ),
        ]);
        $criteria->filters()->add($filterCollectionColor);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ бренду и цвету и post_filter по бренду
     * @return void
     */
    public function testQueryExistingBrandAndColorAndPostFilterExistingColor()
    {
        $criteria = new Criteria();

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('rebook')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('white')
            ),
        ]);
        $filterCollectionColor->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionColor);
        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $criteria->filters()->add($filterCollectionBrand);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ бренду и post_filter по бренду и цвету
     * @return void
     */
    public function testQueryExistingBrandAndColorAndPostFilterExistingBrandAndColor()
    {
        $criteria = new Criteria();

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('rebook')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('white')
            ),
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('blue')
            ),
        ]);
        $filterCollectionColor
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionColor);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $criteria->filters()->add($filterCollectionBrand);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('white')
            ),
        ]);
        $criteria->filters()->add($filterCollectionColor);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по не сущ цене
     * @return void
     */
    public function testQueryNonExistentPrice()
    {
        $criteria = new Criteria();

        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(108)
            )
        ]);
        $filterCollectionPrice->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionPrice);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => []
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене
     * @return void
     */
    public function testQueryExistingPrice()
    {
        $criteria = new Criteria();

        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(105)
            )
        ]);
        $filterCollectionPrice->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionPrice);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h2',
                'h3',
                'p1',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене и бренду
     * @return void
     */
    public function testQueryExistingPriceAndBrand()
    {
        $criteria = new Criteria();

        $filterCollection = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(104)
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $filterCollection->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollection);

        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h1',
                'h2',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене и бренду и post_filter по цвету
     * @return void
     */
    public function testQueryExistingPriceAndBrandAndPostFilterColor()
    {
        $criteria = new Criteria();

        $filterCollection = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(104)
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $filterCollection->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollection);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('red')
            ),
        ]);
        $criteria->filters()->add($filterCollectionColor);

        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                'h1',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене и бренду и post_filter по цвету и бренду
     * @return void
     */
    public function testQueryExistingPriceAndBrandAndPostFilterColorAndBrand()
    {
        $criteria = new Criteria();

        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::LTE),
                new FilterNumber(104)
            ),
        ]);
        $filterCollectionPrice->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionPrice);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('adidas')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);


        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('green')
            ),
        ]);
        $criteria->filters()->add($filterCollectionColor);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
        ]);
        $criteria->filters()->add($filterCollectionBrand);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                's4',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене и бренду и post_filter по цене
     * @return void
     */
    public function testQueryExistingPriceAndBrandAndPostFilterPrice()
    {
        $criteria = new Criteria();

        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::LTE),
                new FilterNumber(104)
            ),
        ]);
        $filterCollectionPrice->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionPrice);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('adidas')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);


        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(102)
            ),
        ]);
        $criteria->filters()->add($filterCollectionPrice);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                's4',
                'h1',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }

    /**
     * query по сущ цене и бренду и post_filter по цвету и цене
     * @return void
     */
    public function testQueryExistingPriceAndBrandAndPostFilterPriceAndColor()
    {
        $criteria = new Criteria();

        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::LTE),
                new FilterNumber(104)
            ),
        ]);
        $filterCollectionPrice->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionPrice);

        $filterCollectionBrand = new FilterGroupCollection([
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('nike')
            ),
            new Filter(
                new Field('brand'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('adidas')
            ),
        ]);
        $filterCollectionBrand
            ->setLogicalType(LogicOperator::or())
            ->setFilterType(FilterType::query());
        $criteria->filters()->add($filterCollectionBrand);


        $filterCollectionPrice = new FilterGroupCollection([
            new Filter(
                new Field('price'),
                new FilterOperator(FilterOperator::GTE),
                new FilterNumber(102)
            ),
        ]);
        $criteria->filters()->add($filterCollectionPrice);

        $filterCollectionColor = new FilterGroupCollection([
            new Filter(
                new Field('color'),
                new FilterOperator(FilterOperator::EQ),
                new FilterKeyword('green')
            ),
        ]);
        $criteria->filters()->add($filterCollectionColor);


        $q = new SearchQuery($criteria);
        $handler = SearchClient::getInstance();
        $result = $handler->handle($q)->result;

        $expected = [
            'hits' => [
                's4',
            ]
        ];

        $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
    }
}