Explorar el Código

Creation of indexes on several columns (exploited for a few classes when it was obvious)

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2924 a333f486-631f-4898-b8df-5754b55c2be0
romainq hace 11 años
padre
commit
b10cf7c569

+ 4 - 1
core/cmdbchangeop.class.inc.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2010-2012 Combodo SARL
+// Copyright (C) 2010-2013 Combodo SARL
 //
 //   This file is part of iTop.
 //
@@ -45,6 +45,9 @@ class CMDBChangeOp extends DBObject
 			"db_table" => "priv_changeop",
 			"db_key_field" => "id",
 			"db_finalclass_field" => "optype",
+			'indexes' => array(
+				array('objclass', 'objkey'),
+			)
 		);
 		MetaModel::Init_Params($aParams);
 		//MetaModel::Init_InheritAttributes();

+ 26 - 6
core/cmdbsource.class.inc.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2010-2012 Combodo SARL
+// Copyright (C) 2010-2013 Combodo SARL
 //
 //   This file is part of iTop.
 //
@@ -480,14 +480,23 @@ class CMDBSource
 		return ($aFieldData["Type"]);
 	}
 
-	public static function HasIndex($sTable, $sField)
+	public static function HasIndex($sTable, $sIndexId, $aFields = null)
 	{
 		$aTableInfo = self::GetTableInfo($sTable);
 		if (empty($aTableInfo)) return false;
-		if (!array_key_exists($sField, $aTableInfo["Fields"])) return false;
-		$aFieldData = $aTableInfo["Fields"][$sField];
-		// $aFieldData could be 'PRI' for the primary key, or 'MUL', or ?
-		return (strlen($aFieldData["Key"]) > 0);
+		if (!array_key_exists($sIndexId, $aTableInfo['Indexes'])) return false;
+
+		if ($aFields == null)
+		{
+			// Just searching for the name
+			return true;
+		}
+
+		// Compare the columns
+		$sSearchedIndex = implode(',', $aFields);
+		$sExistingIndex = implode(',', $aTableInfo['Indexes'][$sIndexId]);
+
+		return ($sSearchedIndex == $sExistingIndex);
 	}
 
 	// Returns an array of (fieldname => array of field info)
@@ -537,6 +546,17 @@ class CMDBSource
 			// Table does not exist
 			self::$m_aTablesInfo[strtolower($sTableName)] = null;
 		}
+
+		if (!is_null(self::$m_aTablesInfo[strtolower($sTableName)]))
+		{
+			$aIndexes = self::QueryToArray("SHOW INDEXES FROM `$sTableName`");
+			$aMyIndexes = array();
+			foreach ($aIndexes as $aIndexColumn)
+			{
+				$aMyIndexes[$aIndexColumn['Key_name']][$aIndexColumn['Seq_in_index']-1] = $aIndexColumn['Column_name'];
+			}
+			self::$m_aTablesInfo[strtolower($sTableName)]["Indexes"] = $aMyIndexes;
+		}
 	}
 	//public static function EnumTables()
 	//{

+ 5 - 2
core/event.class.inc.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2010-2012 Combodo SARL
+// Copyright (C) 2010-2013 Combodo SARL
 //
 //   This file is part of iTop.
 //
@@ -137,7 +137,10 @@ class EventNotification extends Event
 			"db_key_field" => "id",
 			"db_finalclass_field" => "",
 			"display_template" => "",
-			"order_by_default" => array('date' => false)
+			"order_by_default" => array('date' => false),
+			'indexes' => array(
+				array('object_id'),
+			)
 		);
 		MetaModel::Init_Params($aParams);
 		MetaModel::Init_InheritAttributes();

+ 62 - 6
core/metamodel.class.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2010-2012 Combodo SARL
+// Copyright (C) 2010-2013 Combodo SARL
 //
 //   This file is part of iTop.
 //
@@ -671,6 +671,19 @@ abstract class MetaModel
 		return $aTables;
 	} 
 
+	final static public function DBGetIndexes($sClass)
+	{
+		self::_check_subclass($sClass);
+		if (isset(self::$m_aClassParams[$sClass]['indexes']))
+		{
+			return self::$m_aClassParams[$sClass]['indexes'];
+		}
+		else
+		{
+			return array();
+		}
+	}
+
 	final static public function DBGetKey($sClass)
 	{
 		self::_check_subclass($sClass);	
@@ -3938,7 +3951,7 @@ abstract class MetaModel
 							$aCreateTableItems[$sTable][$sField] = $sFieldDefinition;
 							if ($bIndexNeeded)
 							{
-								$aCreateTableItems[$sTable][$sField.'_ix'] = "INDEX (`$sField`)";
+								$aCreateTableItems[$sTable][] = "INDEX (`$sField`)";
 							}
 						}
 						else
@@ -3946,7 +3959,7 @@ abstract class MetaModel
 							$aAlterTableItems[$sTable][$sField] = "ADD $sFieldDefinition";
 							if ($bIndexNeeded)
 							{
-								$aAlterTableItems[$sTable][$sField.'_ix'] = "ADD INDEX (`$sField`)";
+								$aAlterTableItems[$sTable][] = "ADD INDEX (`$sField`)";
 							}
 						}
 					}
