mirror of
https://github.com/Combodo/iTop.git
synced 2026-03-05 09:04:19 +01:00
N°3660 - Fix JOIN without condition on child joined table is ignored
This commit is contained in:
@@ -2602,5 +2602,18 @@ class DBObjectSearch extends DBSearch
|
||||
return $oExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aAttCodes array of attCodes to search into
|
||||
* @param string $sNeedle one word to be searched
|
||||
*
|
||||
* @throws \CoreException
|
||||
*/
|
||||
public function AddCondition_FullTextOnAttributes(array $aAttCodes, $sNeedle)
|
||||
{
|
||||
}
|
||||
|
||||
public function ListParameters()
|
||||
{
|
||||
return $this->GetCriteria()->ListParameters();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +294,15 @@ class OQLClassTreeBuilder
|
||||
$oClassExpr = new FieldExpression($sClassAttCode, $this->sClassAlias);
|
||||
$oClassRestriction = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
|
||||
$oQBContextExpressions->AddCondition($oClassRestriction);
|
||||
} elseif (($oKeyAttDef instanceof AttributeExternalKey) && $sKeyClass != $oKeyAttDef->GetTargetClass()) {
|
||||
$sClassAttCode = 'finalclass';
|
||||
if (MetaModel::IsValidAttCode($sKeyClass, $sClassAttCode)) {
|
||||
$oClassListExpr = ListExpression::FromScalars(MetaModel::EnumChildClasses($sKeyClass,
|
||||
ENUM_CHILD_CLASSES_ALL));
|
||||
$oClassExpr = new FieldExpression($sClassAttCode, $sKeyClassAlias);
|
||||
$oClassRestriction = new BinaryExpression($oClassExpr, 'IN', $oClassListExpr);
|
||||
$oQBContextExpressions->AddCondition($oClassRestriction);
|
||||
}
|
||||
}
|
||||
|
||||
// Translate prior to recursing
|
||||
|
||||
@@ -15,7 +15,10 @@ use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||
use DBObjectSearch;
|
||||
use DBSearch;
|
||||
use Exception;
|
||||
use MetaModel;
|
||||
use OqlInterpreter;
|
||||
use QueryBuilderContext;
|
||||
use SQLObjectQueryBuilder;
|
||||
use utils;
|
||||
|
||||
/**
|
||||
@@ -401,4 +404,54 @@ class OQLTest extends ItopDataTestCase
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @dataProvider GetOQLClassTreeProvider
|
||||
* @param $sOQL
|
||||
* @param $sExpectedOQL
|
||||
*/
|
||||
public function testGetOQLClassTree($sOQL, $sExpectedOQL)
|
||||
{
|
||||
$oFilter = DBSearch::FromOQL($sOQL);
|
||||
$aCountAttToLoad = array();
|
||||
$sMainClass = null;
|
||||
foreach ($oFilter->GetSelectedClasses() as $sClassAlias => $sClass)
|
||||
{
|
||||
$aCountAttToLoad[$sClassAlias] = array();
|
||||
if (empty($sMainClass))
|
||||
{
|
||||
$sMainClass = $sClass;
|
||||
}
|
||||
}
|
||||
$aModifierProperties = MetaModel::MakeModifierProperties($oFilter);
|
||||
$oSQLObjectQueryBuilder = new SQLObjectQueryBuilder($oFilter);
|
||||
$oBuild = new QueryBuilderContext($oFilter, $aModifierProperties, null, null, null, $aCountAttToLoad);
|
||||
$sResultOQL = $oSQLObjectQueryBuilder->DebugOQLClassTree($oBuild);
|
||||
|
||||
static::assertEquals($sExpectedOQL, $sResultOQL);
|
||||
}
|
||||
|
||||
public function GetOQLClassTreeProvider()
|
||||
{
|
||||
return [
|
||||
'Bug 3660 1' => [
|
||||
"SELECT UserRequest AS U
|
||||
JOIN lnkContactToTicket AS l ON l.ticket_id=U.id
|
||||
JOIN Team AS T ON l.contact_id=T.id",
|
||||
"SELECT `U` FROM `UserRequest` AS `U`
|
||||
INNER JOIN `lnkContactToTicket` AS `l`
|
||||
ON `U`.`id` = `l`.`ticket_id`
|
||||
INNER JOIN `Contact` AS `T_Contact`
|
||||
ON `l`.`contact_id` = `T_Contact`.`id`",
|
||||
],
|
||||
'Bug 3660 2' => [
|
||||
"SELECT UserRequest AS U
|
||||
JOIN lnkContactToTicket AS l ON l.ticket_id=U.id
|
||||
JOIN Contact AS C ON l.contact_id=C.id",
|
||||
"SELECT `U` FROM `UserRequest` AS `U`
|
||||
INNER JOIN `lnkContactToTicket` AS `l`
|
||||
ON `U`.`id` = `l`.`ticket_id`",
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user