Browse Source

#421 Sort IP addresses on INET_ATON (API only, see #520 to have this as the default sort order for NW Interfaces)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@1897 a333f486-631f-4898-b8df-5754b55c2be0
romainq 13 năm trước cách đây
mục cha
commit
c36e3207bb
3 tập tin đã thay đổi với 28 bổ sung4 xóa
  1. 12 0
      core/attributedef.class.inc.php
  2. 14 3
      core/metamodel.class.php
  3. 2 1
      core/sqlquery.class.inc.php

+ 12 - 0
core/attributedef.class.inc.php

@@ -318,6 +318,12 @@ abstract class AttributeDefinition
 	public function GetSQLValues($value) {return array();} // returns column/value pairs (1 in most of the cases), for WRITING (Insert, Update)
 	public function RequiresIndex() {return false;}
 
+	public function GetOrderBySQLExpressions($sClassAlias)
+	{
+		// Note: This is the responsibility of this function to place backticks around column aliases
+		return array('`'.$sClassAlias.$this->GetCode().'`');
+	}
+
    // Import - differs slightly from SQL input, but identical in most cases
    //
 	public function GetImportColumns() {return $this->GetSQLColumns();}
@@ -1899,6 +1905,12 @@ class AttributeIPAddress extends AttributeString
 		$sNum = '(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])';
 		return "^($sNum\\.$sNum\\.$sNum\\.$sNum)$";
 	}
+
+	public function GetOrderBySQLExpressions($sClassAlias)
+	{
+		// Note: This is the responsibility of this function to place backticks around column aliases
+		return array('INET_ATON(`'.$sClassAlias.$this->GetCode().'`)');
+	}
 }
 
 /**

+ 14 - 3
core/metamodel.class.php

@@ -2024,7 +2024,18 @@ abstract class MetaModel
 				throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value");
 			}
 			$sFirstClassAlias = $oFilter->GetFirstJoinedClassAlias();
-			$aOrderSpec[$sFirstClassAlias.$sFieldAlias] = $bAscending;
+			if (self::IsValidAttCode($oFilter->GetClass(), $sFieldAlias))
+			{
+				$oAttDef = self::GetAttributeDef($oFilter->GetClass(), $sFieldAlias);
+				foreach($oAttDef->GetOrderBySQLExpressions($sFirstClassAlias) as $sSQLExpression)
+				{
+					$aOrderSpec[$sSQLExpression] = $bAscending;
+				}
+			}
+			else
+			{
+				$aOrderSpec['`'.$sFirstClassAlias.$sFieldAlias.'`'] = $bAscending;
+			}
 
 			// Make sure that the columns used for sorting are present in the loaded columns
 			if (!is_null($aAttToLoad) && !isset($aAttToLoad[$sFirstClassAlias][$sFieldAlias]))
@@ -2039,7 +2050,7 @@ abstract class MetaModel
 			foreach ($oFilter->GetSelectedClasses() as $sSelectedAlias => $sSelectedClass)
 			{
 				// By default, simply order on the "friendlyname" attribute, ascending
-				$aOrderSpec[$sSelectedAlias."friendlyname"] = true;
+				$aOrderSpec['`'.$sSelectedAlias."friendlyname`"] = true;
 
 				// Make sure that the columns used for sorting are present in the loaded columns
 				if (!is_null($aAttToLoad) && !isset($aAttToLoad[$sSelectedAlias]["friendlyname"]))
@@ -2080,7 +2091,7 @@ abstract class MetaModel
 			foreach($aExtendedDataSpec['fields'] as $sColumn)
 			{
 				$sColRef = $oFilter->GetClassAlias().'_extdata_'.$sColumn;
-				$aExtendedFields[$sColRef] = new FieldExpressionResolved($sColumn, $sTableAlias);;
+				$aExtendedFields[$sColRef] = new FieldExpressionResolved($sColumn, $sTableAlias);
 			}
 			$oSelectExt = new SQLQuery($aExtendedDataSpec['table'], $sTableAlias, $aExtendedFields);
 			$oSelect->AddInnerJoin($oSelectExt, 'id', $aExtendedDataSpec['join_key'] /*, $sTableAlias*/);

+ 2 - 1
core/sqlquery.class.inc.php

@@ -407,7 +407,8 @@ class SQLQuery
 		$aOrderBySpec = array();
 		foreach($aOrderBy as $sFieldAlias => $bAscending)
 		{
-			$aOrderBySpec[] = '`'.$sFieldAlias.'`'.($bAscending ? " ASC" : " DESC");
+			// Note: sFieldAlias must have backticks around column aliases
+			$aOrderBySpec[] = $sFieldAlias.($bAscending ? " ASC" : " DESC");
 		}
 		$sOrderBy = implode(", ", $aOrderBySpec);
 		return $sOrderBy;