API Remove bind_manipulation_capture and RequestFilter, use Injector instead
This commit is contained in:
parent
fccac37621
commit
45c402fc4c
|
@ -1,7 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
|
||||||
|
|
||||||
if (isset($databaseConfig['type'])) {
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
SilverStripe\Core\Injector\Injector:
|
|
||||||
SilverStripe\Control\RequestProcessor:
|
|
||||||
properties:
|
|
||||||
filters:
|
|
||||||
- '%$SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater_BindManipulationCaptureFilter'
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
---
|
||||||
|
Name: fulltextsearchconfig
|
||||||
|
---
|
||||||
SilverStripe\ORM\DataObject:
|
SilverStripe\ORM\DataObject:
|
||||||
extensions:
|
extensions:
|
||||||
- 'SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater_ObjectHandler'
|
- SilverStripe\FullTextSearch\Search\Extensions\SearchUpdater_ObjectHandler
|
||||||
|
|
|
@ -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
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace SilverStripe\FullTextSearch\Captures;
|
namespace SilverStripe\FullTextSearch\Search\Captures;
|
||||||
|
|
||||||
use SilverStripe\ORM\Connect\MySQLDatabase;
|
use SilverStripe\ORM\Connect\MySQLDatabase;
|
||||||
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace SilverStripe\FullTextSearch\Captures;
|
namespace SilverStripe\FullTextSearch\Search\Captures;
|
||||||
|
|
||||||
use SilverStripe\PostgreSQL\PostgreSQLDatabase;
|
use SilverStripe\PostgreSQL\PostgreSQLDatabase;
|
||||||
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace SilverStripe\FullTextSearch\Captures;
|
namespace SilverStripe\FullTextSearch\Search\Captures;
|
||||||
|
|
||||||
use SilverStripe\SQLite\SQLite3Database;
|
use SilverStripe\SQLite\SQLite3Database;
|
||||||
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<?php
|
<?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\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.
|
* Delete operations do not use database manipulations.
|
|
@ -18,13 +18,11 @@ use ReflectionClass;
|
||||||
* This class is responsible for capturing changes to DataObjects and triggering index updates of the resulting dirty
|
* This class is responsible for capturing changes to DataObjects and triggering index updates of the resulting dirty
|
||||||
* index items.
|
* index items.
|
||||||
*
|
*
|
||||||
* Attached automatically by _config calling SearchUpdater#bind_manipulation_capture. Overloads the current database
|
* Attached automatically by Injector configuration that overloads your flavour of Database class. The
|
||||||
* connector's manipulate method - basically we need to capture a manipulation _after_ all the augmentManipulation code
|
* SearchManipulateCapture_[type] classes overload the manipulate method - basically we need to capture a
|
||||||
* (for instance Version's) is run
|
* manipulation _after_ all the augmentManipulation code (for instance Version's) is run
|
||||||
*
|
*
|
||||||
* Pretty closely tied to the field structure of SearchIndex.
|
* Pretty closely tied to the field structure of SearchIndex.
|
||||||
*
|
|
||||||
* TODO: The way we bind in is awful hacky.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class SearchUpdater
|
class SearchUpdater
|
||||||
|
@ -39,36 +37,6 @@ class SearchUpdater
|
||||||
*/
|
*/
|
||||||
private static $flush_on_shutdown = true;
|
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;
|
public static $registered = false;
|
||||||
/** @var SearchUpdateProcessor */
|
/** @var SearchUpdateProcessor */
|
||||||
public static $processor = null;
|
public static $processor = null;
|
||||||
|
|
|
@ -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 */
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,6 +25,8 @@ use Symbiote\QueuedJobs\Services\QueuedJobService;
|
||||||
*/
|
*/
|
||||||
class BatchedProcessorTest extends SapphireTest
|
class BatchedProcessorTest extends SapphireTest
|
||||||
{
|
{
|
||||||
|
protected $usesDatabase = true;
|
||||||
|
|
||||||
protected $oldProcessor;
|
protected $oldProcessor;
|
||||||
|
|
||||||
protected static $extra_dataobjects = array(
|
protected static $extra_dataobjects = array(
|
||||||
|
|
|
@ -30,8 +30,6 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
self::$index->reset();
|
self::$index->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
|
||||||
|
|
||||||
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
|
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
|
||||||
'class' => SearchUpdateImmediateProcessor::class
|
'class' => SearchUpdateImmediateProcessor::class
|
||||||
));
|
));
|
||||||
|
@ -72,17 +70,17 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
// Check the default "writing a document updates the document"
|
// Check the default "writing a document updates the document"
|
||||||
SearchUpdater::flush_dirty_indexes();
|
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
|
// Some databases don't output $added in a consistent order; that's okay
|
||||||
usort($added, function ($a, $b) {
|
usort($added, function ($a, $b) {
|
||||||
return $a['ID']-$b['ID'];
|
return $a['ID']-$b['ID'];
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->assertEquals($added, array(
|
$this->assertEquals([
|
||||||
array('ID' => $container1->ID),
|
['ID' => $container1->ID],
|
||||||
array('ID' => $container2->ID),
|
['ID' => $container2->ID],
|
||||||
array('ID' => $container3->ID)
|
['ID' => $container3->ID],
|
||||||
));
|
], $added);
|
||||||
|
|
||||||
// Check writing a has_one tracks back to the origin documents
|
// Check writing a has_one tracks back to the origin documents
|
||||||
|
|
||||||
|
@ -92,17 +90,17 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
$hasOne->write();
|
$hasOne->write();
|
||||||
|
|
||||||
SearchUpdater::flush_dirty_indexes();
|
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
|
// Some databases don't output $added in a consistent order; that's okay
|
||||||
usort($added, function ($a, $b) {
|
usort($added, function ($a, $b) {
|
||||||
return $a['ID']-$b['ID'];
|
return $a['ID']-$b['ID'];
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->assertEquals($added, array(
|
$this->assertEquals([
|
||||||
array('ID' => $container1->ID),
|
['ID' => $container1->ID],
|
||||||
array('ID' => $container2->ID)
|
['ID' => $container2->ID],
|
||||||
));
|
], $added);
|
||||||
|
|
||||||
// Check updating an unrelated field doesn't track back
|
// Check updating an unrelated field doesn't track back
|
||||||
|
|
||||||
|
@ -112,7 +110,7 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
$hasOne->write();
|
$hasOne->write();
|
||||||
|
|
||||||
SearchUpdater::flush_dirty_indexes();
|
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
|
// Check writing a has_one tracks back to the origin documents
|
||||||
|
|
||||||
|
@ -122,9 +120,9 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
$alternateHasOne->write();
|
$alternateHasOne->write();
|
||||||
|
|
||||||
SearchUpdater::flush_dirty_indexes();
|
SearchUpdater::flush_dirty_indexes();
|
||||||
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
$this->assertEquals([
|
||||||
array('ID' => $container3->ID)
|
['ID' => $container3->ID],
|
||||||
));
|
], self::$index->getAdded(['ID']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHasManyHook()
|
public function testHasManyHook()
|
||||||
|
@ -148,10 +146,10 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
|
|
||||||
SearchUpdater::flush_dirty_indexes();
|
SearchUpdater::flush_dirty_indexes();
|
||||||
|
|
||||||
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
$this->assertEquals([
|
||||||
array('ID' => $container1->ID),
|
['ID' => $container1->ID],
|
||||||
array('ID' => $container2->ID)
|
['ID' => $container2->ID],
|
||||||
));
|
], self::$index->getAdded(['ID']));
|
||||||
|
|
||||||
self::$index->reset();
|
self::$index->reset();
|
||||||
|
|
||||||
|
@ -162,8 +160,8 @@ class SearchUpdaterTest extends SapphireTest
|
||||||
$hasMany2->write();
|
$hasMany2->write();
|
||||||
|
|
||||||
SearchUpdater::flush_dirty_indexes();
|
SearchUpdater::flush_dirty_indexes();
|
||||||
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
$this->assertEquals([
|
||||||
array('ID' => $container1->ID)
|
['ID' => $container1->ID],
|
||||||
));
|
], self::$index->getAdded(['ID']));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,11 +31,9 @@ class SearchVariantSubsiteTest extends SapphireTest
|
||||||
self::$index = singleton(static::class);
|
self::$index = singleton(static::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
Config::inst()->update('Injector', 'SearchUpdateProcessor', array(
|
||||||
|
'class' => 'SearchUpdateImmediateProcessor'
|
||||||
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
|
));
|
||||||
'class' => SearchUpdateImmediateProcessor::class
|
|
||||||
]);
|
|
||||||
|
|
||||||
FullTextSearch::force_index_list(self::$index);
|
FullTextSearch::force_index_list(self::$index);
|
||||||
SearchUpdater::clear_dirty_indexes();
|
SearchUpdater::clear_dirty_indexes();
|
||||||
|
|
|
@ -34,8 +34,6 @@ class SearchVariantVersionedTest extends SapphireTest
|
||||||
self::$index = singleton(SearchVariantVersionedTest_Index::class);
|
self::$index = singleton(SearchVariantVersionedTest_Index::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
|
||||||
|
|
||||||
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
|
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
|
||||||
'class' => SearchUpdateImmediateProcessor::class
|
'class' => SearchUpdateImmediateProcessor::class
|
||||||
));
|
));
|
||||||
|
|
|
@ -55,11 +55,9 @@ class SolrIndexSubsitesTest extends SapphireTest
|
||||||
self::$index = singleton(SolrIndexSubsitesTest_Index::class);
|
self::$index = singleton(SolrIndexSubsitesTest_Index::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
Config::modify()->set('Injector', 'SearchUpdateProcessor', array(
|
||||||
|
'class' => 'SearchUpdateImmediateProcessor'
|
||||||
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
|
));
|
||||||
'class' => SearchUpdateImmediateProcessor::class,
|
|
||||||
]);
|
|
||||||
|
|
||||||
FullTextSearch::force_index_list(self::$index);
|
FullTextSearch::force_index_list(self::$index);
|
||||||
SearchUpdater::clear_dirty_indexes();
|
SearchUpdater::clear_dirty_indexes();
|
||||||
|
|
|
@ -46,9 +46,7 @@ class SolrIndexVersionedTest extends SapphireTest
|
||||||
self::$index = singleton(SolrVersionedTest_Index::class);
|
self::$index = singleton(SolrVersionedTest_Index::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchUpdater::bind_manipulation_capture();
|
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
|
||||||
|
|
||||||
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, [
|
|
||||||
'class' => SearchUpdateImmediateProcessor::class
|
'class' => SearchUpdateImmediateProcessor::class
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue