diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 1e7450a09..b426345cc 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -65,6 +65,7 @@ class DBObjectSearch $this->m_aReferencedBy = array(); $this->m_aRelatedTo = array(); $this->m_bDataFiltered = false; + $this->m_aParentConditions = array(); } public function AllowAllData() {$this->m_bAllowAllData = true;} @@ -271,16 +272,63 @@ class DBObjectSearch protected function TransferConditionExpression($oFilter, $aTranslation) { + // Prevent collisions in the parameter names by renaming them if needed + foreach($this->m_aParams as $sParam => $value) + { + if (array_key_exists($sParam, $oFilter->m_aParams) && ($value != $oFilter->m_aParams[$sParam])) + { + // Generate a new and unique name for the collinding parameter + $index = 1; + while(array_key_exists($sParam.$index, $oFilter->m_aParams)) + { + $index++; + } + $secondValue = $oFilter->m_aParams[$sParam]; + $oFilter->RenameParam($sParam, $sParam.$index); + unset($oFilter->m_aParams[$sParam]); + $oFilter->m_aParams[$sParam.$index] = $secondValue; + } + } //echo "

TransferConditionExpression:
"; //echo "Adding Conditions:

oFilter:\n".print_r($oFilter, true)."\naTranslation:\n".print_r($aTranslation, true)."
\n"; //echo "

"; $oTranslated = $oFilter->GetCriteria()->Translate($aTranslation, false, false /* leave unresolved fields */); //echo "Adding Conditions (translated):
".print_r($oTranslated, true)."
\n"; $this->AddConditionExpression($oTranslated); - // #@# what about collisions in parameter names ??? $this->m_aParams = array_merge($this->m_aParams, $oFilter->m_aParams); } + protected function RenameParam($sOldName, $sNewName) + { + $this->m_oSearchCondition->RenameParam($sOldName, $sNewName); + foreach($this->m_aRelatedTo as $aRelatedTo) + { + $aRelatedTo['flt']->RenameParam($sOldName, $sNewName); + } + foreach($this->m_aPointingTo as $sExtKeyAttCode=>$aPointingTo) + { + foreach($aPointingTo as $iOperatorCode => $aFilter) + { + foreach($aFilter as $sAlias => $oExtFilter) + { + $oExtFilter->RenameParam($sOldName, $sNewName); + } + } + } + foreach($this->m_aReferencedBy as $sForeignClass => $aReferences) + { + foreach($aReferences as $sForeignExtKeyAttCode => $oForeignFilter) + { + $oForeignFilter->RenameParam($sOldName, $sNewName); + } + } + + foreach($this->m_aParentConditions as $aParent) + { + $aParent['expression']->RenameParam($sOldName, $sNewName); + } + } + public function ResetCondition() { $this->m_oSearchCondition = new TrueExpression(); diff --git a/core/expression.class.inc.php b/core/expression.class.inc.php index 13e7d9b5a..b592a69cb 100644 --- a/core/expression.class.inc.php +++ b/core/expression.class.inc.php @@ -84,6 +84,8 @@ abstract class Expression { return new BinaryExpression($this, 'OR', $oExpr); } + + abstract public function RenameParam($sOldName, $sNewName); } class SQLExpression extends Expression @@ -119,6 +121,11 @@ class SQLExpression extends Expression { return array(); } + + public function RenameParam($sOldName, $sNewName) + { + // Do nothing, since there is nothing to rename + } } @@ -205,6 +212,12 @@ class BinaryExpression extends Expression $aRight = $this->GetRightExpr()->ListRequiredFields(); return array_merge($aLeft, $aRight); } + + public function RenameParam($sOldName, $sNewName) + { + $this->GetLeftExpr()->RenameParam($sOldName, $sNewName); + $this->GetRightExpr()->RenameParam($sOldName, $sNewName); + } } @@ -256,6 +269,12 @@ class UnaryExpression extends Expression { return array(); } + + public function RenameParam($sOldName, $sNewName) + { + // Do nothing + // really ? what about :param{$iParamIndex} ?? + } } class ScalarExpression extends UnaryExpression @@ -429,6 +448,14 @@ class VariableExpression extends UnaryExpression throw new MissingQueryArgument('Missing query argument', array('expecting'=>$this->m_sName, 'available'=>$aArgs)); } } + + public function RenameParam($sOldName, $sNewName) + { + if ($this->m_sName == $sOldName) + { + $this->m_sName = $sNewName; + } + } } // Temporary, until we implement functions and expression casting! @@ -501,6 +528,15 @@ class ListExpression extends Expression } return $aRes; } + + public function RenameParam($sOldName, $sNewName) + { + $aRes = array(); + foreach ($this->m_aExpressions as $key => $oExpr) + { + $this->m_aExpressions[$key] = $oExpr->RenameParam($sOldName, $sNewName); + } + } } @@ -569,6 +605,14 @@ class FunctionExpression extends Expression } return $aRes; } + + public function RenameParam($sOldName, $sNewName) + { + foreach ($this->m_aArgs as $key => $oExpr) + { + $this->m_aArgs[$key] = $oExpr->RenameParam($sOldName, $sNewName); + } + } } class IntervalExpression extends Expression @@ -618,6 +662,11 @@ class IntervalExpression extends Expression { return array(); } + + public function RenameParam($sOldName, $sNewName) + { + $this->m_oValue->RenameParam($sOldName, $sNewName); + } } class CharConcatExpression extends Expression @@ -680,6 +729,14 @@ class CharConcatExpression extends Expression } return $aRes; } + + public function RenameParam($sOldName, $sNewName) + { + foreach ($this->m_aExpressions as $key => $oExpr) + { + $this->m_aExpressions[$key] = $oExpr->RenameParam($sOldName, $sNewName); + } + } } @@ -778,6 +835,19 @@ class QueryBuilderExpressions $this->m_aJoinFields[$index] = $oExpression->Translate($aTranslationData, $bMatchAll, $bMarkFieldsAsResolved); } } + + public function RenameParam($sOldName, $sNewName) + { + $this->m_oConditionExpr->RenameParam($sOldName, $sNewName); + foreach($this->m_aSelectExpr as $sColAlias => $oExpr) + { + $this->m_aSelectExpr[$sColAlias] = $oExpr->RenameParam($sOldName, $sNewName); + } + foreach($this->m_aJoinFields as $index => $oExpression) + { + $this->m_aJoinFields[$index] = $oExpression->RenameParam($sOldName, $sNewName); + } + } } ?>