2011-05-02 06:33:05 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class SearchUpdaterTest_Container extends DataObject {
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $db = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'Field1' => 'Varchar',
|
2012-08-29 21:00:40 +02:00
|
|
|
'Field2' => 'Varchar',
|
|
|
|
'MyDate' => 'Date',
|
2011-05-02 06:33:05 +02:00
|
|
|
);
|
|
|
|
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $has_one = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'HasOneObject' => 'SearchUpdaterTest_HasOne'
|
|
|
|
);
|
|
|
|
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $has_many = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'HasManyObjects' => 'SearchUpdaterTest_HasMany'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
class SearchUpdaterTest_HasOne extends DataObject {
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $db = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'Field1' => 'Varchar',
|
|
|
|
'Field2' => 'Varchar'
|
|
|
|
);
|
|
|
|
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $has_many = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'HasManyContainers' => 'SearchUpdaterTest_Container'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
class SearchUpdaterTest_HasMany extends DataObject {
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $db = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'Field1' => 'Varchar',
|
|
|
|
'Field2' => 'Varchar'
|
|
|
|
);
|
|
|
|
|
2013-09-02 00:10:14 +02:00
|
|
|
private static $has_one = array(
|
2011-05-02 06:33:05 +02:00
|
|
|
'HasManyContainer' => 'SearchUpdaterTest_Container'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
class SearchUpdaterTest_Index extends SearchIndex_Recording {
|
|
|
|
function init() {
|
|
|
|
$this->addClass('SearchUpdaterTest_Container');
|
|
|
|
|
|
|
|
$this->addFilterField('Field1');
|
|
|
|
$this->addFilterField('HasOneObject.Field1');
|
|
|
|
$this->addFilterField('HasManyObjects.Field1');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class SearchUpdaterTest extends SapphireTest {
|
|
|
|
|
2013-09-02 00:10:14 +02:00
|
|
|
protected $usesDatabase = true;
|
|
|
|
|
2011-05-02 06:33:05 +02:00
|
|
|
private static $index = null;
|
|
|
|
|
|
|
|
function setUp() {
|
|
|
|
parent::setUp();
|
|
|
|
|
|
|
|
if (self::$index === null) self::$index = singleton(get_class($this).'_Index');
|
|
|
|
else self::$index->reset();
|
|
|
|
|
2012-07-19 07:08:07 +02:00
|
|
|
SearchUpdater::bind_manipulation_capture();
|
|
|
|
|
2013-07-25 04:27:09 +02:00
|
|
|
Config::nest();
|
|
|
|
|
|
|
|
Config::inst()->update('Injector', 'SearchUpdateProcessor', array(
|
|
|
|
'class' => 'SearchUpdateImmediateProcessor'
|
|
|
|
));
|
|
|
|
|
2011-05-02 06:33:05 +02:00
|
|
|
FullTextSearch::force_index_list(self::$index);
|
|
|
|
SearchUpdater::clear_dirty_indexes();
|
|
|
|
}
|
|
|
|
|
2013-07-25 04:27:09 +02:00
|
|
|
function tearDown() {
|
|
|
|
Config::unnest();
|
2013-09-02 00:10:14 +02:00
|
|
|
|
|
|
|
parent::tearDown();
|
2013-07-25 04:27:09 +02:00
|
|
|
}
|
|
|
|
|
2011-05-02 06:33:05 +02:00
|
|
|
function testBasic() {
|
|
|
|
$item = new SearchUpdaterTest_Container();
|
|
|
|
$item->write();
|
|
|
|
|
|
|
|
// TODO: Make sure changing field1 updates item.
|
|
|
|
// TODO: Get updating just field2 to not update item (maybe not possible - variants complicate)
|
|
|
|
}
|
|
|
|
|
|
|
|
function testHasOneHook() {
|
|
|
|
$hasOne = new SearchUpdaterTest_HasOne();
|
|
|
|
$hasOne->write();
|
|
|
|
|
|
|
|
$alternateHasOne = new SearchUpdaterTest_HasOne();
|
|
|
|
$alternateHasOne->write();
|
|
|
|
|
|
|
|
$container1 = new SearchUpdaterTest_Container();
|
|
|
|
$container1->HasOneObjectID = $hasOne->ID;
|
|
|
|
$container1->write();
|
|
|
|
|
|
|
|
$container2 = new SearchUpdaterTest_Container();
|
|
|
|
$container2->HasOneObjectID = $hasOne->ID;
|
|
|
|
$container2->write();
|
|
|
|
|
|
|
|
$container3 = new SearchUpdaterTest_Container();
|
|
|
|
$container3->HasOneObjectID = $alternateHasOne->ID;
|
|
|
|
$container3->write();
|
|
|
|
|
|
|
|
// Check the default "writing a document updates the document"
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
|
|
|
array('ID' => $container1->ID),
|
|
|
|
array('ID' => $container2->ID),
|
|
|
|
array('ID' => $container3->ID)
|
|
|
|
));
|
|
|
|
|
|
|
|
// Check writing a has_one tracks back to the origin documents
|
|
|
|
|
|
|
|
self::$index->reset();
|
|
|
|
|
|
|
|
$hasOne->Field1 = "Updated";
|
|
|
|
$hasOne->write();
|
|
|
|
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
|
|
|
array('ID' => $container1->ID),
|
|
|
|
array('ID' => $container2->ID)
|
|
|
|
));
|
|
|
|
|
|
|
|
// Check updating an unrelated field doesn't track back
|
|
|
|
|
|
|
|
self::$index->reset();
|
|
|
|
|
|
|
|
$hasOne->Field2 = "Updated";
|
|
|
|
$hasOne->write();
|
|
|
|
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array());
|
|
|
|
|
|
|
|
// Check writing a has_one tracks back to the origin documents
|
|
|
|
|
|
|
|
self::$index->reset();
|
|
|
|
|
|
|
|
$alternateHasOne->Field1= "Updated";
|
|
|
|
$alternateHasOne->write();
|
|
|
|
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
|
|
|
array('ID' => $container3->ID)
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
function testHasManyHook() {
|
|
|
|
$container1 = new SearchUpdaterTest_Container();
|
|
|
|
$container1->write();
|
|
|
|
|
|
|
|
$container2 = new SearchUpdaterTest_Container();
|
|
|
|
$container2->write();
|
|
|
|
|
|
|
|
//self::$index->reset();
|
|
|
|
//SearchUpdater::clear_dirty_indexes();
|
|
|
|
|
|
|
|
$hasMany1 = new SearchUpdaterTest_HasMany();
|
|
|
|
$hasMany1->HasManyContainerID = $container1->ID;
|
|
|
|
$hasMany1->write();
|
|
|
|
|
|
|
|
$hasMany2 = new SearchUpdaterTest_HasMany();
|
|
|
|
$hasMany2->HasManyContainerID = $container1->ID;
|
|
|
|
$hasMany2->write();
|
|
|
|
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
|
|
|
array('ID' => $container1->ID),
|
|
|
|
array('ID' => $container2->ID)
|
|
|
|
));
|
|
|
|
|
|
|
|
self::$index->reset();
|
|
|
|
|
|
|
|
$hasMany1->Field1 = 'Updated';
|
|
|
|
$hasMany1->write();
|
|
|
|
|
|
|
|
$hasMany2->Field1 = 'Updated';
|
|
|
|
$hasMany2->write();
|
|
|
|
|
|
|
|
SearchUpdater::flush_dirty_indexes();
|
|
|
|
$this->assertEquals(self::$index->getAdded(array('ID')), array(
|
|
|
|
array('ID' => $container1->ID)
|
|
|
|
));
|
|
|
|
}
|
|
|
|
}
|