<?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)); } }