N°4305 - n-n links to same class - Fix aliases in request

This commit is contained in:
Eric Espie
2021-09-20 16:09:32 +02:00
parent 4de79afe56
commit e930d34963
2 changed files with 42 additions and 4 deletions

View File

@@ -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);

View File

@@ -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' => '',
// ],
];
}
}