diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 0cd039639..83b4e9ea4 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -808,11 +808,16 @@ class DBObjectSearch extends DBSearch // Leave it as is, the rendering will be made with parameters in clear $aParams = null; } - - $sSelectedClasses = implode(', ', array_keys($this->m_aSelectedClasses)); + + $aSelectedAliases = array(); + foreach ($this->m_aSelectedClasses as $sAlias => $sClass) + { + $aSelectedAliases[] = '`' . $sAlias . '`'; + } + $sSelectedClasses = implode(', ', $aSelectedAliases); $sRes = 'SELECT '.$sSelectedClasses.' FROM'; - $sRes .= ' '.$this->GetFirstJoinedClass().' AS '.$this->GetFirstJoinedClassAlias(); + $sRes .= ' ' . $this->GetFirstJoinedClass() . ' AS `' . $this->GetFirstJoinedClassAlias() . '`'; $sRes .= $this->ToOQL_Joins(); $sRes .= " WHERE ".$this->m_oSearchCondition->Render($aParams, $bRetrofitParams); @@ -872,7 +877,7 @@ class DBObjectSearch extends DBSearch break; } - $sRes .= ' JOIN '.$oFilter->GetFirstJoinedClass().' AS '.$oFilter->GetFirstJoinedClassAlias().' ON '.$this->GetFirstJoinedClassAlias().'.'.$sExtKey.$sOperator.$oFilter->GetFirstJoinedClassAlias().'.id'; + $sRes .= ' JOIN ' . $oFilter->GetFirstJoinedClass() . ' AS `' . $oFilter->GetFirstJoinedClassAlias() . '` ON `' . $this->GetFirstJoinedClassAlias() . '`.' . $sExtKey . $sOperator . '`' . $oFilter->GetFirstJoinedClassAlias() . '`.id'; $sRes .= $oFilter->ToOQL_Joins(); } } @@ -881,7 +886,7 @@ class DBObjectSearch extends DBSearch { foreach($aReferences as $sForeignExtKeyAttCode=>$oForeignFilter) { - $sRes .= ' JOIN '.$oForeignFilter->GetFirstJoinedClass().' AS '.$oForeignFilter->GetFirstJoinedClassAlias().' ON '.$oForeignFilter->GetFirstJoinedClassAlias().'.'.$sForeignExtKeyAttCode.' = '.$this->GetFirstJoinedClassAlias().'.id'; + $sRes .= ' JOIN ' . $oForeignFilter->GetFirstJoinedClass() . ' AS `' . $oForeignFilter->GetFirstJoinedClassAlias() . '` ON `' . $oForeignFilter->GetFirstJoinedClassAlias() . '`.' . $sForeignExtKeyAttCode . ' = `' . $this->GetFirstJoinedClassAlias() . '`.id'; $sRes .= $oForeignFilter->ToOQL_Joins(); } } diff --git a/core/dbsearch.class.php b/core/dbsearch.class.php index 83c6e594e..c4830deac 100644 --- a/core/dbsearch.class.php +++ b/core/dbsearch.class.php @@ -39,6 +39,9 @@ require_once('dbunionsearch.class.php'); abstract class DBSearch { + const JOIN_POINTING_TO = 0; + const JOIN_REFERENCED_BY = 1; + protected $m_bDataFiltered = false; protected $m_bNoContextParameters = false; protected $m_aModifierProperties = array(); @@ -128,6 +131,48 @@ abstract class DBSearch abstract public function AddCondition_ReferencedBy(DBObjectSearch $oFilter, $sForeignExtKeyAttCode); abstract public function Intersect(DBSearch $oFilter); + /** + * + * @param DBSearch $oFilter + * @param integer $iDirection + * @param string $sExtKeyAttCode + * @param integer $iOperatorCode + * @return DBSearch + */ + public function Join(DBSearch $oFilter, $iDirection, $sExtKeyAttCode, $iOperatorCode = TREE_OPERATOR_EQUALS) + { + $oSourceFilter = $this->DeepClone(); + $oRet = null; + + if ($oFilter instanceof DBUnionSearch) + { + $aSearches = array(); + foreach ($oFilter->GetSearches() as $oSearch) + { + $aSearches[] = $oSourceFilter->Join($oSearch, $iDirection, $sExtKeyAttCode, $iOperatorCode); + } + $oRet = new DBUnionSearch($aSearches); + } + else + { + if ($iDirection === static::JOIN_POINTING_TO) + { + $oSourceFilter->AddCondition_PointingTo($oFilter, $sExtKeyAttCode, $iOperatorCode); + } + else + { + if ($iOperatorCode !== TREE_OPERATOR_EQUALS) + { + throw new Exception('Only TREE_OPERATOR_EQUALS operator code is supported yet for AddCondition_ReferencedBy.'); + } + $oSourceFilter->AddCondition_ReferencedBy($oFilter, $sExtKeyAttCode); + } + $oRet = $oSourceFilter; + } + + return $oRet; + } + abstract public function SetInternalParams($aParams); abstract public function GetInternalParams(); abstract public function GetQueryParams($bExcludeMagicParams = true); diff --git a/core/dbunionsearch.class.php b/core/dbunionsearch.class.php index f7dfdae71..95fe39f01 100644 --- a/core/dbunionsearch.class.php +++ b/core/dbunionsearch.class.php @@ -368,6 +368,31 @@ class DBUnionSearch extends DBSearch return $sRet; } + /** + * Returns a new DBUnionSearch object where duplicates queries have been removed based on their OQLs + * + * @return \DBUnionSearch + */ + public function RemoveDuplicateQueries() + { + $aQueries = array(); + $aSearches = array(); + + foreach ($this->GetSearches() as $oTmpSearch) + { + $sQuery = $oTmpSearch->ToOQL(true); + if (!in_array($sQuery, $aQueries)) + { + $aQueries[] = $sQuery; + $aSearches[] = $oTmpSearch; + } + } + + $oNewSearch = new DBUnionSearch($aSearches); + + return $oNewSearch; + } + //////////////////////////////////////////////////////////////////////////// // // Construction of the SQL queries