mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 07:24:13 +01:00
N°4305 - n-n links to same class - Fix aliases in request
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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' => '',
|
||||
// ],
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user