From 6066af5841fd1df21ef32ff3fa089c6e48ea4f26 Mon Sep 17 00:00:00 2001 From: Brett Tasker Date: Fri, 21 Apr 2017 16:34:04 +1200 Subject: [PATCH] Update Search Manipulater --- _config/config.yml | 3 + .../SearchManipulateCapture_MySQLDatabase.php | 17 ++++ .../SearchUpdateImmediateProcessor.php | 2 + .../processors/SearchUpdateProcessor.php | 8 +- code/search/updaters/SearchUpdater.php | 48 +++++------ tests/SearchUpdaterTest.php | 80 ++----------------- .../SearchUpdaterTest_Container.php | 31 +++++++ .../SearchUpdaterTest_HasMany.php | 20 +++++ .../SearchUpdaterTest_HasOne.php | 20 +++++ .../SearchUpdaterTest_Index.php | 17 ++++ .../SearchUpdaterTest_ManyMany.php | 20 +++++ tests/SolrIndexTest.php | 2 +- 12 files changed, 164 insertions(+), 104 deletions(-) create mode 100644 code/search/captures/SearchManipulateCapture_MySQLDatabase.php create mode 100644 tests/SearchUpdaterTest/SearchUpdaterTest_Container.php create mode 100644 tests/SearchUpdaterTest/SearchUpdaterTest_HasMany.php create mode 100644 tests/SearchUpdaterTest/SearchUpdaterTest_HasOne.php create mode 100644 tests/SearchUpdaterTest/SearchUpdaterTest_Index.php create mode 100644 tests/SearchUpdaterTest/SearchUpdaterTest_ManyMany.php diff --git a/_config/config.yml b/_config/config.yml index 7193cb2..0c6c2ab 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,3 +1,6 @@ DataObject: extensions: - 'SearchUpdater_ObjectHandler' +Database: + extensions: + - 'SearchManipulateCaptureExtension' diff --git a/code/search/captures/SearchManipulateCapture_MySQLDatabase.php b/code/search/captures/SearchManipulateCapture_MySQLDatabase.php new file mode 100644 index 0000000..f1b9296 --- /dev/null +++ b/code/search/captures/SearchManipulateCapture_MySQLDatabase.php @@ -0,0 +1,17 @@ +baseDataClass($class); $forclass = isset($this->dirty[$base]) ? $this->dirty[$base] : array(); foreach ($statefulids as $statefulid) { diff --git a/code/search/updaters/SearchUpdater.php b/code/search/updaters/SearchUpdater.php index b4460c3..9beb6ee 100644 --- a/code/search/updaters/SearchUpdater.php +++ b/code/search/updaters/SearchUpdater.php @@ -3,6 +3,14 @@ namespace SilverStripe\FullTextSearch\Search\Updaters; use SilverStripe\ORM\DB; +use SilverStripe\Core\Object; +use SilverStripe\FullTextSearch\Search\Variants\SearchVariant; +use SilverStripe\ORM\DataObject; +use SilverStripe\FullTextSearch\Search\FullTextSearch; +use SilverStripe\FullTextSearch\Search\SearchIntrospection; +use SilverStripe\Core\Injector\Injector; +use SilverStripe\FullTextSearch\Search\Processors\SearchUpdateImmediateProcessor; +use SilverStripe\FullTextSearch\Captures\SearchManipulateCapture_MySQLDatabase; /** * This class is responsible for capturing changes to DataObjects and triggering index updates of the resulting dirty index * items. @@ -15,8 +23,6 @@ use SilverStripe\ORM\DB; * * TODO: The way we bind in is awful hacky. */ -use SilverStripe\Core\Object; -use SilverStripe\ORM\DataExtension; class SearchUpdater extends Object { @@ -27,31 +33,13 @@ class SearchUpdater extends Object { global $databaseConfig; - $current = DB::getConn(); - if (!$current || !$current->currentDatabase() || @$current->isManipulationCapture) { + $current = DB::get_conn(); + if (!$current || !$current->getSelectedDatabase() || @$current->isManipulationCapture) { return; } // If not yet set, or its already captured, just return - $type = get_class($current); - $file = TEMP_FOLDER."/.cache.SMC.$type"; - - if (!is_file($file)) { - file_put_contents($file, "selectDatabase($current->currentDatabase()); - DB::setConn($captured); + $captured->selectDatabase($current->getSelectedDatabase()); + DB::set_conn($captured); } public static $registered = false; @@ -85,7 +73,9 @@ class SearchUpdater extends Object { // First, extract any state that is in the manipulation itself foreach ($manipulation as $table => $details) { - $manipulation[$table]['class'] = $table; + if (!isset($manipulation[$table]['class'])) { + $manipulation[$table]['class'] = DataObject::getSchema()->tableClass($table); + } $manipulation[$table]['state'] = array(); } @@ -105,7 +95,7 @@ class SearchUpdater extends Object $class = $details['class']; $fields = isset($details['fields']) ? $details['fields'] : array(); - $base = ClassInfo::baseDataClass($class); + $base = DataObject::getSchema()->baseDataClass($class); $key = "$id:$base:".serialize($state); $statefulids = array(array('id' => $id, 'state' => $state)); @@ -166,7 +156,7 @@ class SearchUpdater extends Object foreach ($dirtyids as $dirtyclass => $ids) { if ($ids) { if (!self::$processor) { - self::$processor = Injector::inst()->create('SearchUpdateProcessor'); + self::$processor = Injector::inst()->create(SearchUpdateImmediateProcessor::class); } self::$processor->addDirtyIDs($dirtyclass, $ids, $index); } @@ -182,7 +172,7 @@ class SearchUpdater extends Object $runningTests = class_exists('SapphireTest', false) && SapphireTest::is_running_test(); if (self::$processor && !self::$registered && !$runningTests) { - register_shutdown_function(array("SearchUpdater", "flush_dirty_indexes")); + register_shutdown_function(array(SearchUpdater::class, "flush_dirty_indexes")); self::$registered = true; } } diff --git a/tests/SearchUpdaterTest.php b/tests/SearchUpdaterTest.php index ee2df21..000283c 100644 --- a/tests/SearchUpdaterTest.php +++ b/tests/SearchUpdaterTest.php @@ -1,78 +1,13 @@ 'Varchar', - 'Field2' => 'Varchar', - 'MyDate' => 'Date', - ); - - private static $has_one = array( - 'HasOneObject' => 'SearchUpdaterTest_HasOne' - ); - - private static $has_many = array( - 'HasManyObjects' => 'SearchUpdaterTest_HasMany' - ); - - private static $many_many = array( - 'ManyManyObjects' => 'SearchUpdaterTest_ManyMany' - ); -} - -class SearchUpdaterTest_HasOne extends DataObject -{ - private static $db = array( - 'Field1' => 'Varchar', - 'Field2' => 'Varchar' - ); - - private static $has_many = array( - 'HasManyContainers' => 'SearchUpdaterTest_Container' - ); -} - -class SearchUpdaterTest_HasMany extends DataObject -{ - private static $db = array( - 'Field1' => 'Varchar', - 'Field2' => 'Varchar' - ); - - private static $has_one = array( - 'HasManyContainer' => 'SearchUpdaterTest_Container' - ); -} - -class SearchUpdaterTest_ManyMany extends DataObject -{ - private static $db = array( - 'Field1' => 'Varchar', - 'Field2' => 'Varchar' - ); - - private static $belongs_many_many = array( - 'ManyManyContainer' => 'SearchUpdaterTest_Container' - ); -} - -class SearchUpdaterTest_Index extends SearchIndex_Recording -{ - public function init() - { - $this->addClass('SearchUpdaterTest_Container'); - - $this->addFilterField('Field1'); - $this->addFilterField('HasOneObject.Field1'); - $this->addFilterField('HasManyObjects.Field1'); - } -} +use SilverStripe\Core\Config\Config; +use SilverStripe\FullTextSearch\Search\FullTextSearch; +use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_Container; +use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_HasOne; +use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_HasMany; +use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_Index; class SearchUpdaterTest extends SapphireTest { @@ -85,7 +20,7 @@ class SearchUpdaterTest extends SapphireTest parent::setUp(); if (self::$index === null) { - self::$index = singleton(get_class($this).'_Index'); + self::$index = SearchUpdaterTest_Index::singleton(); } else { self::$index->reset(); } @@ -132,7 +67,6 @@ class SearchUpdaterTest extends SapphireTest // Check the default "writing a document updates the document" SearchUpdater::flush_dirty_indexes(); - $added = self::$index->getAdded(array('ID')); // Some databases don't output $added in a consistent order; that's okay usort($added, function ($a, $b) {return $a['ID']-$b['ID']; }); diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_Container.php b/tests/SearchUpdaterTest/SearchUpdaterTest_Container.php new file mode 100644 index 0000000..a374a0a --- /dev/null +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_Container.php @@ -0,0 +1,31 @@ + 'Varchar', + 'Field2' => 'Varchar', + 'MyDate' => 'Date', + ); + + private static $table_name = 'SearchUpdaterTest_Container'; + + private static $has_one = array( + 'HasOneObject' => SearchUpdaterTest_HasOne::class + ); + + private static $has_many = array( + 'HasManyObjects' => SearchUpdaterTest_HasMany::class + ); + + private static $many_many = array( + 'ManyManyObjects' => SearchUpdaterTest_ManyMany::class + ); +} diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_HasMany.php b/tests/SearchUpdaterTest/SearchUpdaterTest_HasMany.php new file mode 100644 index 0000000..f008582 --- /dev/null +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_HasMany.php @@ -0,0 +1,20 @@ + 'Varchar', + 'Field2' => 'Varchar' + ); + + private static $table_name = 'SearchUpdaterTest_HasMany'; + + private static $has_one = array( + 'HasManyContainer' => SearchUpdaterTest_Container::class + ); +} diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_HasOne.php b/tests/SearchUpdaterTest/SearchUpdaterTest_HasOne.php new file mode 100644 index 0000000..cc81587 --- /dev/null +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_HasOne.php @@ -0,0 +1,20 @@ + 'Varchar', + 'Field2' => 'Varchar' + ); + + private static $table_name = 'SearchUpdaterTest_HasOne'; + + private static $has_many = array( + 'HasManyContainers' => SearchUpdaterTest_Container::class + ); +} diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_Index.php b/tests/SearchUpdaterTest/SearchUpdaterTest_Index.php new file mode 100644 index 0000000..2142e0e --- /dev/null +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_Index.php @@ -0,0 +1,17 @@ +addClass('SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_Container'); + + $this->addFilterField('Field1'); + $this->addFilterField('HasOneObject.Field1'); + $this->addFilterField('HasManyObjects.Field1'); + } +} diff --git a/tests/SearchUpdaterTest/SearchUpdaterTest_ManyMany.php b/tests/SearchUpdaterTest/SearchUpdaterTest_ManyMany.php new file mode 100644 index 0000000..191fe6f --- /dev/null +++ b/tests/SearchUpdaterTest/SearchUpdaterTest_ManyMany.php @@ -0,0 +1,20 @@ + 'Varchar', + 'Field2' => 'Varchar' + ); + + private static $table_name = 'SearchUpdaterTest_ManyMany'; + + private static $belongs_many_many = array( + 'ManyManyContainer' => SearchUpdaterTest_Container::class + ); +} diff --git a/tests/SolrIndexTest.php b/tests/SolrIndexTest.php index 0a6b82f..c02d62c 100644 --- a/tests/SolrIndexTest.php +++ b/tests/SolrIndexTest.php @@ -187,7 +187,7 @@ class SolrIndexTest extends SapphireTest $serviceMock = $this->getServiceMock(); $index = new SolrIndexTest_FakeIndex(); $index->setService($serviceMock); - $obj = new SearchUpdaterTest_Container(); + $obj = new Container(); $obj->Field1 = 'Field1 val'; $obj->Field2 = null;