BUGFIX: Allow indexing of new records with their relations

Relations were inserted by TYPO3's DataHandler after indexing and were
therefore not indexed.

We now use a later hook after DataHandler has finished everything, so we
know that we can index. As it's not relevant, we do not differentiate
between add and update anymore, as both trigger "indexDocument" internal.

Resolves: #112
This commit is contained in:
Daniel Siepmann 2018-02-22 21:55:52 +01:00
parent 07c9d5a136
commit 47b3282034
Signed by: Daniel Siepmann
GPG key ID: 33D6629915560EF4
7 changed files with 32 additions and 109 deletions

View file

@ -83,16 +83,6 @@ class DataHandler implements Singleton
$this->indexerFactory = $indexerFactory; $this->indexerFactory = $indexerFactory;
} }
/**
* @param string $table
* @param array $record
*/
public function add($table, array $record)
{
$this->logger->debug('Record received for add.', [$table, $record]);
$this->getIndexer($table)->indexDocument($record['uid']);
}
/** /**
* @param string $table * @param string $table
*/ */

View file

@ -92,42 +92,36 @@ class DataHandler implements Singleton
return true; return true;
} }
/** public function processDatamap_afterAllOperations(CoreDataHandler $dataHandler)
* Called by CoreDataHandler on database operations, e.g. if new records were created or records were updated. {
* foreach ($dataHandler->datamap as $table => $record) {
* @param string $status $uid = key($record);
* @param string $table $fieldData = current($record);
* @param string|int $uid
* @param array $fieldArray if (isset($fieldArray['uid'])) {
* @param CoreDataHandler $dataHandler $uid = $fieldArray['uid'];
* } elseif (isset($dataHandler->substNEWwithIDs[$uid])) {
* @return bool False if hook was not processed. $uid = $dataHandler->substNEWwithIDs[$uid];
*/ }
public function processDatamap_afterDatabaseOperations($status, $table, $uid, array $fieldArray, CoreDataHandler $dataHandler)
$this->processRecord($table, $uid);
}
}
protected function processRecord(string $table, int $uid) : bool
{ {
if (! $this->shouldProcessHookForTable($table)) { if (! $this->shouldProcessHookForTable($table)) {
$this->logger->debug('Database update not processed.', [$table, $uid]); $this->logger->debug('Indexing of record not processed.', [$table, $uid]);
return false; return false;
} }
if ($status === 'new') { $record = $this->getRecord($table, $uid);
$fieldArray['uid'] = $dataHandler->substNEWwithIDs[$uid]; if ($record !== null) {
$this->dataHandler->add($table, $fieldArray); $this->dataHandler->update($table, $record);
return true; return true;
} }
if ($status === 'update') { $this->logger->debug('Indexing of record not processed, as he was not found in Database.', [$table, $uid]);
$record = $this->getRecord($table, $uid);
if ($record !== null) {
$this->dataHandler->update($table, $record);
}
return true;
}
$this->logger->debug(
'Database update not processed, cause status is unhandled.',
[$status, $table, $uid, $fieldArray]
);
return false; return false;
} }

View file

