Finalized queries with multiple objects

SVN:trunk[329]
This commit is contained in:
Romain Quetiez
2010-04-13 12:46:07 +00:00
parent c81ac981c9
commit b1754b1475
2 changed files with 36 additions and 15 deletions

View File

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

View File

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