diff --git a/core/oqlclassnode.class.inc.php b/core/oqlclassnode.class.inc.php index a57a1a0d2..a248b684d 100644 --- a/core/oqlclassnode.class.inc.php +++ b/core/oqlclassnode.class.inc.php @@ -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 { diff --git a/core/oqlclasstreebuilder.class.inc.php b/core/oqlclasstreebuilder.class.inc.php index 9998726ac..0867150b6 100644 --- a/core/oqlclasstreebuilder.class.inc.php +++ b/core/oqlclasstreebuilder.class.inc.php @@ -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); } diff --git a/core/querybuildercontext.class.inc.php b/core/querybuildercontext.class.inc.php index ac66f44c4..022487dd7 100644 --- a/core/querybuildercontext.class.inc.php +++ b/core/querybuildercontext.class.inc.php @@ -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; + } + + } diff --git a/test/core/OQLToSQLAllClassesTest.php b/test/core/OQLToSQLAllClassesTest.php index 3b9d334c3..71bb6baea 100644 --- a/test/core/OQLToSQLAllClassesTest.php +++ b/test/core/OQLToSQLAllClassesTest.php @@ -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';