Source of file SolrWritersTest.php
Size: 7,634 Bytes - Last Modified: 2021-12-23T10:31:32+00:00
/var/www/docs.ssmods.com/process/src/tests/SolrWritersTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 | <?php namespace SilverStripe\FullTextSearch\Tests; use \InvalidArgumentException; use SilverStripe\Dev\SapphireTest; use SilverStripe\FullTextSearch\Search\Adapters\SolrSearchAdapter; use SilverStripe\FullTextSearch\Search\Criteria\SearchCriteria; use SilverStripe\FullTextSearch\Search\Criteria\SearchCriterion; use SilverStripe\FullTextSearch\Search\Queries\SearchQuery; use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterBasic; use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterIn; use SilverStripe\FullTextSearch\Solr\Writers\SolrSearchQueryWriterRange; use SilverStripe\FullTextSearch\Tests\SolrIndexTest\SolrIndexTest_FakeIndex; /** * Class SolrWritersTest * @package SilverStripe\FullTextSearch\Tests */ class SolrWritersTest extends SapphireTest { public function testBasicEqualQueryString() { $criteria = new SearchCriterion('Title', 'Test', SearchCriterion::EQUAL); $writer = SolrSearchQueryWriterBasic::create(); $expected = '+(Title:"Test")'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicNotEqualQueryString() { $criteria = new SearchCriterion('Title', 'Test', SearchCriterion::NOT_EQUAL); $writer = SolrSearchQueryWriterBasic::create(); $expected = '-(Title:"Test")'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicInQueryString() { $criteria = new SearchCriterion('ID', [1,2,3], SearchCriterion::IN); $writer = SolrSearchQueryWriterIn::create(); $expected = '+(ID:1 ID:2 ID:3)'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicNotInQueryString() { $criteria = new SearchCriterion('ID', [1,2,3], SearchCriterion::NOT_IN); $writer = SolrSearchQueryWriterIn::create(); $expected = '-(ID:1 ID:2 ID:3)'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicGreaterEqualQueryString() { $criteria = new SearchCriterion('Stock', 2, SearchCriterion::GREATER_EQUAL); $writer = SolrSearchQueryWriterRange::create(); $expected = '+(Stock:[2 TO *])'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicGreaterQueryString() { $criteria = new SearchCriterion('Stock', 2, SearchCriterion::GREATER_THAN); $writer = SolrSearchQueryWriterRange::create(); $expected = '+(Stock:{2 TO *})'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicLessEqualQueryString() { $criteria = new SearchCriterion('Stock', 2, SearchCriterion::LESS_EQUAL); $writer = SolrSearchQueryWriterRange::create(); $expected = '+(Stock:[* TO 2])'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicLessQueryString() { $criteria = new SearchCriterion('Stock', 2, SearchCriterion::LESS_THAN); $writer = SolrSearchQueryWriterRange::create(); $expected = '+(Stock:{* TO 2})'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicIsNullQueryString() { $criteria = new SearchCriterion('Stock', null, SearchCriterion::ISNULL); $writer = SolrSearchQueryWriterRange::create(); $expected = '-(Stock:[* TO *])'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testBasicIsNotNullQueryString() { $criteria = new SearchCriterion('Stock', null, SearchCriterion::ISNOTNULL); $writer = SolrSearchQueryWriterRange::create(); $expected = '+(Stock:[* TO *])'; $this->assertEquals($expected, $writer->generateQueryString($criteria)); } public function testConjunction() { $adapter = new SolrSearchAdapter(); $this->assertEquals(' AND ', $adapter->getConjunctionFor(SearchCriteria::CONJUNCTION_AND)); $this->assertEquals(' OR ', $adapter->getConjunctionFor(SearchCriteria::CONJUNCTION_OR)); } public function testConjunctionFailure() { $this->expectException(\InvalidArgumentException::class); $adapter = new SolrSearchAdapter(); $adapter->getConjunctionFor('FAIL'); } /** * @throws \Exception */ public function testComplexPositiveFilterQueryString() { $expected = '+((+(Page_TaxonomyTerms_ID:"Lego") AND +(Page_TaxonomyTerms_ID:"StarWars") AND +(Stock:[5 TO *]))'; $expected .= ' OR (+(Page_TaxonomyTerms_ID:"Books") AND +(Page_TaxonomyTerms_ID:"HarryPotter")'; $expected .= ' AND +(Stock:[1 TO *])))'; $legoCriteria = SearchCriteria::create( 'Page_TaxonomyTerms_ID', [ 'Lego', ], SearchCriterion::IN ); $legoCriteria->addAnd( 'Page_TaxonomyTerms_ID', [ 'StarWars', ], SearchCriterion::IN ); $legoCriteria->addAnd( 'Stock', 5, SearchCriterion::GREATER_EQUAL ); $booksCriteria = SearchCriteria::create( 'Page_TaxonomyTerms_ID', [ 'Books', ], SearchCriterion::IN ); $booksCriteria->addAnd( 'Page_TaxonomyTerms_ID', [ 'HarryPotter', ], SearchCriterion::IN ); $booksCriteria->addAnd( 'Stock', 1, SearchCriterion::GREATER_EQUAL ); // Combine the two criteria with an `OR` conjunction $criteria = SearchCriteria::create($legoCriteria)->addOr($booksCriteria); $query = SearchQuery::create(); $query->filterBy($criteria); $index = new SolrIndexTest_FakeIndex(); $this->assertTrue(in_array($expected, $index->getFiltersComponent($query))); } /** * @throws \Exception */ public function testComplexNegativeFilterQueryString() { $expected = '+((-(Page_TaxonomyTerms_ID:"Lego" Page_TaxonomyTerms_ID:"StarWars") AND +(Stock:[* TO 5]))'; $expected .= ' OR (-(Page_TaxonomyTerms_ID:"Books" Page_TaxonomyTerms_ID:"HarryPotter")'; $expected .= ' AND +(Stock:[* TO 2])))'; $legoCriteria = SearchCriteria::create( 'Page_TaxonomyTerms_ID', [ 'Lego', 'StarWars', ], SearchCriterion::NOT_IN ); $legoCriteria->addAnd( 'Stock', 5, SearchCriterion::LESS_EQUAL ); $booksCriteria = SearchCriteria::create( 'Page_TaxonomyTerms_ID', [ 'Books', 'HarryPotter', ], SearchCriterion::NOT_IN ); $booksCriteria->addAnd( 'Stock', 2, SearchCriterion::LESS_EQUAL ); // Combine the two criteria with an `OR` conjunction $criteria = SearchCriteria::create($legoCriteria)->addOr($booksCriteria); $query = SearchQuery::create(); $query->filterBy($criteria); $index = new SolrIndexTest_FakeIndex(); $this->assertTrue(in_array($expected, $index->getFiltersComponent($query))); } } |