Bläddra i källkod

DBSearch : Allow join between DBUnionSearch by adding the DBUnionSearch::Join verb

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3952 a333f486-631f-4898-b8df-5754b55c2be0
glajarige 9 år sedan
förälder
incheckning
682a9c7b5d
3 ändrade filer med 80 tillägg och 5 borttagningar
  1. 10 5
      core/dbobjectsearch.class.php
  2. 45 0
      core/dbsearch.class.php
  3. 25 0
      core/dbunionsearch.class.php

+ 10 - 5
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();
 			}
 		}

+ 45 - 0
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);

+ 25 - 0
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