Commit 0f94ed39 by Paul Klimov

"Sphinx" unit tests updated to expose runtime indexes.

parent fe3f7f2d
......@@ -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
......@@ -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
......
......@@ -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
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment