public function Intersect(DBSearch $oFilter) { if ($oFilter instanceof DBUnionSearch) { // Develop! $aFilters = $oFilter->GetSearches(); } else { $aFilters = array($oFilter); } $aSearches = array(); foreach ($aFilters as $oRightFilter) { $oLeftFilter = $this->DeepClone(); $oRightFilter = $oRightFilter->DeepClone(); if ($oLeftFilter->GetClass() != $oRightFilter->GetClass()) { if (MetaModel::IsParentClass($oLeftFilter->GetClass(), $oRightFilter->GetClass())) { // Specialize $oLeftFilter $oLeftFilter->ChangeClass($oRightFilter->GetClass()); } elseif (MetaModel::IsParentClass($oRightFilter->GetClass(), $oLeftFilter->GetClass())) { // Specialize $oRightFilter $oRightFilter->ChangeClass($oLeftFilter->GetClass()); } else { throw new CoreException("Attempting to merge a filter of class '{$oLeftFilter->GetClass()}' with a filter of class '{$oRightFilter->GetClass()}'"); } } $aAliasTranslation = array(); $oLeftFilter->MergeWith_InNamespace($oRightFilter, $oLeftFilter->m_aClasses, $aAliasTranslation); $oLeftFilter->TransferConditionExpression($oRightFilter, $aAliasTranslation); $aSearches[] = $oLeftFilter; } if (count($aSearches) == 1) { // return a DBObjectSearch return $aSearches[0]; } else { return new DBUnionSearch($aSearches); } }