/** * Check if given Index is duplicate of this * * @param Index $index Index * * @return bool TRUE if duplicate, otherwise FALSE */ public function isDuplicate(Index $index) { /** * Check if columns are the same */ $duplicate = $this->getColumns() === $index->getColumns(); /** * If indices have different unique status they cant be duplicates */ if ($this->isUnique() !== $index->isUnique()) { $duplicate = false; } /** * If one of the indicies is the primary key they cant be duplicates */ if ($this->isPrimaryKey() === true || $index->isPrimaryKey() === true) { $duplicate = false; } return $duplicate; }
/** * Compute the difference between two index objects * * @param Index $fromIndex * @param Index $toIndex * @param boolean $caseInsensitive Whether the comparison is case insensitive. * False by default. * * @return boolean false if the two indices are similar, true if they have differences */ public static function computeDiff(Index $fromIndex, Index $toIndex, $caseInsensitive = false) { // Check for removed index columns in $toIndex $fromIndexColumns = $fromIndex->getColumns(); for ($i = 0; $i < count($fromIndexColumns); $i++) { $indexColumn = $fromIndexColumns[$i]; if (!$toIndex->hasColumnAtPosition($i, $indexColumn, null, $caseInsensitive)) { return true; } } // Check for new index columns in $toIndex $toIndexColumns = $toIndex->getColumns(); for ($i = 0; $i < count($toIndexColumns); $i++) { $indexColumn = $toIndexColumns[$i]; if (!$fromIndex->hasColumnAtPosition($i, $indexColumn, null, $caseInsensitive)) { return true; } } // Check for difference in unicity if ($fromIndex->isUnique() != $toIndex->isUnique()) { return true; } return false; }
/** * Creates a comma-separated list of column names for the index. * For MySQL unique indexes there is the option of specifying size, so we cannot simply use * the getColumnsList() method. * @param Index $index * @return string */ private function getIndexColumnList(Index $index) { $platform = $this->getPlatform(); $cols = $index->getColumns(); $list = array(); foreach ($cols as $col) { $list[] = $this->quoteIdentifier($col) . ($index->hasColumnSize($col) ? '(' . $index->getColumnSize($col) . ')' : ''); } return implode(', ', $list); }
/** * Finds the difference between the indexes $index1 and $index2. * * Compares $index1 with $index2 and returns $index2 if there are any * differences or false in case there are no differences. * * @param Index $index1 * @param Index $index2 * @return bool */ public function diffIndex(Index $index1, Index $index2) { if ($index1->isPrimary() != $index2->isPrimary()) { return true; } if ($index1->isUnique() != $index2->isUnique()) { return true; } // Check for removed index fields in $index2 $index1Columns = $index1->getColumns(); for ($i = 0; $i < count($index1Columns); $i++) { $indexColumn = $index1Columns[$i]; if (!$index2->hasColumnAtPosition($indexColumn, $i)) { return true; } } // Check for new index fields in $index2 $index2Columns = $index2->getColumns(); for ($i = 0; $i < count($index2Columns); $i++) { $indexColumn = $index2Columns[$i]; if (!$index1->hasColumnAtPosition($indexColumn, $i)) { return true; } } return false; }
/** * Creates a comma-separated list of column names for the index. * For MySQL unique indexes there is the option of specifying size, so we cannot simply use * the getColumnsList() method. * @param Index $index * @return string */ protected function getIndexColumnListDDL(Index $index) { $list = array(); foreach ($index->getColumns() as $col) { $list[] = $this->quoteIdentifier($col) . ($index->hasColumnSize($col) ? '(' . $index->getColumnSize($col) . ')' : ''); } return implode(', ', $list); }
/** * Builds the DDL SQL to add an Index. * * @param Index $index * @return string */ public function getAddIndexDDL(Index $index) { // don't create index form primary key if ($this->getPrimaryKeyName($index->getTable()) == $this->quoteIdentifier($index->getName())) { return ""; } $pattern = "\r\nCREATE %sINDEX %s ON %s (%s)%s;\r\n"; return sprintf($pattern, $index->getIsUnique() ? 'UNIQUE ' : '', $this->quoteIdentifier($index->getName()), $this->quoteIdentifier($index->getTable()->getName()), $this->getColumnListDDL($index->getColumns()), $this->generateBlockStorage($index)); }
/** * Builds the DDL SQL for an Index object. * * @param Index $index * @return string */ public function getIndexDDL(Index $index) { return sprintf('%sINDEX %s (%s)', $index->getIsUnique() ? 'UNIQUE ' : '', $this->quoteIdentifier($index->getName()), $this->getColumnListDDL($index->getColumns())); }