diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 50f674758..4ae238ba6 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -521,21 +521,6 @@ class DBObjectSearch extends DBSearch $this->AddConditionExpression($oInCondition); } - /** - * @return string a unique param name - */ - private function GenerateUniqueParamName() { - $iExistingParamsNb = count($this->m_aParams); - $iCurrentArrayParamNb = $iExistingParamsNb + 1; - $sParamName = 'param'.$iCurrentArrayParamNb; - - if (isset($this->m_aParams[$sParamName])) { - $sParamName .= '_'.microtime(true) . '_' .rand(0,100); - } - - return $sParamName; - } - /** * Specify a condition on external keys or link sets * @param string $sAttSpec Can be either an attribute code or extkey->[sAttSpec] or linkset->[sAttSpec] and so on, recursively diff --git a/core/dbsearch.class.php b/core/dbsearch.class.php index e748ac1d5..6fa47c20e 100644 --- a/core/dbsearch.class.php +++ b/core/dbsearch.class.php @@ -726,6 +726,15 @@ abstract class DBSearch */ public abstract function GetCriteria(); + public abstract function AddConditionForInOperatorUsingParam($sFilterCode, $aValues, $bPositiveMatch = true); + + /** + * @return string a unique param name + */ + protected function GenerateUniqueParamName() { + return str_replace('.', '', 'param_'.microtime(true).rand(0,100)); + } + //////////////////////////////////////////////////////////////////////////// // // Cache/Trace/Log queries diff --git a/core/dbunionsearch.class.php b/core/dbunionsearch.class.php index 2fe7f60b2..597e2f746 100644 --- a/core/dbunionsearch.class.php +++ b/core/dbunionsearch.class.php @@ -628,4 +628,22 @@ class DBUnionSearch extends DBSearch $oSearch->SetDataFiltered(); } } + + public function AddConditionForInOperatorUsingParam($sFilterCode, $aValues, $bPositiveMatch = true) + { + $sInParamName = $this->GenerateUniqueParamName(); + foreach ($this->aSearches as $iSearchIndex => $oSearch) + { + $oFieldExpression = new FieldExpression($sFilterCode, $oSearch->GetClassAlias()); + + $sOperator = $bPositiveMatch ? 'IN' : 'NOT IN'; + + $oParamExpression = new VariableExpression($sInParamName); + $oSearch->GetInternalParamsByRef()[$sInParamName] = $aValues; + + $oListExpression = new ListExpression(array($oParamExpression)); + $oInCondition = new BinaryExpression($oFieldExpression, $sOperator, $oListExpression); + $oSearch->AddConditionExpression($oInCondition); + } + } }