Quellcode durchsuchen

Optimization: autocomplete = do not load every object when determining the list of matches

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@1279 a333f486-631f-4898-b8df-5754b55c2be0
romainq vor 14 Jahren
Ursprung
Commit
fbc69f696b
1 geänderte Dateien mit 24 neuen und 1 gelöschten Zeilen
  1. 24 1
      core/valuesetdef.class.inc.php

+ 24 - 1
core/valuesetdef.class.inc.php

@@ -60,10 +60,12 @@ abstract class ValueSetDefinition
 		}
 		if (strlen($sContains) == 0)
 		{
+			// No filtering
 			$aRet = $this->m_aValues;
 		}
 		else
 		{
+			// Filter on results containing the needle <sContain>
 			$aRet = array();
 			foreach ($this->m_aValues as $sKey=>$sValue)
 			{
@@ -73,6 +75,7 @@ abstract class ValueSetDefinition
 				}
 			}
 		}
+		// Sort on the display value
 		asort($aRet);
 		return $aRet;
 	}
@@ -88,6 +91,7 @@ abstract class ValueSetDefinition
  */
 class ValueSetObjects extends ValueSetDefinition
 {
+	protected $m_sContains;
 	protected $m_sFilterExpr; // in OQL
 	protected $m_sValueAttCode;
 	protected $m_aOrderBy;
@@ -95,6 +99,7 @@ class ValueSetObjects extends ValueSetDefinition
 
 	public function __construct($sFilterExp, $sValueAttCode = '', $aOrderBy = array(), $bAllowAllData = false)
 	{
+		$this->m_sContains = '';
 		$this->m_sFilterExpr = $sFilterExp;
 		$this->m_sValueAttCode = $sValueAttCode;
 		$this->m_aOrderBy = $aOrderBy;
@@ -116,9 +121,22 @@ class ValueSetObjects extends ValueSetDefinition
 		return new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs);
 	}
 
+	public function GetValues($aArgs, $sContains = '')
+	{
+		if (!$this->m_bIsLoaded || ($sContains != $this->m_sContains))
+		{
+			$this->LoadValues($aArgs, $sContains);
+			$this->m_bIsLoaded = true;
+		}
+		// The results are already filtered and sorted (on friendly name)
+		$aRet = $this->m_aValues;
+		return $aRet;
+	}
 
-	protected function LoadValues($aArgs)
+	protected function LoadValues($aArgs, $sContains = '')
 	{
+		$this->m_sContains = $sContains;
+
 		$this->m_aValues = array();
 		
 		if ($this->m_bAllowAllData)
@@ -131,6 +149,11 @@ class ValueSetObjects extends ValueSetDefinition
 		}
 		if (!$oFilter) return false;
 
+		$oValueExpr = new ScalarExpression('%'.$sContains.'%');
+		$oNameExpr = new FieldExpression('friendlyname', $oFilter->GetClassAlias());
+		$oNewCondition = new BinaryExpression($oNameExpr, 'LIKE', $oValueExpr);
+		$oFilter->AddConditionExpression($oNewCondition);
+
 		$oObjects = new DBObjectSet($oFilter, $this->m_aOrderBy, $aArgs);
 		while ($oObject = $oObjects->Fetch())
 		{