You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
410 lines
11 KiB
410 lines
11 KiB
<?php |
|
|
|
namespace yiiunit\extensions\sphinx; |
|
|
|
use yii\sphinx\DataReader; |
|
use yii\db\Expression; |
|
|
|
/** |
|
* @group sphinx |
|
*/ |
|
class CommandTest extends SphinxTestCase |
|
{ |
|
protected function tearDown() |
|
{ |
|
$this->truncateRuntimeIndex('yii2_test_rt_index'); |
|
parent::tearDown(); |
|
} |
|
|
|
// Tests : |
|
|
|
public function testConstruct() |
|
{ |
|
$db = $this->getConnection(false); |
|
|
|
// null |
|
$command = $db->createCommand(); |
|
$this->assertEquals(null, $command->sql); |
|
|
|
// string |
|
$sql = 'SELECT * FROM yii2_test_item_index'; |
|
$params = [ |
|
'name' => 'value' |
|
]; |
|
$command = $db->createCommand($sql, $params); |
|
$this->assertEquals($sql, $command->sql); |
|
$this->assertEquals($params, $command->params); |
|
} |
|
|
|
public function testGetSetSql() |
|
{ |
|
$db = $this->getConnection(false); |
|
|
|
$sql = 'SELECT * FROM yii2_test_item_index'; |
|
$command = $db->createCommand($sql); |
|
$this->assertEquals($sql, $command->sql); |
|
|
|
$sql2 = 'SELECT * FROM yii2_test_item_index'; |
|
$command->sql = $sql2; |
|
$this->assertEquals($sql2, $command->sql); |
|
} |
|
|
|
public function testAutoQuoting() |
|
{ |
|
$db = $this->getConnection(false); |
|
|
|
$sql = 'SELECT [[id]], [[t.name]] FROM {{yii2_test_item_index}} t'; |
|
$command = $db->createCommand($sql); |
|
$this->assertEquals("SELECT `id`, `t`.`name` FROM `yii2_test_item_index` t", $command->sql); |
|
} |
|
|
|
public function testPrepareCancel() |
|
{ |
|
$db = $this->getConnection(false); |
|
|
|
$command = $db->createCommand('SELECT * FROM yii2_test_item_index'); |
|
$this->assertEquals(null, $command->pdoStatement); |
|
$command->prepare(); |
|
$this->assertNotEquals(null, $command->pdoStatement); |
|
$command->cancel(); |
|
$this->assertEquals(null, $command->pdoStatement); |
|
} |
|
|
|
public function testExecute() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$sql = 'SELECT COUNT(*) FROM yii2_test_item_index WHERE MATCH(\'wooden\')'; |
|
$command = $db->createCommand($sql); |
|
$this->assertEquals(1, $command->queryScalar()); |
|
|
|
$command = $db->createCommand('bad SQL'); |
|
$this->setExpectedException('\yii\db\Exception'); |
|
$command->execute(); |
|
} |
|
|
|
public function testQuery() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
// query |
|
$sql = 'SELECT * FROM yii2_test_item_index'; |
|
$reader = $db->createCommand($sql)->query(); |
|
$this->assertTrue($reader instanceof DataReader); |
|
|
|
// queryAll |
|
$rows = $db->createCommand('SELECT * FROM yii2_test_item_index')->queryAll(); |
|
$this->assertEquals(2, count($rows)); |
|
$row = $rows[1]; |
|
$this->assertEquals(2, $row['id']); |
|
$this->assertEquals(2, $row['category_id']); |
|
|
|
$rows = $db->createCommand('SELECT * FROM yii2_test_item_index WHERE id=10')->queryAll(); |
|
$this->assertEquals([], $rows); |
|
|
|
// queryOne |
|
$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; |
|
$row = $db->createCommand($sql)->queryOne(); |
|
$this->assertEquals(1, $row['id']); |
|
$this->assertEquals(1, $row['category_id']); |
|
|
|
$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; |
|
$command = $db->createCommand($sql); |
|
$command->prepare(); |
|
$row = $command->queryOne(); |
|
$this->assertEquals(1, $row['id']); |
|
$this->assertEquals(1, $row['category_id']); |
|
|
|
$sql = 'SELECT * FROM yii2_test_item_index WHERE id=10'; |
|
$command = $db->createCommand($sql); |
|
$this->assertFalse($command->queryOne()); |
|
|
|
// queryColumn |
|
$sql = 'SELECT * FROM yii2_test_item_index'; |
|
$column = $db->createCommand($sql)->queryColumn(); |
|
$this->assertEquals(range(1, 2), $column); |
|
|
|
$command = $db->createCommand('SELECT id FROM yii2_test_item_index WHERE id=10'); |
|
$this->assertEquals([], $command->queryColumn()); |
|
|
|
// queryScalar |
|
$sql = 'SELECT * FROM yii2_test_item_index ORDER BY id ASC'; |
|
$this->assertEquals($db->createCommand($sql)->queryScalar(), 1); |
|
|
|
$sql = 'SELECT id FROM yii2_test_item_index ORDER BY id ASC'; |
|
$command = $db->createCommand($sql); |
|
$command->prepare(); |
|
$this->assertEquals(1, $command->queryScalar()); |
|
|
|
$command = $db->createCommand('SELECT id FROM yii2_test_item_index WHERE id=10'); |
|
$this->assertFalse($command->queryScalar()); |
|
|
|
$command = $db->createCommand('bad SQL'); |
|
$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, |
|
'category' => [1, 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 testBatchInsert() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$command = $db->createCommand()->batchInsert( |
|
'yii2_test_rt_index', |
|
[ |
|
'title', |
|
'content', |
|
'type_id', |
|
'category', |
|
'id', |
|
], |
|
[ |
|
[ |
|
'Test title 1', |
|
'Test content 1', |
|
1, |
|
[1, 2], |
|
1, |
|
], |
|
[ |
|
'Test title 2', |
|
'Test content 2', |
|
2, |
|
[3, 4], |
|
2, |
|
], |
|
] |
|
); |
|
$this->assertEquals(2, $command->execute(), 'Unable to execute batch insert!'); |
|
|
|
$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals(2, count($rows), 'No rows inserted!'); |
|
} |
|
|
|
/** |
|
* @depends testInsert |
|
*/ |
|
public function testReplace() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$command = $db->createCommand()->replace('yii2_test_rt_index', [ |
|
'title' => 'Test title', |
|
'content' => 'Test content', |
|
'type_id' => 2, |
|
'category' => [1, 2], |
|
'id' => 1, |
|
]); |
|
$this->assertEquals(1, $command->execute(), 'Unable to execute replace!'); |
|
|
|
$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals(1, count($rows), 'No row inserted!'); |
|
|
|
$newTypeId = 5; |
|
$command = $db->createCommand()->replace('yii2_test_rt_index',[ |
|
'type_id' => $newTypeId, |
|
'category' => [3, 4], |
|
'id' => 1, |
|
]); |
|
$this->assertEquals(1, $command->execute(), 'Unable to update via replace!'); |
|
|
|
list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); |
|
} |
|
|
|
/** |
|
* @depends testReplace |
|
*/ |
|
public function testBatchReplace() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$command = $db->createCommand()->batchReplace( |
|
'yii2_test_rt_index', |
|
[ |
|
'title', |
|
'content', |
|
'type_id', |
|
'category', |
|
'id', |
|
], |
|
[ |
|
[ |
|
'Test title 1', |
|
'Test content 1', |
|
1, |
|
[1, 2], |
|
1, |
|
], |
|
[ |
|
'Test title 2', |
|
'Test content 2', |
|
2, |
|
[3, 4], |
|
2, |
|
], |
|
] |
|
); |
|
$this->assertEquals(2, $command->execute(), 'Unable to execute batch replace!'); |
|
|
|
$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals(2, count($rows), 'No rows inserted!'); |
|
|
|
$newTypeId = 5; |
|
$command = $db->createCommand()->replace('yii2_test_rt_index',[ |
|
'type_id' => $newTypeId, |
|
'id' => 1, |
|
]); |
|
$this->assertEquals(1, $command->execute(), 'Unable to update via replace!'); |
|
list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); |
|
} |
|
|
|
/** |
|
* @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', |
|
[ |
|
'type_id' => $newTypeId, |
|
'category' => [3, 4], |
|
], |
|
'id = 1' |
|
); |
|
$this->assertEquals(1, $command->execute(), 'Unable to execute update!'); |
|
|
|
list($row) = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals($newTypeId, $row['type_id'], 'Unable to update attribute value!'); |
|
} |
|
|
|
/** |
|
* @depends testUpdate |
|
*/ |
|
public function testUpdateWithOptions() |
|
{ |
|
$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', |
|
[ |
|
'type_id' => $newTypeId, |
|
'non_existing_attribute' => 10, |
|
], |
|
'id = 1', |
|
[], |
|
[ |
|
'ignore_nonexistent_columns' => 1 |
|
] |
|
); |
|
$this->assertEquals(1, $command->execute(), 'Unable to execute update!'); |
|
} |
|
|
|
/** |
|
* @depends testInsert |
|
*/ |
|
public function testDelete() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$db->createCommand()->insert('yii2_test_rt_index', [ |
|
'title' => 'Test title', |
|
'content' => 'Test content', |
|
'type_id' => 2, |
|
'id' => 1, |
|
])->execute(); |
|
|
|
$command = $db->createCommand()->delete('yii2_test_rt_index', 'id = 1'); |
|
$this->assertEquals(1, $command->execute(), 'Unable to execute delete!'); |
|
|
|
$rows = $db->createCommand('SELECT * FROM yii2_test_rt_index')->queryAll(); |
|
$this->assertEquals(0, count($rows), 'Unable to delete record!'); |
|
} |
|
|
|
/** |
|
* @depends testQuery |
|
*/ |
|
public function testCallSnippets() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$query = 'pencil'; |
|
$source = 'Some data sentence about ' . $query; |
|
|
|
$rows = $db->createCommand()->callSnippets('yii2_test_item_index', $source, $query)->queryColumn(); |
|
$this->assertNotEmpty($rows, 'Unable to call snippets!'); |
|
$this->assertContains('<b>' . $query . '</b>', $rows[0], 'Query not present in the snippet!'); |
|
|
|
$rows = $db->createCommand()->callSnippets('yii2_test_item_index', [$source], $query)->queryColumn(); |
|
$this->assertNotEmpty($rows, 'Unable to call snippets for array source!'); |
|
|
|
$options = [ |
|
'before_match' => '[', |
|
'after_match' => ']', |
|
'limit' => 20, |
|
]; |
|
$snippet = $db->createCommand()->callSnippets('yii2_test_item_index', $source, $query, $options)->queryScalar(); |
|
$this->assertContains($options['before_match'] . $query . $options['after_match'], $snippet, 'Unable to apply options!'); |
|
} |
|
|
|
/** |
|
* @depends testQuery |
|
*/ |
|
public function testCallKeywords() |
|
{ |
|
$db = $this->getConnection(); |
|
|
|
$text = 'table pencil'; |
|
$rows = $db->createCommand()->callKeywords('yii2_test_item_index', $text)->queryAll(); |
|
$this->assertNotEmpty($rows, 'Unable to call keywords!'); |
|
$this->assertArrayHasKey('tokenized', $rows[0], 'No tokenized keyword!'); |
|
$this->assertArrayHasKey('normalized', $rows[0], 'No normalized keyword!'); |
|
|
|
$text = 'table pencil'; |
|
$rows = $db->createCommand()->callKeywords('yii2_test_item_index', $text, true)->queryAll(); |
|
$this->assertNotEmpty($rows, 'Unable to call keywords with statistic!'); |
|
$this->assertArrayHasKey('docs', $rows[0], 'No docs!'); |
|
$this->assertArrayHasKey('hits', $rows[0], 'No hits!'); |
|
} |
|
} |