API Remove bind_manipulation_capture and RequestFilter, use Injector instead

This commit is contained in:
Robbie Averill 2017-12-04 11:53:37 +13:00
parent fccac37621
commit 45c402fc4c
16 changed files with 74 additions and 116 deletions

View File

@ -1,7 +0,0 @@
<?php
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
if (isset($databaseConfig['type'])) {
SearchUpdater::bind_manipulation_capture();
}

View File

@ -1,5 +0,0 @@
SilverStripe\Core\Injector\Injector:
SilverStripe\Control\RequestProcessor:
properties:
filters:
- '%$SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater_BindManipulationCaptureFilter'

View File

@ -1,3 +1,6 @@
---
Name: fulltextsearchconfig
---
SilverStripe\ORM\DataObject:
extensions:
- 'SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater_ObjectHandler'
- SilverStripe\FullTextSearch\Search\Extensions\SearchUpdater_ObjectHandler

28
_config/database.yml Normal file
View File

@ -0,0 +1,28 @@
---
Name: fulltextsearchmysql
After:
- 'databaseconnectors'
---
SilverStripe\Core\Injector\Injector:
MySQLDatabase:
class: SilverStripe\FullTextSearch\Search\Captures\SearchManipulateCapture_MySQLDatabase
MySQLPDODatabase:
class: SilverStripe\FullTextSearch\Search\Captures\SearchManipulateCapture_MySQLDatabase
---
Name: fulltextsearchpostgresql
After:
- 'postgresqlconnectors'
---
SilverStripe\Core\Injector\Injector:
PostgrePDODatabase:
class: SilverStripe\FullTextSearch\Search\Captures\SearchManipulateCapture_PostgreSQLDatabase
PostgreSQLDatabase:
class: SilverStripe\FullTextSearch\Search\Captures\SearchManipulateCapture_PostgreSQLDatabase
---
Name: fulltextsearchsqlite
---
SilverStripe\Core\Injector\Injector:
SQLite3Database:
class: SilverStripe\FullTextSearch\Search\Captures\SearchManipulateCapture_SQLite3Database

View File

@ -1,6 +1,6 @@
<?php
namespace SilverStripe\FullTextSearch\Captures;
namespace SilverStripe\FullTextSearch\Search\Captures;
use SilverStripe\ORM\Connect\MySQLDatabase;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;

View File

@ -1,6 +1,6 @@
<?php
namespace SilverStripe\FullTextSearch\Captures;
namespace SilverStripe\FullTextSearch\Search\Captures;
use SilverStripe\PostgreSQL\PostgreSQLDatabase;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;

View File

@ -1,6 +1,6 @@
<?php
namespace SilverStripe\FullTextSearch\Captures;
namespace SilverStripe\FullTextSearch\Search\Captures;
use SilverStripe\SQLite\SQLite3Database;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;

View File

@ -1,12 +1,12 @@
<?php
namespace SilverStripe\FullTextSearch\Search\Updaters;
namespace SilverStripe\FullTextSearch\Search\Extensions;
use SilverStripe\ORM\DataExtension;
use SilverStripe\FullTextSearch\Search\Variants\SearchVariant;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
use SilverStripe\ORM\DataObject;
use SilverStripe\Core\ClassInfo;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
use SilverStripe\FullTextSearch\Search\Variants\SearchVariant;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\DataObject;
/**
* Delete operations do not use database manipulations.

View File

@ -18,13 +18,11 @@ use ReflectionClass;
* This class is responsible for capturing changes to DataObjects and triggering index updates of the resulting dirty
* index items.
*
* Attached automatically by _config calling SearchUpdater#bind_manipulation_capture. Overloads the current database
* connector's manipulate method - basically we need to capture a manipulation _after_ all the augmentManipulation code
* (for instance Version's) is run
* Attached automatically by Injector configuration that overloads your flavour of Database class. The
* SearchManipulateCapture_[type] classes overload the manipulate method - basically we need to capture a
* manipulation _after_ all the augmentManipulation code (for instance Version's) is run
*
* Pretty closely tied to the field structure of SearchIndex.
*
* TODO: The way we bind in is awful hacky.
*/
class SearchUpdater
@ -39,36 +37,6 @@ class SearchUpdater
*/
private static $flush_on_shutdown = true;
/**
* Replace the database object with a subclass that captures all manipulations and passes them to us
*/
public static function bind_manipulation_capture()
{
$current = DB::get_conn();
if (!$current || !$current->getSelectedDatabase() || @$current->isManipulationCapture) {
return;
} // If not yet set, or its already captured, just return
$type = (new ReflectionClass($current))->getShortName();
$dbClass = 'SilverStripe\FullTextSearch\Captures\SearchManipulateCapture_' . $type;
// Check if Capture class exists.
if (!class_exists($dbClass)) {
return;
}
/** @var Database $captured */
$captured = new $dbClass();
$captured->setConnector($current->getConnector());
$captured->setQueryBuilder($current->getQueryBuilder());
$captured->setSchemaManager($current->getSchemaManager());
// The connection might have had it's name changed (like if we're currently in a test)
$captured->selectDatabase($current->getSelectedDatabase());
DB::set_conn($captured);
}
public static $registered = false;
/** @var SearchUpdateProcessor */
public static $processor = null;

View File

