diff --git a/extensions/sphinx/Schema.php b/extensions/sphinx/Schema.php index 628f62f..ca05e38 100644 --- a/extensions/sphinx/Schema.php +++ b/extensions/sphinx/Schema.php @@ -7,6 +7,9 @@ namespace yii\sphinx; +use yii\db\ColumnSchema; +use yii\db\TableSchema; + /** * Class Schema * @@ -24,4 +27,89 @@ class Schema extends \yii\db\mysql\Schema { return new QueryBuilder($this->db); } + + /** + * Loads the metadata for the specified table. + * @param string $name table name + * @return TableSchema driver dependent table metadata. Null if the table does not exist. + */ + protected function loadTableSchema($name) + { + $table = new TableSchema; + $this->resolveTableNames($table, $name); + + if ($this->findColumns($table)) { + return $table; + } else { + return null; + } + } + + /** + * Collects the metadata of table columns. + * @param TableSchema $table the table metadata + * @return boolean whether the table exists in the database + * @throws \Exception if DB query fails + */ + protected function findColumns($table) + { + $sql = 'DESCRIBE ' . $this->quoteSimpleTableName($table->name); + try { + $columns = $this->db->createCommand($sql)->queryAll(); + } catch (\Exception $e) { + $previous = $e->getPrevious(); + if ($previous instanceof \PDOException && $previous->getCode() == '42S02') { + // index does not exist + return false; + } + throw $e; + } + foreach ($columns as $info) { + $column = $this->loadColumnSchema($info); + $table->columns[$column->name] = $column; + if ($column->isPrimaryKey) { + $table->primaryKey[] = $column->name; + if ($column->autoIncrement) { + $table->sequenceName = ''; + } + } + } + return true; + } + + /** + * Loads the column information into a [[ColumnSchema]] object. + * @param array $info column information + * @return ColumnSchema the column schema object + */ + protected function loadColumnSchema($info) + { + $column = new ColumnSchema; + + $column->name = $info['Field']; + // Not supported : + //$column->allowNull = $info['Null'] === 'YES'; + //$column->isPrimaryKey = strpos($info['Key'], 'PRI') !== false; + //$column->autoIncrement = stripos($info['Extra'], 'auto_increment') !== false; + //$column->comment = $info['Comment']; + + + $column->dbType = $info['Type']; + //$column->unsigned = strpos($column->dbType, 'unsigned') !== false; + + $type = $info['Type']; + if (isset($this->typeMap[$type])) { + $column->type = $this->typeMap[$type]; + } else { + $column->type = self::TYPE_STRING; + } + + $column->phpType = $this->getColumnPhpType($column); + + /*if ($column->type !== 'timestamp' || $info['Default'] !== 'CURRENT_TIMESTAMP') { + $column->defaultValue = $column->typecast($info['Default']); + }*/ + + return $column; + } } \ No newline at end of file diff --git a/tests/unit/data/sphinx/sphinx.conf b/tests/unit/data/sphinx/sphinx.conf index 8623245..fb28525 100644 --- a/tests/unit/data/sphinx/sphinx.conf +++ b/tests/unit/data/sphinx/sphinx.conf @@ -50,7 +50,7 @@ source yii2_test_item_src index yii2_test_article_index { source = yii2_test_article_src - path = /var/lib/sphinx/yii2_test_article_src + path = /var/lib/sphinx/yii2_test_article docinfo = extern charset_type = sbcs } @@ -59,12 +59,22 @@ index yii2_test_article_index index yii2_test_item_index { source = yii2_test_item_src - path = /var/lib/sphinx/yii2_test_item_src + path = /var/lib/sphinx/yii2_test_item docinfo = extern charset_type = sbcs } +index yii2_test_rt_index +{ + type = rt + path = /var/lib/sphinx/yii2_test_rt + rt_field = title + rt_field = content + rt_attr_uint = type_id +} + + indexer { mem_limit = 32M diff --git a/tests/unit/extensions/sphinx/CommandTest.php b/tests/unit/extensions/sphinx/CommandTest.php index 013b130..47fb5b9 100644 --- a/tests/unit/extensions/sphinx/CommandTest.php +++ b/tests/unit/extensions/sphinx/CommandTest.php @@ -9,6 +9,14 @@ use yii\db\DataReader; */ class CommandTest extends SphinxTestCase { + protected function tearDown() + { + $this->truncateRuntimeIndex('yii2_test_rt_index'); + parent::tearDown(); + } + + // Tests : + public function testExecute() { $db = $this->getConnection(); @@ -82,4 +90,50 @@ class CommandTest extends SphinxTestCase $this->setExpectedException('\yii\db\Exception'); $command->query(); } + + /** + * @depends testQuery + */ + public function testInsert() + { + $db = $this->getConnection(); + + $command = $db->createCommand()->insert('yii2_test_rt_index', [ + 'title' => 'Test title', + 'content' => 'Test content', + 'type_id' => 2, + 'id' => 1, + ]); + $this->assertEquals(1, $command->execute(), 'Unable to execute insert!'); + + $rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); + $this->assertEquals(1, count($rows), 'No row inserted!'); + } + + /** + * @depends testInsert + */ + public function testUpdate() + { + $db = $this->getConnection(); + + $db->createCommand()->insert('yii2_test_rt_index', [ + 'title' => 'Test title', + 'content' => 'Test content', + 'type_id' => 2, + 'id' => 1, + ])->execute(); + + $newTypeId = 5; + $command = $db->createCommand()->update( + 'yii2_test_rt_index', + [ + 'title' => 'Test title', + 'content' => 'Test content', + 'type_id' => $newTypeId, + ], + 'id = 1' + ); + $this->assertEquals(1, $command->execute(), 'Unable to execute update!'); + } } \ No newline at end of file diff --git a/tests/unit/extensions/sphinx/SphinxTestCase.php b/tests/unit/extensions/sphinx/SphinxTestCase.php index 475ca69..a77f987 100644 --- a/tests/unit/extensions/sphinx/SphinxTestCase.php +++ b/tests/unit/extensions/sphinx/SphinxTestCase.php @@ -75,7 +75,7 @@ class SphinxTestCase extends TestCase if (!$reset && $this->sphinx) { return $this->sphinx; } - $db = new \yii\db\Connection; + $db = new \yii\sphinx\Connection; $db->dsn = $this->sphinxConfig['dsn']; if (isset($this->sphinxConfig['username'])) { $db->username = $this->sphinxConfig['username']; @@ -98,4 +98,15 @@ class SphinxTestCase extends TestCase $this->sphinx = $db; return $db; } + + /** + * Truncates the runtime index. + * @param string $indexName index name. + */ + protected function truncateRuntimeIndex($indexName) + { + if ($this->sphinx) { + $this->sphinx->createCommand('TRUNCATE RTINDEX ' . $indexName)->execute(); + } + } } \ No newline at end of file