浏览代码

Fixed regression in the audit (new way to translate OQL expression having an impact on DBObjectSearch::MergeWith)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@1086 a333f486-631f-4898-b8df-5754b55c2be0
romainq 14 年之前
父节点
当前提交
e52af23704
共有 2 个文件被更改,包括 29 次插入22 次删除
  1. 1 1
      core/dbobjectsearch.class.php
  2. 28 21
      core/expression.class.inc.php

+ 1 - 1
core/dbobjectsearch.class.php

@@ -209,7 +209,7 @@ class DBObjectSearch
 
 	protected function TransferConditionExpression($oFilter, $aTranslation)
 	{
-		$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false);
+		$oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false, false /* leave unresolved fields */);
 		$this->AddConditionExpression($oTranslated);
 		// #@# what about collisions in parameter names ???
 		$this->m_aParams = array_merge($this->m_aParams, $oFilter->m_aParams);

+ 28 - 21
core/expression.class.inc.php

@@ -31,7 +31,7 @@ abstract class Expression
 {
 	// recursive translation of identifiers
 	abstract public function GetUnresolvedFields($sAlias, &$aUnresolved);
-	abstract public function Translate($aTranslationData, $bMatchAll = true);
+	abstract public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true);
 
 	// recursive rendering (aArgs used as input by default, or used as output if bRetrofitParams set to True
 	abstract public function Render(&$aArgs = null, $bRetrofitParams = false);
@@ -110,7 +110,7 @@ class SQLExpression extends Expression
 	{
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		return clone $this;
 	}
@@ -192,10 +192,10 @@ class BinaryExpression extends Expression
 		$this->GetRightExpr()->GetUnresolvedFields($sAlias, $aUnresolved);
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
-		$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll);
-		$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll);
+		$oLeft = $this->GetLeftExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
+		$oRight = $this->GetRightExpr()->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		return new BinaryExpression($oLeft, $this->GetOperator(), $oRight);
 	}
 
@@ -247,7 +247,7 @@ class UnaryExpression extends Expression
 	{
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		return clone $this;
 	}
@@ -342,7 +342,7 @@ class FieldExpression extends UnaryExpression
 		}
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		if (!array_key_exists($this->m_sParent, $aTranslationData))
 		{
@@ -359,7 +359,14 @@ class FieldExpression extends UnaryExpression
 			}
 			$sNewParent = $aTranslationData[$this->m_sParent]['*'];
 			$sNewName = $this->m_sName;
-			$oRet = new FieldExpressionResolved($sNewName, $sNewParent);
+			if ($bMarkFieldsAsResolved)
+			{
+				$oRet = new FieldExpressionResolved($sNewName, $sNewParent);
+			}
+			else
+			{
+				$oRet = new FieldExpression($sNewName, $sNewParent);
+			}
 		}
 		else
 		{
@@ -376,7 +383,7 @@ class FieldExpressionResolved extends FieldExpression
 	{
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		return clone $this;
 	}
@@ -475,12 +482,12 @@ class ListExpression extends Expression
 		}
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		$aRes = array();
 		foreach ($this->m_aExpressions as $oExpr)
 		{
-			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
+			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 		return new ListExpression($aRes);
 	}
@@ -543,12 +550,12 @@ class FunctionExpression extends Expression
 		}
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		$aRes = array();
 		foreach ($this->m_aArgs as $oExpr)
 		{
-			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
+			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 		return new FunctionExpression($this->m_sVerb, $aRes);
 	}
@@ -602,9 +609,9 @@ class IntervalExpression extends Expression
 		$this->m_oValue->GetUnresolvedFields($sAlias, $aUnresolved);
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
-		return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll), $this->m_sUnit);
+		return new IntervalExpression($this->m_oValue->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved), $this->m_sUnit);
 	}
 
 	public function ListRequiredFields()
@@ -654,12 +661,12 @@ class CharConcatExpression extends Expression
 		}
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
 		$aRes = array();
 		foreach ($this->m_aExpressions as $oExpr)
 		{
-			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll);
+			$aRes[] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 		return new CharConcatExpression($aRes);
 	}
@@ -732,16 +739,16 @@ class QueryBuilderExpressions
 		}
 	}
 
-	public function Translate($aTranslationData, $bMatchAll = true)
+	public function Translate($aTranslationData, $bMatchAll = true, $bMarkFieldsAsResolved = true)
 	{
-		$this->m_oConditionExpr = $this->m_oConditionExpr->Translate($aTranslationData, $bMatchAll);
+		$this->m_oConditionExpr = $this->m_oConditionExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		foreach($this->m_aSelectExpr as $sColAlias => $oExpr)
 		{
-			$this->m_aSelectExpr[$sColAlias] = $oExpr->Translate($aTranslationData, $bMatchAll);
+			$this->m_aSelectExpr[$sColAlias] = $oExpr->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 		foreach($this->m_aJoinFields as $index => $oExpression)
 		{
-			$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll);
+			$this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved);
 		}
 	}
 }