@@ -3981,15 +3994,58 @@ abstract class MetaModel
 
 						// Create indexes (external keys only... so far)
 						//
-						if ($bIndexNeeded && !CMDBSource::HasIndex($sTable, $sField))
+						if ($bIndexNeeded && !CMDBSource::HasIndex($sTable, $sField, array($sField)))
 						{
 							$aErrors[$sClass][$sAttCode][] = "Foreign key '$sField' in table '$sTable' should have an index";
-							$aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` ADD INDEX (`$sField`)";
-							$aAlterTableItems[$sTable][$sField.'_ix'] = "ADD INDEX (`$sField`)";
+							if (CMDBSource::HasIndex($sTable, $sField))
+							{
+								$aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` DROP INDEX `$sField`, ADD INDEX (`$sField`)";
+								$aAlterTableItems[$sTable][] = "DROP INDEX `$sField`";
+								$aAlterTableItems[$sTable][] = "ADD INDEX (`$sField`)";
+							}
+							else
+							{
+								$aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` ADD INDEX (`$sField`)";
+								$aAlterTableItems[$sTable][] = "ADD INDEX (`$sField`)";
+							}
 						}
 					}
 				}
 			}
+			
+			// Check indexes
+			foreach (self::DBGetIndexes($sClass) as $aColumns)
+			{
+				$sIndexId = implode('_', $aColumns);
+
+				if(!CMDBSource::HasIndex($sTable, $sIndexId, $aColumns))
+				{
+					$sColumns = "`".implode("`, `", $aColumns)."`";
+					if (CMDBSource::HasIndex($sTable, $sIndexId))
+					{
+						$aErrors[$sClass]['*'][] = "Wrong index '$sIndexId' ($sColumns) in table '$sTable'";
+						$aSugFix[$sClass]['*'][] = "ALTER TABLE `$sTable` DROP INDEX `$sIndexId`, ADD INDEX `$sIndexId` ($sColumns)";
+					}
+					else
+					{
+						$aErrors[$sClass]['*'][] = "Missing index '$sIndexId' ($sColumns) in table '$sTable'";
+						$aSugFix[$sClass]['*'][] = "ALTER TABLE `$sTable` ADD INDEX `$sIndexId` ($sColumns)";
+					}
+					if (array_key_exists($sTable, $aCreateTable))
+					{
+						$aCreateTableItems[$sTable][] = "INDEX `$sIndexId` ($sColumns)";
+					}
+					else
+					{
+						if (CMDBSource::HasIndex($sTable, $sIndexId))
+						{
+							$aAlterTableItems[$sTable][] = "DROP INDEX `$sIndexId`";
+						}
+						$aAlterTableItems[$sTable][] = "ADD INDEX `$sIndexId` ($sColumns)";
+					}
+				}
+			}
+			
 			// Find out unused columns
 			//
 			foreach($aTableInfo['Fields'] as $sField => $aFieldData)

+ 13 - 0
datamodels/1.x/itop-attachments/datamodel.itop-attachments.xml

@@ -35,6 +35,19 @@
             <attribute id=""/>
           </attributes>
         </reconciliation>
+        <indexes>
+          <index id="1">
+             <attributes>
+               <attribute id="temp_id"/>
+             </attributes>
+          </index>
+          <index id="2">
+             <attributes>
+               <attribute id="item_class"/>
+               <attribute id="item_id"/>
+             </attributes>
+          </index>
+        </indexes>
       </properties>
       <fields>
         <field id="expire" xsi:type="AttributeDateTime">

+ 13 - 0
datamodels/2.x/itop-attachments/datamodel.itop-attachments.xml

@@ -35,6 +35,19 @@
             <attribute id=""/>
           </attributes>
         </reconciliation>
+        <indexes>
+          <index id="1">
+             <attributes>
+               <attribute id="temp_id"/>
+             </attributes>
+          </index>
+          <index id="2">
+             <attributes>
+               <attribute id="item_class"/>
+               <attribute id="item_id"/>
+             </attributes>
+          </index>
+        </indexes>
       </properties>
       <fields>
         <field id="expire" xsi:type="AttributeDateTime">

+ 17 - 2
setup/compiler.class.inc.php

@@ -1,5 +1,5 @@
 <?php
-// Copyright (C) 2011-2012 Combodo SARL
+// Copyright (C) 2011-2013 Combodo SARL
 //
 //   This file is part of iTop.
 //
@@ -654,7 +654,22 @@ EOF;
 				$aClassParams['order_by_default'] = "array(".implode(", ", $aSortColumns).")";
 			}
 		}
-	
+
+		if ($oIndexes = $oProperties->GetOptionalElement('indexes'))
+		{
+			$aIndexes = array();
+			foreach($oIndexes->getElementsByTagName('index') as $oIndex)
+			{
+				$sIndexId = $oIndex->getAttribute('id');
+				$oAttributes = $oIndex->GetUniqueElement('attributes');
+				foreach($oAttributes->getElementsByTagName('attribute') as $oAttribute)
+				{
+					$aIndexes[$sIndexId][] = $oAttribute->getAttribute('id');
+				}
+			}
+			$aClassParams['indexes'] = var_export($aIndexes, true);
+		}
+
 
 		// Finalize class params declaration
 		//