@ -58,10 +58,8 @@ class DataHandlerFinisher extends AbstractFinisher
switch ($action) { switch ($action) {
case 'update': case 'update':
$this->dataHandler->update($tableName, $record);
break;
case 'add': case 'add':
$this->dataHandler->add($tableName, $record); $this->dataHandler->update($tableName, $record);
break; break;
case 'delete': case 'delete':
$this->dataHandler->delete($tableName, $record['uid']); $this->dataHandler->delete($tableName, $record['uid']);

View file

@ -1,54 +0,0 @@
<?php
namespace Codappix\SearchCore\Tests\Functional\Hooks\DataHandler;
/*
* Copyright (C) 2016 Daniel Siepmann <coding@daniel-siepmann.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
use Codappix\SearchCore\Configuration\ConfigurationContainerInterface;
use Codappix\SearchCore\Domain\Service\DataHandler as DataHandlerService;
use Codappix\SearchCore\Hook\DataHandler as DataHandlerHook;
use TYPO3\CMS\Core\DataHandling\DataHandler as Typo3DataHandler;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
class IgnoresUnkownOperationTest extends AbstractDataHandlerTest
{
/**
* @var DataHandlerService|\PHPUnit_Framework_MockObject_MockObject|AccessibleObjectInterface
*/
protected $subject;
/**
* @test
*/
public function dataHandlerCommandSomethingIsIgnored()
{
$subject = new DataHandlerHook($this->subject);
$this->assertFalse(
$subject->processDatamap_afterDatabaseOperations(
'something',
'tt_content',
1,
[],
new Typo3DataHandler
),
'Hook processed status "something".'
);
}
}

View file

@ -64,7 +64,7 @@ class NonAllowedTablesTest extends AbstractDataHandlerTest
/** /**
* @test * @test
*/ */
public function updateWillNotBeTriggeredForSysCategory() public function updateWillNotBeTriggeredForExistingSysCategory()
{ {
$this->subject->expects($this->exactly(0))->method('update'); $this->subject->expects($this->exactly(0))->method('update');
@ -83,9 +83,9 @@ class NonAllowedTablesTest extends AbstractDataHandlerTest
/** /**
* @test * @test
*/ */
public function addWillNotBeTriggeredForSysCategoy() public function updateWillNotBeTriggeredForNewSysCategoy()
{ {
$this->subject->expects($this->exactly(0))->method('add'); $this->subject->expects($this->exactly(0))->method('update');
$tce = GeneralUtility::makeInstance(Typo3DataHandler::class); $tce = GeneralUtility::makeInstance(Typo3DataHandler::class);
$tce->stripslashes_values = 0; $tce->stripslashes_values = 0;

View file

@ -66,7 +66,7 @@ class ProcessesAllowedTablesTest extends AbstractDataHandlerTest
/** /**
* @test * @test
*/ */
public function updateWillBeTriggeredForTtContent() public function updateWillBeTriggeredForExistingTtContent()
{ {
$this->subject->expects($this->exactly(1))->method('update') $this->subject->expects($this->exactly(1))->method('update')
->with( ->with(
@ -94,9 +94,9 @@ class ProcessesAllowedTablesTest extends AbstractDataHandlerTest
/** /**
* @test * @test
*/ */
public function addWillBeTriggeredForTtContent() public function updateWillBeTriggeredForNewTtContent()
{ {
$this->subject->expects($this->exactly(1))->method('add') $this->subject->expects($this->exactly(1))->method('update')
->with( ->with(
$this->equalTo('tt_content'), $this->equalTo('tt_content'),
$this->callback(function ($record) { $this->callback(function ($record) {

View file

@ -83,19 +83,14 @@ class DataHandlerFinisherTest extends AbstractUnitTestCase
public function possibleFinisherSetup() : array public function possibleFinisherSetup() : array
{ {
return [ return [
'valid add configuration' => [
'action' => 'add',
'nonCalledActions' => ['delete', 'update'],
'expectedSecondArgument' => ['uid' => 23],
],
'valid update configuration' => [ 'valid update configuration' => [
'action' => 'update', 'action' => 'update',
'nonCalledActions' => ['delete', 'add'], 'nonCalledActions' => ['delete'],
'expectedSecondArgument' => ['uid' => 23], 'expectedSecondArgument' => ['uid' => 23],
], ],
'valid delete configuration' => [ 'valid delete configuration' => [
'action' => 'delete', 'action' => 'delete',
'nonCalledActions' => ['update', 'add'], 'nonCalledActions' => ['update'],
'expectedSecondArgument' => 23, 'expectedSecondArgument' => 23,
], ],
]; ];
@ -109,7 +104,7 @@ class DataHandlerFinisherTest extends AbstractUnitTestCase
{ {
$this->subject->setOptions($options); $this->subject->setOptions($options);
foreach (['add', 'update', 'delete'] as $nonCalledAction) { foreach (['update', 'delete'] as $nonCalledAction) {
$this->dataHandlerMock->expects($this->never())->method($nonCalledAction); $this->dataHandlerMock->expects($this->never())->method($nonCalledAction);
} }