浏览代码

Finalized queries with multiple objects

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@329 a333f486-631f-4898-b8df-5754b55c2be0
romainq 15 年之前
父节点
当前提交
e0de1a806a
共有 2 个文件被更改,包括 36 次插入15 次删除
  1. 20 2
      core/dbobjectsearch.class.php
  2. 16 13
      core/metamodel.class.php

+ 20 - 2
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;

+ 16 - 13
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 
 				}