N°3660 - Fix JOIN without condition on child joined table is ignored

This commit is contained in:
Eric
2021-02-02 17:30:03 +01:00
parent 37a4a3eb47
commit bc024d9ed0
3 changed files with 75 additions and 0 deletions

View File

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

View File

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

View File

@@ -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`",
],
];
}
}