Procházet zdrojové kódy

Optimization: map the extended attribute code to the corresponding external field when this if possible (ex: org_id->name to org_name); this reduces the number of queries, in particular when using the "export CSV" menu on a list.

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3069 a333f486-631f-4898-b8df-5754b55c2be0
romainq před 11 roky
rodič
revize
43d2332d26
2 změnil soubory, kde provedl 37 přidání a 11 odebrání
  1. 15 6
      core/dbobject.class.php
  2. 22 5
      core/metamodel.class.php

+ 15 - 6
core/dbobject.class.php

@@ -400,16 +400,25 @@ abstract class DBObject
 			{
 				throw new CoreException("Unknown external key '$sExtKeyAttCode' for the class ".get_class($this));
 			}
-			$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
-			$sRemoteClass = $oKeyAttDef->GetTargetClass();
-			$oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false);
-			if (is_null($oRemoteObj))
+
+			$oExtFieldAtt = MetaModel::FindExternalField(get_class($this), $sExtKeyAttCode, $sRemoteAttCode);
+			if (!is_null($oExtFieldAtt))
 			{
-				return '';
+				return $this->GetStrict($oExtFieldAtt->GetCode());
 			}
 			else
 			{
-				return $oRemoteObj->Get($sRemoteAttCode);
+				$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
+				$sRemoteClass = $oKeyAttDef->GetTargetClass();
+				$oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false);
+				if (is_null($oRemoteObj))
+				{
+					return '';
+				}
+				else
+				{
+					return $oRemoteObj->Get($sRemoteAttCode);
+				}
 			}
 		}
 	}

+ 22 - 5
core/metamodel.class.php

@@ -871,15 +871,32 @@ abstract class MetaModel
 
 	final static public function GetExternalFields($sClass, $sKeyAttCode)
 	{
-		$aExtFields = array();
-		foreach (self::ListAttributeDefs($sClass) as $sAttCode => $oAtt)
+		static $aExtFields = array();
+		if (!isset($aExtFields[$sClass][$sKeyAttCode]))
 		{
-			if ($oAtt->IsExternalField() && ($oAtt->GetKeyAttCode() == $sKeyAttCode))
+			$aExtFields[$sClass][$sKeyAttCode] = array();
+			foreach (self::ListAttributeDefs($sClass) as $sAttCode => $oAtt)
 			{
-				$aExtFields[] = $oAtt;
+				if ($oAtt->IsExternalField() && ($oAtt->GetKeyAttCode() == $sKeyAttCode))
+				{
+					$aExtFields[$sClass][$sKeyAttCode][$oAtt->GetExtAttCode()] = $oAtt;
+				}
 			}
 		}
-		return $aExtFields;
+		return $aExtFields[$sClass][$sKeyAttCode];
+	}
+
+	final static public function FindExternalField($sClass, $sKeyAttCode, $sRemoteAttCode)
+	{
+		$aExtFields = self::GetExternalFields($sClass, $sKeyAttCode);
+		if (isset($aExtFields[$sRemoteAttCode]))
+		{
+			return $aExtFields[$sRemoteAttCode];
+		}
+		else
+		{
+			return null;
+		}
 	}
 
 	final static public function GetExtKeyFriends($sClass, $sExtKeyAttCode)