diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 3d2137f2b..3a97f7295 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -155,6 +155,22 @@ class DBObjectSearch extends DBSearch return $this->m_aSelectedClasses; } + /** + * @param array $aSelectedClasses array of aliases + * @throws CoreException + */ + public function SetSelectedClasses($aSelectedClasses) + { + $this->m_aSelectedClasses = array(); + foreach ($aSelectedClasses as $sAlias) + { + if (!array_key_exists($sAlias, $this->m_aClasses)) + { + throw new CoreException("Invalid class alias $sAlias"); + } + $this->m_aSelectedClasses[$sAlias] = $this->m_aClasses[$sAlias]; + } + } public function SetModifierProperty($sPluginClass, $sProperty, $value) { @@ -565,7 +581,7 @@ class DBObjectSearch extends DBSearch // NO: $oFilter = $oFilter->DeepClone(); // See also: Trac #639, and self::AddCondition_PointingTo() $aAliasTranslation = array(); - $res = $this->AddCondition_ReferencedBy_InNameSpace(DBObjectSearch, $sForeignExtKeyAttCode, $this->m_aClasses, $aAliasTranslation); + $res = $this->AddCondition_ReferencedBy_InNameSpace($oFilter, $sForeignExtKeyAttCode, $this->m_aClasses, $aAliasTranslation); $this->TransferConditionExpression($oFilter, $aAliasTranslation); return $res; } diff --git a/core/dbsearch.class.php b/core/dbsearch.class.php index e49d9dc45..72bf2400c 100644 --- a/core/dbsearch.class.php +++ b/core/dbsearch.class.php @@ -91,6 +91,12 @@ abstract class DBSearch abstract public function ChangeClass($sNewClass, $sAlias = null); abstract public function GetSelectedClasses(); + /** + * @param array $aSelectedClasses array of aliases + * @throws CoreException + */ + abstract public function SetSelectedClasses($aSelectedClasses); + abstract public function IsAny(); public function Describe(){return 'deprecated - use ToOQL() instead';} @@ -162,6 +168,12 @@ abstract class DBSearch return $oRes; } + /** + * @param string $sQuery + * @param array $aParams + * @return DBSearch + * @throws OQLException + */ static public function FromOQL($sQuery, $aParams = null) { if (empty($sQuery)) return null; diff --git a/core/dbunionsearch.class.php b/core/dbunionsearch.class.php index 66749617a..ecc07560d 100644 --- a/core/dbunionsearch.class.php +++ b/core/dbunionsearch.class.php @@ -52,6 +52,14 @@ class DBUnionSearch extends DBSearch } } + $this->ComputeSelectedClasses(); + } + + /** + * Find the lowest common ancestor for each of the selected class + */ + protected function ComputeSelectedClasses() + { // 1 - Collect all the column/classes $aColumnToClasses = array(); foreach ($this->aSearches as $iPos => $oSearch) @@ -163,6 +171,22 @@ class DBUnionSearch extends DBSearch return $this->aSelectedClasses; } + /** + * @param array $aSelectedClasses array of aliases + * @throws CoreException + */ + public function SetSelectedClasses($aSelectedClasses) + { + // 1 - change for each search + foreach ($this->aSearches as $oSearch) + { + // Throws an exception if not valid + $oSearch->SetSelectedClasses($aSelectedClasses); + } + // 2 - update the lowest common ancestors + $this->ComputeSelectedClasses(); + } + public function IsAny() { $bIsAny = true;