mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-12 23:14:18 +01:00
N°2272 - OQL performance (empty class alias)
This commit is contained in:
@@ -21,18 +21,25 @@ class OQLClassNode
|
||||
*
|
||||
* @param QueryBuilderContext $oBuild
|
||||
* @param string $sNodeClass Current node class
|
||||
* @param string $sClassAlias Current node class alias
|
||||
* @param string $sNodeClassAlias Current node class alias
|
||||
* @param string $sOQLClassAlias Alias of the class requested in the filter (defaulted to $sClassAlias if null)
|
||||
*/
|
||||
public function __construct($oBuild, $sNodeClass, $sClassAlias, $sOQLClassAlias = null)
|
||||
public function __construct($oBuild, $sNodeClass, $sNodeClassAlias, $sOQLClassAlias = null)
|
||||
{
|
||||
$this->sNodeClass = $sNodeClass;
|
||||
$this->sNodeClassAlias = $sClassAlias;
|
||||
if (empty($sNodeClassAlias))
|
||||
{
|
||||
$this->sNodeClassAlias = $oBuild->GetEmptyClassAlias();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->sNodeClassAlias = $sNodeClassAlias;
|
||||
}
|
||||
$this->aJoins = array();
|
||||
$this->aExtKeys = array();
|
||||
if (is_null($sOQLClassAlias))
|
||||
{
|
||||
$this->sOQLClassAlias = $sClassAlias;
|
||||
$this->sOQLClassAlias = $this->sNodeClassAlias;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -29,6 +29,10 @@ class OQLClassTreeBuilder
|
||||
$this->oDBObjetSearch = $oDBObjetSearch;
|
||||
$this->sClass = $oDBObjetSearch->GetFirstJoinedClass();
|
||||
$this->sClassAlias = $oDBObjetSearch->GetFirstJoinedClassAlias();
|
||||
if (empty($this->sClassAlias))
|
||||
{
|
||||
$this->sClassAlias = $oBuild->GetEmptyClassAlias();
|
||||
}
|
||||
$this->oOQLClassNode = new OQLClassNode($oBuild, $this->sClass, $this->sClassAlias);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ class QueryBuilderContext
|
||||
protected $m_aModifierProperties;
|
||||
protected $m_aSelectedClasses;
|
||||
protected $m_aFilteredTables;
|
||||
protected $m_sEmptyClassAlias;
|
||||
|
||||
public $m_oQBExpressions;
|
||||
|
||||
@@ -69,8 +70,14 @@ class QueryBuilderContext
|
||||
// Add all the attribute of interest
|
||||
foreach ($this->m_aSelectedClasses as $sClassAlias => $sClass)
|
||||
{
|
||||
$sTableAlias = $sClassAlias;
|
||||
if (empty($sTableAlias))
|
||||
{
|
||||
$sTableAlias = $this->GenerateClassAlias("$sClass", $sClass);
|
||||
$this->m_sEmptyClassAlias = $sTableAlias;
|
||||
}
|
||||
// default to the whole list of attributes + the very std id/finalclass
|
||||
$this->m_oQBExpressions->AddSelect($sClassAlias.'id', new FieldExpression('id', $sClassAlias));
|
||||
$this->m_oQBExpressions->AddSelect($sClassAlias.'id', new FieldExpression('id', $sTableAlias));
|
||||
if (is_null($aAttToLoad) || !array_key_exists($sClassAlias, $aAttToLoad))
|
||||
{
|
||||
$sSelectedClass = $this->GetSelectedClass($sClassAlias);
|
||||
@@ -86,7 +93,7 @@ class QueryBuilderContext
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$oExpression = new FieldExpression($sAttCode, $sClassAlias);
|
||||
$oExpression = new FieldExpression($sAttCode, $sTableAlias);
|
||||
$this->m_oQBExpressions->AddSelect($sClassAlias.$sAttCode, $oExpression);
|
||||
}
|
||||
}
|
||||
@@ -140,4 +147,14 @@ class QueryBuilderContext
|
||||
{
|
||||
return $this->m_aFilteredTables;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function GetEmptyClassAlias()
|
||||
{
|
||||
return $this->m_sEmptyClassAlias;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ define('PRECISION', 2);
|
||||
|
||||
use CMDBSource;
|
||||
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||
use DBObjectSearch;
|
||||
use DBSearch;
|
||||
use MetaModel;
|
||||
use SetupUtils;
|
||||
@@ -35,6 +36,15 @@ class OQLToSQLAllCLassesTest extends ItopDataTestCase
|
||||
SetupUtils::builddir(APPROOT.'log/test/OQLToSQL');
|
||||
}
|
||||
|
||||
public function testEmptyAlias()
|
||||
{
|
||||
$oFilter = new DBObjectSearch('Organization', '');
|
||||
$oFilter->AllowAllData();
|
||||
$sSQL = $oFilter->MakeSelectQuery();
|
||||
CMDBSource::Query($sSQL);
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
||||
private function GetPreviousTestResult($sTestId)
|
||||
{
|
||||
$sResultFile = APPROOT.'log/test/OQLToSQL/'.$sTestId.'.txt';
|
||||
|
||||
Reference in New Issue
Block a user