From b1754b14750c0068cef212694c0320b94e257fc9 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Tue, 13 Apr 2010 12:46:07 +0000 Subject: [PATCH] Finalized queries with multiple objects SVN:trunk[329] --- core/dbobjectsearch.class.php | 22 ++++++++++++++++++++-- core/metamodel.class.php | 29 ++++++++++++++++------------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 4c3c998a81..d66d22dada 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -43,7 +43,7 @@ define('SIBUSQLTHISREGEXP', "/this\\.(.*)/U"); */ class DBObjectSearch { - private $m_aClasses; // queried classes (alias => class name) + private $m_aClasses; // queried classes (alias => class name), the first item is the class corresponding to this filter (the rest is coming from subfilters) private $m_aSelectedClasses; // selected for the output (alias => class name) private $m_oSearchCondition; private $m_aParams; @@ -84,6 +84,16 @@ class DBObjectSearch return key($this->m_aSelectedClasses); } + public function GetFirstJoinedClass() + { + return reset($this->m_aClasses); + } + public function GetFirstJoinedClassAlias() + { + reset($this->m_aClasses); + return key($this->m_aClasses); + } + public function SetSelectedClasses($aNewSet) { $this->m_aSelectedClasses = array(); @@ -322,7 +332,7 @@ class DBObjectSearch { $sNewAlias = MetaModel::GenerateUniqueAlias($aClassAliases, $sOrigAlias, $this->GetClass()); $this->m_aSelectedClasses[$sNewAlias] = $this->GetClass(); - unset($sOrigAlias, $this->m_aSelectedClasses[$sNewAlias]); + unset($this->m_aSelectedClasses[$sOrigAlias]); // Translate the condition expression with the new alias $aAliasTranslation[$sOrigAlias]['*'] = $sNewAlias; @@ -513,6 +523,11 @@ class DBObjectSearch $sValue = $this->GetClass()."\n"; $sValue .= $this->GetClassAlias()."\n"; + foreach($this->m_aSelectedClasses as $sClassAlias => $sClass) + { + // A stands for "Aliases" + $sValue .= "S:$sClassAlias:$sClass\n"; + } foreach($this->m_aClasses as $sClassAlias => $sClass) { // A stands for "Aliases" @@ -573,6 +588,9 @@ class DBObjectSearch $aCondition = explode(":", $aValues[$i++]); switch ($aCondition[0]) { + case "S": + $oFilter->m_aSelectedClasses[$aCondition[1]] = $aCondition[2]; + break; case "A": $oFilter->m_aClasses[$aCondition[1]] = $aCondition[2]; break; diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 672662d540..e1cfbdcb8a 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -1283,22 +1283,25 @@ abstract class MetaModel $aOrderSpec = array(); foreach ($aOrderBy as $sFieldAlias => $bAscending) { - MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetClass())); + MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($oFilter->GetFirstJoinedClass())); if (!is_bool($bAscending)) { throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value"); } - $aOrderSpec[$oFilter->GetClassAlias().$sFieldAlias] = $bAscending; + $aOrderSpec[$oFilter->GetFirstJoinedClassAlias().$sFieldAlias] = $bAscending; } // By default, force the name attribute to be the ordering key // if (empty($aOrderSpec)) { - $sNameAttCode = self::GetNameAttributeCode($oFilter->GetClass()); - if (!empty($sNameAttCode)) + foreach ($oFilter->GetSelectedClasses() as $sSelectedAlias => $sSelectedClass) { - // By default, simply order on the "name" attribute, ascending - $aOrderSpec[$oFilter->GetClassAlias().$sNameAttCode] = true; + $sNameAttCode = self::GetNameAttributeCode($sSelectedClass); + if (!empty($sNameAttCode)) + { + // By default, simply order on the "name" attribute, ascending + $aOrderSpec[$sSelectedAlias.$sNameAttCode] = true; + } } } @@ -1377,8 +1380,8 @@ abstract class MetaModel // Note: query class might be different than the class of the filter // -> this occurs when we are linking our class to an external class (referenced by, or pointing to) // $aExpectedAtts is an array of sAttCode=>array of columns - $sClass = $oFilter->GetClass(); - $sClassAlias = $oFilter->GetClassAlias(); + $sClass = $oFilter->GetFirstJoinedClass(); + $sClassAlias = $oFilter->GetFirstJoinedClassAlias(); $bIsOnQueriedClass = array_key_exists($sClassAlias, $aSelectedClasses); if ($bIsOnQueriedClass) @@ -1474,7 +1477,7 @@ abstract class MetaModel //self::DbgTrace($oSelectForeign->RenderSelect(array())); $oSelectForeign = self::MakeQuery($aSelectedClasses, $oConditionTree, $aClassAliases, $aTableAliases, $aTranslation, $oForeignFilter, $aExpAtts); - $sForeignClassAlias = $oForeignFilter->GetClassAlias(); + $sForeignClassAlias = $oForeignFilter->GetFirstJoinedClassAlias(); $sForeignKeyTable = $aTranslation[$sForeignClassAlias][$sForeignKeyAttCode][0]; $sForeignKeyColumn = $aTranslation[$sForeignClassAlias][$sForeignKeyAttCode][1]; $oSelectBase->AddInnerJoin($oSelectForeign, $sKeyField, $sForeignKeyColumn, $sForeignKeyTable); @@ -1536,8 +1539,8 @@ abstract class MetaModel // // Returns an SQLQuery // - $sTargetClass = $oFilter->GetClass(); - $sTargetAlias = $oFilter->GetClassAlias(); + $sTargetClass = $oFilter->GetFirstJoinedClass(); + $sTargetAlias = $oFilter->GetFirstJoinedClassAlias(); $sTable = self::DBGetTable($sTableClass); $sTableAlias = self::GenerateUniqueAlias($aTableAliases, $sTargetAlias.'_'.$sTable, $sTable); @@ -1662,8 +1665,8 @@ abstract class MetaModel else { // The aliases should not conflict because normalization occured while building the filter - $sKeyClass = $oExtFilter->GetClass(); - $sKeyClassAlias = $oExtFilter->GetClassAlias(); + $sKeyClass = $oExtFilter->GetFirstJoinedClass(); + $sKeyClassAlias = $oExtFilter->GetFirstJoinedClassAlias(); // Note: there is no search condition in $oExtFilter, because normalization did merge the condition onto the top of the filter tree }