diff --git a/code/search/indexes/SearchIndex.php b/code/search/indexes/SearchIndex.php index eb08855..3cf687f 100644 --- a/code/search/indexes/SearchIndex.php +++ b/code/search/indexes/SearchIndex.php @@ -6,8 +6,8 @@ use Exception; use InvalidArgumentException; use SilverStripe\View\ViewableData; use SilverStripe\ORM\DataObject; -use SilverStripe\Core\Object; use SilverStripe\Core\ClassInfo; +use SilverStripe\Core\Config\Config; use SilverStripe\FullTextSearch\Search\SearchIntrospection; use SilverStripe\FullTextSearch\Search\Variants\SearchVariant; use SilverStripe\FullTextSearch\Utils\MultipleArrayIterator; @@ -160,11 +160,15 @@ abstract class SearchIndex extends ViewableData continue; } - $class = $manyMany[2]; + $class = $manyMany['childClass']; $options['multi_valued'] = true; $options['lookup_chain'][] = array( - 'call' => 'method', 'method' => $lookup, - 'through' => 'many_many', 'class' => $dataclass, 'otherclass' => $class, 'details' => $manyMany + 'call' => 'method', + 'method' => $lookup, + 'through' => 'many_many', + 'class' => $dataclass, + 'otherclass' => $class, + 'details' => $manyMany, ); } @@ -357,7 +361,7 @@ abstract class SearchIndex extends ViewableData if (preg_match('/^(\w+)\(/', $type, $match)) { $type = $match[1]; } - list($type, $args) = Object::parse_class_spec($type); + list($type, $args) = ClassInfo::parse_class_spec($type); // Get class from shortName $object = Injector::inst()->get($type, false, ['Name' => 'test']); diff --git a/code/search/updaters/SearchUpdater.php b/code/search/updaters/SearchUpdater.php index 3a5d278..4a36d1f 100644 --- a/code/search/updaters/SearchUpdater.php +++ b/code/search/updaters/SearchUpdater.php @@ -2,8 +2,8 @@ namespace SilverStripe\FullTextSearch\Search\Updaters; +use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Injector\Injector; -use SilverStripe\Core\Object; use SilverStripe\Dev\SapphireTest; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; @@ -28,6 +28,16 @@ use ReflectionClass; class SearchUpdater { + use Configurable; + + /** + * Whether to register the shutdown function to flush. Can be disabled for example in unit testing. + * + * @config + * @var bool + */ + private static $flush_on_shutdown = true; + /** * Replace the database object with a subclass that captures all manipulations and passes them to us */ @@ -174,11 +184,7 @@ class SearchUpdater } // If we do have some work to do register the shutdown function to actually do the work - - // Don't do it if we're testing - there's no database connection outside the test methods, so we'd - // just get errors - - if (self::$processor && !self::$registered && !SapphireTest::is_running_test()) { + if (self::$processor && !self::$registered && self::config()->get('flush_on_shutdown')) { register_shutdown_function(array(SearchUpdater::class, "flush_dirty_indexes")); self::$registered = true; } diff --git a/code/solr/reindex/handlers/SolrReindexBase.php b/code/solr/reindex/handlers/SolrReindexBase.php index 50822ac..747fb36 100644 --- a/code/solr/reindex/handlers/SolrReindexBase.php +++ b/code/solr/reindex/handlers/SolrReindexBase.php @@ -3,6 +3,7 @@ namespace SilverStripe\FullTextSearch\Solr\Reindex\Handlers; use Psr\Log\LoggerInterface; +use SilverStripe\Core\Environment; use SilverStripe\FullTextSearch\Solr\Solr; use SilverStripe\FullTextSearch\Solr\SolrIndex; use SilverStripe\FullTextSearch\Search\Variants\SearchVariant; @@ -146,7 +147,7 @@ abstract class SolrReindexBase implements SolrReindexHandler LoggerInterface $logger, SolrIndex $indexInstance, $state, $class, $groups, $group ) { // Set time limit and state - increase_time_limit_to(); + Environment::increaseTimeLimitTo(); SearchVariant::activate_state($state); $logger->info("Adding $class"); diff --git a/tests/SearchUpdaterTest.php b/tests/SearchUpdaterTest.php index d62f33a..c56764f 100644 --- a/tests/SearchUpdaterTest.php +++ b/tests/SearchUpdaterTest.php @@ -18,8 +18,10 @@ class SearchUpdaterTest extends SapphireTest private static $index = null; - public function setUp() + protected function setUp() { + Config::modify()->set(SearchUpdater::class, 'flush_on_shutdown', false); + parent::setUp(); if (self::$index === null) { diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_ExtendedContainer.php b/tests/SearchUpdaterTest/SearchUpdaterTest_ExtendedContainer.php index f1e46fc..9daae7b 100644 --- a/tests/SearchUpdaterTest/SearchUpdaterTest_ExtendedContainer.php +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_ExtendedContainer.php @@ -7,7 +7,9 @@ namespace SilverStripe\FullTextSearch\Tests\SearchUpdaterTest; */ class SearchUpdaterTest_ExtendedContainer extends SearchUpdaterTest_OtherContainer { - private static $db = array( + private static $table_name = 'SearchUpdaterTest_ExtendedContainer'; + + private static $db = [ 'SomeField' => 'Varchar', - ); + ]; } diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_OtherContainer.php b/tests/SearchUpdaterTest/SearchUpdaterTest_OtherContainer.php index 3ab461f..78f105a 100644 --- a/tests/SearchUpdaterTest/SearchUpdaterTest_OtherContainer.php +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_OtherContainer.php @@ -9,6 +9,8 @@ use SilverStripe\ORM\DataObject; */ class SearchUpdaterTest_OtherContainer extends DataObject { + private static $table_name = 'SearchUpdaterTest_OtherContainer'; + private static $has_many = [ 'HasManyObjects' => SearchUpdaterTest_HasMany::class, ]; diff --git a/tests/SearchVariantVersionedTest.php b/tests/SearchVariantVersionedTest.php index f0a7695..37c28c9 100644 --- a/tests/SearchVariantVersionedTest.php +++ b/tests/SearchVariantVersionedTest.php @@ -24,8 +24,10 @@ class SearchVariantVersionedTest extends SapphireTest SearchVariantVersionedTest_Item::class ); - public function setUp() + protected function setUp() { + Config::modify()->set(SearchUpdater::class, 'flush_on_shutdown', false); + parent::setUp(); if (self::$index === null) { @@ -34,7 +36,7 @@ class SearchVariantVersionedTest extends SapphireTest SearchUpdater::bind_manipulation_capture(); - Config::modify()->set('Injector', SearchUpdateProcessor::class, array( + Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array( 'class' => SearchUpdateImmediateProcessor::class )); diff --git a/tests/SolrIndexSubsitesTest.php b/tests/SolrIndexSubsitesTest.php index 9bd7bd1..0fdd82f 100644 --- a/tests/SolrIndexSubsitesTest.php +++ b/tests/SolrIndexSubsitesTest.php @@ -11,8 +11,8 @@ if (class_exists('\Phockito')) { * Subsite specific solr testing */ class SolrIndexSubsitesTest extends SapphireTest { - - public static $fixture_file = 'SolrIndexSubsitesTest/SolrIndexSubsitesTest.yml'; + // @todo + // protected static $fixture_file = 'SolrIndexSubsitesTest/SolrIndexSubsitesTest.yml'; /** * @var SolrIndexSubsitesTest_Index @@ -21,16 +21,16 @@ class SolrIndexSubsitesTest extends SapphireTest { protected $server = null; - public function setUp() + protected function setUp() { + parent::setUp(); + // Prevent parent::setUp() crashing on db build if (!class_exists('Subsite')) { $this->skipTest = true; $this->markTestSkipped("These tests need the Subsite module installed to run"); } - parent::setUp(); - $this->server = $_SERVER; if (!class_exists('\Phockito')) { @@ -39,13 +39,6 @@ class SolrIndexSubsitesTest extends SapphireTest { return; } - // Check versioned available - if (!class_exists('Subsite')) { - $this->skipTest = true; - $this->markTestSkipped('The subsite module is not installed'); - return; - } - if (self::$index === null) { self::$index = singleton('SolrIndexSubsitesTest_Index'); } @@ -60,9 +53,9 @@ class SolrIndexSubsitesTest extends SapphireTest { SearchUpdater::clear_dirty_indexes(); } - public function tearDown() + protected function tearDown() { - if($this->server) { + if ($this->server) { $_SERVER = $this->server; $this->server = null; } diff --git a/tests/SolrIndexTest.php b/tests/SolrIndexTest.php index 16c26fe..24cb994 100644 --- a/tests/SolrIndexTest.php +++ b/tests/SolrIndexTest.php @@ -1,5 +1,7 @@ fieldData('HasManyObjects.Field1'); - $this->assertArrayHasKey('SearchUpdaterTest_Container_HasManyObjects_Field1', $data); - $this->assertArrayHasKey('SearchUpdaterTest_OtherContainer_HasManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_Container::class . '_HasManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_OtherContainer::class . '_HasManyObjects_Field1', $data); - $dataContainer = $data['SearchUpdaterTest_Container_HasManyObjects_Field1']; + $dataContainer = $data[SearchUpdaterTest_Container::class . '_HasManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['origin']); $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['base']); $this->assertEquals(SearchUpdaterTest_HasMany::class, $dataContainer['class']); - $dataOtherContainer = $data['SearchUpdaterTest_OtherContainer_HasManyObjects_Field1']; + $dataOtherContainer = $data[SearchUpdaterTest_OtherContainer::class . '_HasManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['origin']); $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['base']); $this->assertEquals(SearchUpdaterTest_HasMany::class, $dataOtherContainer['class']); @@ -77,15 +77,15 @@ class SolrIndexTest extends SapphireTest $index = new SolrIndexTest_AmbiguousRelationIndex(); $data = $index->fieldData('ManyManyObjects.Field1'); - $this->assertArrayHasKey('SearchUpdaterTest_Container_ManyManyObjects_Field1', $data); - $this->assertArrayHasKey('SearchUpdaterTest_OtherContainer_ManyManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_Container::class . '_ManyManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_OtherContainer::class . '_ManyManyObjects_Field1', $data); - $dataContainer = $data['SearchUpdaterTest_Container_ManyManyObjects_Field1']; + $dataContainer = $data[SearchUpdaterTest_Container::class . '_ManyManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['origin']); $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['base']); $this->assertEquals(SearchUpdaterTest_ManyMany::class, $dataContainer['class']); - $dataOtherContainer = $data['SearchUpdaterTest_OtherContainer_ManyManyObjects_Field1']; + $dataOtherContainer = $data[SearchUpdaterTest_OtherContainer::class . '_ManyManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['origin']); $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['base']); $this->assertEquals(SearchUpdaterTest_ManyMany::class, $dataOtherContainer['class']); @@ -96,16 +96,16 @@ class SolrIndexTest extends SapphireTest $index = new SolrIndexTest_AmbiguousRelationInheritedIndex(); $data = $index->fieldData('ManyManyObjects.Field1'); - $this->assertArrayHasKey('SearchUpdaterTest_Container_ManyManyObjects_Field1', $data); - $this->assertArrayHasKey('SearchUpdaterTest_OtherContainer_ManyManyObjects_Field1', $data); - $this->assertArrayNotHasKey('SearchUpdaterTest_ExtendedContainer_ManyManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_Container::class . '_ManyManyObjects_Field1', $data); + $this->assertArrayHasKey(SearchUpdaterTest_OtherContainer::class . '_ManyManyObjects_Field1', $data); + $this->assertArrayNotHasKey(SearchUpdaterTest_ExtendedContainer::class . '_ManyManyObjects_Field1', $data); - $dataContainer = $data['SearchUpdaterTest_Container_ManyManyObjects_Field1']; + $dataContainer = $data[SearchUpdaterTest_Container::class . '_ManyManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['origin']); $this->assertEquals(SearchUpdaterTest_Container::class, $dataContainer['base']); $this->assertEquals(SearchUpdaterTest_ManyMany::class, $dataContainer['class']); - $dataOtherContainer = $data['SearchUpdaterTest_OtherContainer_ManyManyObjects_Field1']; + $dataOtherContainer = $data[SearchUpdaterTest_OtherContainer::class . '_ManyManyObjects_Field1']; $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['origin']); $this->assertEquals(SearchUpdaterTest_OtherContainer::class, $dataOtherContainer['base']); $this->assertEquals(SearchUpdaterTest_ManyMany::class, $dataOtherContainer['class']); @@ -248,8 +248,7 @@ class SolrIndexTest extends SapphireTest public function testAddFieldExtraOptions() { - Config::nest(); - Director::set_environment_type('live'); + Injector::inst()->get(Kernel::class)->setEnvironment('live'); $index = new SolrIndexTest_FakeIndex(); @@ -261,8 +260,6 @@ class SolrIndexTest extends SapphireTest $defs = simplexml_load_string('' . $index->getFieldDefinitions() . ''); $defField1 = $defs->xpath('field[@name="' . SearchUpdaterTest_Container::class . '_Field1"]'); $this->assertEquals((string)$defField1[0]['stored'], 'true'); - - Config::unnest(); } public function testAddAnalyzer() diff --git a/tests/SolrIndexVersionedTest.php b/tests/SolrIndexVersionedTest.php index 70b83a7..35ba3b2 100644 --- a/tests/SolrIndexVersionedTest.php +++ b/tests/SolrIndexVersionedTest.php @@ -27,8 +27,10 @@ class SolrIndexVersionedTest extends SapphireTest SolrIndexVersionedTest_Object::class ); - public function setUp() + protected function setUp() { + Config::modify()->set(SearchUpdater::class, 'flush_on_shutdown', false); + parent::setUp(); if (self::$index === null) { @@ -37,7 +39,7 @@ class SolrIndexVersionedTest extends SapphireTest SearchUpdater::bind_manipulation_capture(); - Config::modify()->set('Injector', SearchUpdateProcessor::class, array( + Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array( 'class' => SearchUpdateImmediateProcessor::class )); diff --git a/tests/SolrReindexTest.php b/tests/SolrReindexTest.php index 7f2dd85..6a3a069 100644 --- a/tests/SolrReindexTest.php +++ b/tests/SolrReindexTest.php @@ -2,6 +2,7 @@ use SilverStripe\Dev\SapphireTest; use SilverStripe\FullTextSearch\Search\FullTextSearch; +use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater; use SilverStripe\FullTextSearch\Search\Variants\SearchVariant; use SilverStripe\FullTextSearch\Tests\SolrReindexTest\SolrReindexTest_Variant; use SilverStripe\FullTextSearch\Tests\SolrReindexTest\SolrReindexTest_Index; @@ -38,14 +39,17 @@ class SolrReindexTest extends SapphireTest */ protected $service = null; - public function setUp() + protected function setUp() { + Config::modify()->set(SearchUpdater::class, 'flush_on_shutdown', false); + parent::setUp(); // Set test handler for reindex - Config::modify()->set('Injector', SolrReindexHandler::class, array( + Config::modify()->set(Injector::class, SolrReindexHandler::class, array( 'class' => SolrReindexTest_TestHandler::class )); + Injector::inst()->registerService(new SolrReindexTest_TestHandler(), SolrReindexHandler::class); // Set test variant @@ -55,6 +59,7 @@ class SolrReindexTest extends SapphireTest $this->service = $this->getServiceMock(); $this->index = singleton(SolrReindexTest_Index::class); $this->index->setService($this->service); + FullTextSearch::force_index_list($this->index); }