@ -1,21 +0,0 @@
<?php
namespace SilverStripe\FullTextSearch\Search\Updaters;
use SilverStripe\Control\RequestFilter;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
class SearchUpdater_BindManipulationCaptureFilter implements RequestFilter
{
public function preRequest(HTTPRequest $request)
{
SearchUpdater::bind_manipulation_capture();
}
public function postRequest(HTTPRequest $request, HTTPResponse $response)
{
/* NOP */
}
}

View File

@ -25,6 +25,8 @@ use Symbiote\QueuedJobs\Services\QueuedJobService;
*/
class BatchedProcessorTest extends SapphireTest
{
protected $usesDatabase = true;
protected $oldProcessor;
protected static $extra_dataobjects = array(

View File

@ -30,8 +30,6 @@ class SearchUpdaterTest extends SapphireTest
self::$index->reset();
}
SearchUpdater::bind_manipulation_capture();
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
'class' => SearchUpdateImmediateProcessor::class
));
@ -72,17 +70,17 @@ class SearchUpdaterTest extends SapphireTest
// Check the default "writing a document updates the document"
SearchUpdater::flush_dirty_indexes();
$added = self::$index->getAdded(array('ID'));
$added = self::$index->getAdded(['ID']);
// Some databases don't output $added in a consistent order; that's okay
usort($added, function ($a, $b) {
return $a['ID']-$b['ID'];
});
$this->assertEquals($added, array(
array('ID' => $container1->ID),
array('ID' => $container2->ID),
array('ID' => $container3->ID)
));
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
['ID' => $container3->ID],
], $added);
// Check writing a has_one tracks back to the origin documents
@ -92,17 +90,17 @@ class SearchUpdaterTest extends SapphireTest
$hasOne->write();
SearchUpdater::flush_dirty_indexes();
$added = self::$index->getAdded(array('ID'));
$added = self::$index->getAdded(['ID']);
// Some databases don't output $added in a consistent order; that's okay
usort($added, function ($a, $b) {
return $a['ID']-$b['ID'];
});
$this->assertEquals($added, array(
array('ID' => $container1->ID),
array('ID' => $container2->ID)
));
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
], $added);
// Check updating an unrelated field doesn't track back
@ -112,7 +110,7 @@ class SearchUpdaterTest extends SapphireTest
$hasOne->write();
SearchUpdater::flush_dirty_indexes();
$this->assertEquals(self::$index->getAdded(array('ID')), array());
$this->assertEquals([], self::$index->getAdded(['ID']));
// Check writing a has_one tracks back to the origin documents
@ -122,9 +120,9 @@ class SearchUpdaterTest extends SapphireTest
$alternateHasOne->write();
SearchUpdater::flush_dirty_indexes();
$this->assertEquals(self::$index->getAdded(array('ID')), array(
array('ID' => $container3->ID)
));
$this->assertEquals([
['ID' => $container3->ID],
], self::$index->getAdded(['ID']));
}
public function testHasManyHook()
@ -148,10 +146,10 @@ class SearchUpdaterTest extends SapphireTest
SearchUpdater::flush_dirty_indexes();
$this->assertEquals(self::$index->getAdded(array('ID')), array(
array('ID' => $container1->ID),
array('ID' => $container2->ID)
));
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
], self::$index->getAdded(['ID']));
self::$index->reset();
@ -162,8 +160,8 @@ class SearchUpdaterTest extends SapphireTest
$hasMany2->write();
SearchUpdater::flush_dirty_indexes();
$this->assertEquals(self::$index->getAdded(array('ID')), array(
array('ID' => $container1->ID)
));
$this->assertEquals([
['ID' => $container1->ID],
], self::$index->getAdded(['ID']));
}
}

View File

@ -31,11 +31,9 @@ class SearchVariantSubsiteTest extends SapphireTest
self::$index = singleton(static::class);
}
SearchUpdater::bind_manipulation_capture();
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
'class' => SearchUpdateImmediateProcessor::class
]);
Config::inst()->update('Injector', 'SearchUpdateProcessor', array(
'class' => 'SearchUpdateImmediateProcessor'
));
FullTextSearch::force_index_list(self::$index);
SearchUpdater::clear_dirty_indexes();

View File

@ -34,8 +34,6 @@ class SearchVariantVersionedTest extends SapphireTest
self::$index = singleton(SearchVariantVersionedTest_Index::class);
}
SearchUpdater::bind_manipulation_capture();
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
'class' => SearchUpdateImmediateProcessor::class
));

View File

@ -55,11 +55,9 @@ class SolrIndexSubsitesTest extends SapphireTest
self::$index = singleton(SolrIndexSubsitesTest_Index::class);
}
SearchUpdater::bind_manipulation_capture();
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
'class' => SearchUpdateImmediateProcessor::class,
]);
Config::modify()->set('Injector', 'SearchUpdateProcessor', array(
'class' => 'SearchUpdateImmediateProcessor'
));
FullTextSearch::force_index_list(self::$index);
SearchUpdater::clear_dirty_indexes();

View File

@ -46,9 +46,7 @@ class SolrIndexVersionedTest extends SapphireTest
self::$index = singleton(SolrVersionedTest_Index::class);
}
SearchUpdater::bind_manipulation_capture();
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
'class' => SearchUpdateImmediateProcessor::class
]);