diff --git a/core/ormlinkset.class.inc.php b/core/ormlinkset.class.inc.php index 244c73379..cd373405a 100644 --- a/core/ormlinkset.class.inc.php +++ b/core/ormlinkset.class.inc.php @@ -803,6 +803,7 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator $oLinkSearch = $this->GetFilter(); if ($oAttDef->IsIndirect()) { + $oLinkSearch->RenameAlias($oLinkSearch->GetClassAlias(), self::LINK_ALIAS); $sExtKeyToRemote = $oAttDef->GetExtKeyToRemote(); /** @var \AttributeExternalKey $oLinkingAttDef */ $oLinkingAttDef = MetaModel::GetAttributeDef($this->sClass, $sExtKeyToRemote); @@ -811,11 +812,12 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator // the pointed class is always present in the search, as generated by \AttributeLinkedSet::GetDefaultValue $sTargetClass = $oLinkingAttDef->GetTargetClass(); $oRemoteClassSearch = new DBObjectSearch($sTargetClass); + $oRemoteClassSearch->RenameAlias($sTargetClass, self::REMOTE_ALIAS); if (!$bShowObsolete && MetaModel::IsObsoletable($sTargetClass)) { $oNotObsolete = new BinaryExpression( - new FieldExpression('obsolescence_flag', $sTargetClass), + new FieldExpression('obsolescence_flag', self::REMOTE_ALIAS), '=', new ScalarExpression(0) ); @@ -825,7 +827,7 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator if (!utils::IsArchiveMode() && MetaModel::IsArchivable($sTargetClass)) { $oNotArchived = new BinaryExpression( - new FieldExpression('archive_flag', $sTargetClass), + new FieldExpression('archive_flag', self::REMOTE_ALIAS), '=', new ScalarExpression(0) ); @@ -834,8 +836,6 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator } $oLinkSearch->AddCondition_PointingTo($oRemoteClassSearch, $sExtKeyToRemote); - $oLinkSearch->RenameAlias($oLinkSearch->GetClassAlias(), self::LINK_ALIAS); - $oLinkSearch->RenameAlias($sTargetClass, self::REMOTE_ALIAS); $oLinkSearch->SetSelectedClasses([self::LINK_ALIAS, self::REMOTE_ALIAS]); } $oLinkSet = new DBObjectSet($oLinkSearch); diff --git a/test/core/ormLinkSetTest.php b/test/core/ormLinkSetTest.php index ff4bf3f29..732b9d26a 100644 --- a/test/core/ormLinkSetTest.php +++ b/test/core/ormLinkSetTest.php @@ -274,4 +274,42 @@ class ormLinkSetTest extends ItopDataTestCase $oContactsSet = $oServer->Get('contacts_list'); static::assertEquals(3, $oContactsSet->Count()); } + + /** + * @dataProvider ToDBObjectSetProvider + * @param $sHostClass + * @param $sAttCode + * @param $sOriginalFilter + * @param $bShowObsolete + * @param $sExpectedFilter + */ + public function testToDBObjectSet($sHostClass, $sAttCode, $sOriginalFilter, $bShowObsolete, $sExpectedFilter) + { + $oOriginalSet = new \DBObjectSet(\DBSearch::FromOQL($sOriginalFilter)); + $oOrmLinkSet = new ormLinkSet($sHostClass, $sAttCode, $oOriginalSet); + + $oSet = $oOrmLinkSet->ToDBObjectSet($bShowObsolete); + $this->assertEquals($sExpectedFilter, $oSet->GetFilter()->ToOQL()); + } + + public function ToDBObjectSetProvider() + { + return [ + 'lnkContactToFunctionalCI' => [ + 'sHostClass' => 'ApplicationSolution', + 'sAttCode' => 'contacts_list', + 'sOriginalFilter' => 'SELECT `lnkContactToFunctionalCI` FROM lnkContactToFunctionalCI AS `lnkContactToFunctionalCI` JOIN FunctionalCI AS `FunctionalCI` ON `lnkContactToFunctionalCI`.functionalci_id = `FunctionalCI`.id WHERE (`FunctionalCI`.`id` = :id)', + 'bShowObsolete' => false, + 'sExpectedFilter' => 'SELECT `Link`, `Remote` FROM lnkContactToFunctionalCI AS `Link` JOIN FunctionalCI AS `FunctionalCI` ON `Link`.functionalci_id = `FunctionalCI`.id JOIN Contact AS `Remote` ON `Link`.contact_id = `Remote`.id WHERE ((`FunctionalCI`.`id` = :id) AND (`Remote`.`obsolescence_flag` = 0))', + ], +// 'lnkFAQToFAQ' => [ +// 'sHostClass' => 'FAQ', +// 'sAttCode' => 'contacts_list', +// 'sOriginalFilter' => '', +// 'bShowObsolete' => true, +// 'sExpectedFilter' => '', +// ], + ]; + } + }