diff --git a/core/dbobjectset.class.php b/core/dbobjectset.class.php index 6d25134cf4..7a67d6ee00 100644 --- a/core/dbobjectset.class.php +++ b/core/dbobjectset.class.php @@ -40,7 +40,7 @@ class DBObjectSet implements iDBObjectSetIterator /** * @var array */ - protected $m_aAttToLoad; + public $m_aAttToLoad; /** * @var null|array */ diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 936f992eba..d7ee0a5f10 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -1645,7 +1645,7 @@ abstract class MetaModel if (array_key_exists($sClass, self::$m_aMagicFields) && in_array($sFilterCode, self::$m_aMagicFields[$sClass])) { return true; } - if (array_key_exists($sClass, self::$m_aFilterForbiddenAttributes) && array_key_exists($sFilterCode, self::$m_aFilterForbiddenAttributes[$sClass])) { + if (array_key_exists($sClass, self::$m_aFilterForbiddenAttributes) && in_array($sFilterCode, self::$m_aFilterForbiddenAttributes[$sClass])) { return false; } return self::IsValidAttCode($sClass, $sFilterCode); @@ -2963,7 +2963,7 @@ abstract class MetaModel self::$m_aMagicFields[] = $sClass; } self::$m_aMagicFields[$sClass][] = $sCode; - self::$m_aAttribOrigins[$sClass][$sCode] = self::$m_aAttribOrigins[$sClass][$sAttCode] ; + //self::$m_aAttribOrigins[$sClass][$sCode] = self::$m_aAttribOrigins[$sClass][$sAttCode]; } if (!$oAttDef->IsSearchable()) { if (!array_key_exists($sClass, self::$m_aFilterForbiddenAttributes)) { diff --git a/core/oqlactualclasstreeresolver.class.inc.php b/core/oqlactualclasstreeresolver.class.inc.php index 3f779c95d6..7c652127fc 100644 --- a/core/oqlactualclasstreeresolver.class.inc.php +++ b/core/oqlactualclasstreeresolver.class.inc.php @@ -60,15 +60,13 @@ class OQLActualClassTreeResolver $aTranslateFields = []; foreach ($aExpectedAttributes as $sAttCode => $oExpression) { // 'id' is managed later - if ($sAttCode == 'id') { + if ($sAttCode === 'id') { continue; } // Attributes can be stored in attributes list or for magic ones into filter codes list. $sOriginClass = null; if (MetaModel::IsValidAttCode($sClass, $sAttCode) || MetaModel::IsValidFilterCode($sClass, $sAttCode)) { $sOriginClass = MetaModel::GetAttributeOrigin($sClass, $sAttCode); - } elseif ($sAttCode == 'id') { - $sOriginClass = MetaModel::GetRootClass($sClass); } else { continue; } diff --git a/tests/php-unit-tests/unitary-tests/core/Delta/delta_oql_resolver.xml b/tests/php-unit-tests/unitary-tests/core/Delta/delta_oql_resolver.xml new file mode 100644 index 0000000000..494e266e89 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/core/Delta/delta_oql_resolver.xml @@ -0,0 +1,65 @@ + + + + + cmdbAbstractObject + + bizmodel + true + autoincrement + oqlresolverparent + id + + status + + + + + + + + + + + + + + true + rank + + + new + + + pending + + + status + new + false + + + + + + + OQLResolverParent + + bizmodel + false + autoincrement + oqlresolverchild + id + + + + + + name + + false + + + + + \ No newline at end of file diff --git a/tests/php-unit-tests/unitary-tests/core/OQLResolverTest.php b/tests/php-unit-tests/unitary-tests/core/OQLResolverTest.php new file mode 100644 index 0000000000..b5bc2abc5f --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/core/OQLResolverTest.php @@ -0,0 +1,43 @@ +GivenObjectInDB('OQLResolverChild', ['name' => 'toto', 'status' => 'new']); + $oObject = MetaModel::GetObject('OQLResolverChild', $sObjectKey); + + // When actions ApplyStimulus then next action fails + $sFilter = "SELECT OQLResolverChild WHERE ISNULL(cumulatedpending_laststart)"; + $oSearch = DBSearch::FromOQL($sFilter); + + $oSet = new DBObjectSet($oSearch); + $oSet->OptimizeColumnLoad(['OQLResolverChild' => ['cumulatedpending']]); + + $sQuery = $oSet->GetFilter()->MakeSelectQuery([], [], $oSet->m_aAttToLoad); + echo $sQuery."\n"; + $oActual = $oSet->Fetch(); + + // Then + // Check status... + $this->assertEquals($oObject->Get('name'), $oActual->Get('name'), 'The query should have returned the object'); + } +}