Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add MySQL FULLTEXT support.

Minor optimizations and testing added.
Merge pull request #862 from bar/mysql-fulltext

Fixes #262
  • Loading branch information...
commit aaefbf1c2f927b0a7f7a2a1c487c2cffa6bc795f 1 parent e931211
Ber Clausen bar authored markstory committed
35 lib/Cake/Model/Datasource/Database/Mysql.php
View
@@ -423,17 +423,21 @@ public function index($model) {
$table = $this->fullTableName($model);
$old = version_compare($this->getVersion(), '4.1', '<=');
if ($table) {
- $indices = $this->_execute('SHOW INDEX FROM ' . $table);
+ $indexes = $this->_execute('SHOW INDEX FROM ' . $table);
// @codingStandardsIgnoreStart
// MySQL columns don't match the cakephp conventions.
- while ($idx = $indices->fetch(PDO::FETCH_OBJ)) {
+ while ($idx = $indexes->fetch(PDO::FETCH_OBJ)) {
if ($old) {
$idx = (object)current((array)$idx);
}
if (!isset($index[$idx->Key_name]['column'])) {
$col = array();
$index[$idx->Key_name]['column'] = $idx->Column_name;
- $index[$idx->Key_name]['unique'] = intval($idx->Non_unique == 0);
+ if ($idx->Index_type === 'FULLTEXT') {
+ $index[$idx->Key_name]['type'] = strtolower($idx->Index_type);
+ } else {
+ $index[$idx->Key_name]['unique'] = intval($idx->Non_unique == 0);
+ }
} else {
if (!empty($index[$idx->Key_name]['column']) && !is_array($index[$idx->Key_name]['column'])) {
$col[] = $index[$idx->Key_name]['column'];
@@ -443,7 +447,7 @@ public function index($model) {
}
}
// @codingStandardsIgnoreEnd
- $indices->closeCursor();
+ $indexes->closeCursor();
}
return $index;
}
@@ -553,31 +557,18 @@ protected function _alterIndexes($table, $indexes) {
if (isset($indexes['drop'])) {
foreach ($indexes['drop'] as $name => $value) {
$out = 'DROP ';
- if ($name == 'PRIMARY') {
+ if ($name === 'PRIMARY') {
$out .= 'PRIMARY KEY';
} else {
- $out .= 'KEY ' . $name;
+ $out .= 'KEY ' . $this->startQuote . $name . $this->endQuote;
}
$alter[] = $out;
}
}
if (isset($indexes['add'])) {
- foreach ($indexes['add'] as $name => $value) {
- $out = 'ADD ';
- if ($name == 'PRIMARY') {
- $out .= 'PRIMARY ';
- $name = null;
- } else {
- if (!empty($value['unique'])) {
- $out .= 'UNIQUE ';
- }
- }
- if (is_array($value['column'])) {
- $out .= 'KEY ' . $name . ' (' . implode(', ', array_map(array(&$this, 'name'), $value['column'])) . ')';
- } else {
- $out .= 'KEY ' . $name . ' (' . $this->name($value['column']) . ')';
- }
- $alter[] = $out;
+ $add = $this->buildIndex($indexes['add']);
+ foreach ($add as $index) {
+ $alter[] = 'ADD ' . $index;
}
}
return $alter;
4 lib/Cake/Model/Datasource/DboSource.php
View
@@ -3125,7 +3125,7 @@ protected function _buildFieldParameters($columnString, $columnData, $position)
}
/**
- * Format indexes for create table
+ * Format indexes for create table.
*
* @param array $indexes
* @param string $table
@@ -3141,6 +3141,8 @@ public function buildIndex($indexes, $table = null) {
} else {
if (!empty($value['unique'])) {
$out .= 'UNIQUE ';
+ } elseif (!empty($value['type']) && strtoupper($value['type']) === 'FULLTEXT') {
+ $out .= 'FULLTEXT ';
}
$name = $this->startQuote . $name . $this->endQuote;
}
17 lib/Cake/Test/Case/Model/CakeSchemaTest.php
View
@@ -763,6 +763,23 @@ public function testGenerateTable() {
);
$result = $this->Schema->generateTable('posts', $posts);
$this->assertRegExp('/public \$posts/', $result);
+
+ $posts = array(
+ 'id' => array('type' => 'integer', 'null' => false, 'default' => 0, 'key' => 'primary'),
+ 'author_id' => array('type' => 'integer', 'null' => false),
+ 'title' => array('type' => 'string', 'null' => false),
+ 'body' => array('type' => 'text', 'null' => true, 'default' => null),
+ 'published' => array('type' => 'string', 'null' => true, 'default' => 'N', 'length' => 1),
+ 'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'updated' => array('type' => 'datetime', 'null' => true, 'default' => null),
+ 'indexes' => array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => true),
+ 'MyFtIndex' => array('column' => array('title', 'body'), 'type' => 'fulltext')
+ )
+ );
+ $result = $this->Schema->generateTable('fields', $posts);
+ $this->assertRegExp('/public \$fields/', $result);
+ $this->assertPattern('/\'type\' \=\> \'fulltext\'/', $result);
}
/**
45 lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php
View
@@ -320,6 +320,16 @@ public function testIndexDetection() {
$result = $this->Dbo->index('with_multiple_compound_keys', false);
$this->Dbo->rawQuery('DROP TABLE ' . $name);
$this->assertEquals($expected, $result);
+
+ $name = $this->Dbo->fullTableName('with_fulltext');
+ $this->Dbo->rawQuery('CREATE TABLE ' . $name . ' (id int(11) AUTO_INCREMENT, name varchar(255), description text, primary key(id), FULLTEXT KEY `MyFtIndex` ( `name`, `description` )) ENGINE=MyISAM;');
+ $expected = array(
+ 'PRIMARY' => array('column' => 'id', 'unique' => 1),
+ 'MyFtIndex' => array('column' => array('name', 'description'), 'type' => 'fulltext')
+ );
+ $result = $this->Dbo->index('with_fulltext', false);
+ $this->Dbo->rawQuery('DROP TABLE ' . $name);
+ $this->assertEquals($expected, $result);
}
/**
@@ -559,9 +569,9 @@ public function testAlterSchemaIndexes() {
$result = $this->Dbo->alterSchema($schemaB->compare($schemaA));
$this->assertContains("ALTER TABLE $table", $result);
- $this->assertContains('ADD KEY name_idx (`name`),', $result);
- $this->assertContains('ADD KEY group_idx (`group1`),', $result);
- $this->assertContains('ADD KEY compound_idx (`group1`, `group2`),', $result);
+ $this->assertContains('ADD KEY `name_idx` (`name`),', $result);
+ $this->assertContains('ADD KEY `group_idx` (`group1`),', $result);
+ $this->assertContains('ADD KEY `compound_idx` (`group1`, `group2`),', $result);
$this->assertContains('ADD PRIMARY KEY (`id`);', $result);
//Test that the string is syntactically correct
@@ -587,13 +597,13 @@ public function testAlterSchemaIndexes() {
$result = $this->Dbo->alterSchema($schemaC->compare($schemaB));
$this->assertContains("ALTER TABLE $table", $result);
$this->assertContains('DROP PRIMARY KEY,', $result);
- $this->assertContains('DROP KEY name_idx,', $result);
- $this->assertContains('DROP KEY group_idx,', $result);
- $this->assertContains('DROP KEY compound_idx,', $result);
- $this->assertContains('ADD KEY id_name_idx (`id`, `name`),', $result);
- $this->assertContains('ADD UNIQUE KEY name_idx (`name`),', $result);
- $this->assertContains('ADD KEY group_idx (`group2`),', $result);
- $this->assertContains('ADD KEY compound_idx (`group2`, `group1`);', $result);
+ $this->assertContains('DROP KEY `name_idx`,', $result);
+ $this->assertContains('DROP KEY `group_idx`,', $result);
+ $this->assertContains('DROP KEY `compound_idx`,', $result);
+ $this->assertContains('ADD KEY `id_name_idx` (`id`, `name`),', $result);
+ $this->assertContains('ADD UNIQUE KEY `name_idx` (`name`),', $result);
+ $this->assertContains('ADD KEY `group_idx` (`group2`),', $result);
+ $this->assertContains('ADD KEY `compound_idx` (`group2`, `group1`);', $result);
$query = $this->Dbo->getConnection()->prepare($result);
$this->assertEquals($query->queryString, $result);
@@ -605,10 +615,10 @@ public function testAlterSchemaIndexes() {
$result = $this->Dbo->alterSchema($schemaA->compare($schemaC));
$this->assertContains("ALTER TABLE $table", $result);
- $this->assertContains('DROP KEY name_idx,', $result);
- $this->assertContains('DROP KEY group_idx,', $result);
- $this->assertContains('DROP KEY compound_idx,', $result);
- $this->assertContains('DROP KEY id_name_idx;', $result);
+ $this->assertContains('DROP KEY `name_idx`,', $result);
+ $this->assertContains('DROP KEY `group_idx`,', $result);
+ $this->assertContains('DROP KEY `compound_idx`,', $result);
+ $this->assertContains('DROP KEY `id_name_idx`;', $result);
$query = $this->Dbo->getConnection()->prepare($result);
$this->assertEquals($query->queryString, $result);
@@ -2867,6 +2877,13 @@ public function testBuildIndex() {
$result = $this->Dbo->buildIndex($data);
$expected = array('UNIQUE KEY `MyIndex` (`id`, `name`)');
$this->assertEquals($expected, $result);
+
+ $data = array(
+ 'MyFtIndex' => array('column' => array('name', 'description'), 'type' => 'fulltext')
+ );
+ $result = $this->Dbo->buildIndex($data);
+ $expected = array('FULLTEXT KEY `MyFtIndex` (`name`, `description`)');
+ $this->assertEquals($expected, $result);
}
/**
Please sign in to comment.
Something went wrong with that request. Please try again.