Addshore has uploaded a new change for review.
https://gerrit.wikimedia.org/r/87051
Change subject: Add logic to SQLiteSchemaSqlBuilder getRemoveField
......................................................................
Add logic to SQLiteSchemaSqlBuilder getRemoveField
Change-Id: I9fb9ea6a4edf3639c96890687349c75e8275de36
---
M src/SQLite/SQLiteSchemaSqlBuilder.php
M tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
2 files changed, 78 insertions(+), 8 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseDatabase
refs/changes/51/87051/1
diff --git a/src/SQLite/SQLiteSchemaSqlBuilder.php
b/src/SQLite/SQLiteSchemaSqlBuilder.php
index 86c6632..dfcb091 100644
--- a/src/SQLite/SQLiteSchemaSqlBuilder.php
+++ b/src/SQLite/SQLiteSchemaSqlBuilder.php
@@ -2,9 +2,12 @@
namespace Wikibase\Database\SQLite;
+use Exception;
use Wikibase\Database\Escaper;
+use Wikibase\Database\QueryInterface\QueryInterface;
use Wikibase\Database\Schema\Definitions\FieldDefinition;
use Wikibase\Database\Schema\SchemaModificationSqlBuilder;
+use Wikibase\Database\Schema\TableDefinitionReader;
use Wikibase\Database\TableNameFormatter;
/**
@@ -23,20 +26,55 @@
/**
* @param Escaper $fieldValueEscaper
* @param TableNameFormatter $tableNameFormatter
+ * @param TableDefinitionReader $definitionReader
*/
- public function __construct( Escaper $fieldValueEscaper,
TableNameFormatter $tableNameFormatter ) {
+ public function __construct( Escaper $fieldValueEscaper,
TableNameFormatter $tableNameFormatter, TableDefinitionReader $definitionReader
) {
$this->fieldSqlBuilder = new SQLiteFieldSqlBuilder(
$fieldValueEscaper );
$this->tableNameFormatter = $tableNameFormatter;
+ $this->tableDefinitionReader = $definitionReader;
+ $this->tableSqlBuilder = new SQLiteTableSqlBuilder(
$fieldValueEscaper, $tableNameFormatter );
}
/**
* @param string $tableName
* @param string $fieldName
*
+ * @throws Exception
* @return string
*/
public function getRemoveFieldSql( $tableName, $fieldName ) {
- // TODO this will need to create a new table with the new
scheme and copy all data across
+
+ $definition = $this->tableDefinitionReader->readDefinition(
$tableName );
+ if( !$definition->hasFieldWithName( $fieldName ) ){
+ //todo better exception
+ throw new Exception( "No such field '{$fieldName}' in
table {$tableName}" );
+ }
+
+ $tableName = $this->tableNameFormatter->formatTableName(
$tableName );
+ $tmpTableName = $this->tableNameFormatter->formatTableName(
$tableName . '_tmp' );
+ $sql = "ALTER TABLE {$tableName} RENAME TO {$tmpTableName};";
+
+ //todo tableDefinition->removeFieldWithName( $name )
+ $fields = $definition->getFields();
+ foreach( $fields as $key => $field ){
+ if( $field->getName() == $fieldName ){
+ unset ( $fields[$key] );
+ }
+ }
+ $definition = $definition->mutateFields( $fields );
+ $sql .= $this->tableSqlBuilder->getCreateTableSql( $definition
);
+
+ $fieldNames = array();
+ foreach( $fields as $field ){
+ $fieldNames[] = $field->getName();
+ }
+ $fieldsSql = implode( ', ', $fieldNames );
+
+ $sql .= "INSERT INTO {$tableName}({$fieldsSql}) SELECT
{$fieldsSql} FROM {$tmpTableName};";
+
+ $sql .= "DROP TABLE {$tmpTableName};";
+
+ return $sql;
}
/**
diff --git a/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
b/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
index 8832094..03d7619 100644
--- a/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
+++ b/tests/phpunit/SQLite/SQLiteSchemaSqlBuilderTest.php
@@ -3,6 +3,8 @@
namespace Wikibase\Database\Tests\SQLite;
use Wikibase\Database\Schema\Definitions\FieldDefinition;
+use Wikibase\Database\Schema\Definitions\IndexDefinition;
+use Wikibase\Database\Schema\Definitions\TableDefinition;
use Wikibase\Database\SQLite\SQLiteSchemaSqlBuilder;
/**
@@ -17,7 +19,7 @@
*/
class SQLiteSchemaSqlBuilderTest extends \PHPUnit_Framework_TestCase {
- private function newInstance() {
+ private function newInstance( $existingDefinition ) {
$mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
$mockEscaper->expects( $this->any() )
->method( 'getEscapedValue' )
@@ -28,14 +30,44 @@
->method( 'formatTableName' )
->will( $this->returnArgument(0) );
- return new SQLiteSchemaSqlBuilder( $mockEscaper,
$mockTableNameFormatter );
+ $mockQueryInterface = $this
+ ->getMockBuilder(
'Wikibase\Database\SQLite\SQLiteTableDefinitionReader' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $mockQueryInterface->expects( $this->any() )
+ ->method( 'readDefinition' )
+ ->will( $this->returnValue( $existingDefinition ) );
+
+ return new SQLiteSchemaSqlBuilder( $mockEscaper,
$mockTableNameFormatter, $mockQueryInterface );
}
public function testGetAddFieldSql(){
- $instance = $this->newInstance();
- $field = new FieldDefinition( 'intField',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42 );
- $sql = $instance->getAddFieldSql( 'tableName', $field );
- $this->assertEquals( 'ALTER TABLE tableName ADD COLUMN intField
INT DEFAULT 42 NOT NULL', $sql );
+ $existingDefinition = new TableDefinition( 'tableName',
+ array(
+ new FieldDefinition( 'primaryField',
+ FieldDefinition::TYPE_INTEGER,
+ FieldDefinition::NOT_NULL,
+ FieldDefinition::NO_DEFAULT
+ ),
+ new FieldDefinition( 'textField',
+ FieldDefinition::TYPE_TEXT
+ ),
+ new FieldDefinition( 'intField',
+ FieldDefinition::TYPE_INTEGER,
+ FieldDefinition::NOT_NULL, 42
+ ),
+ ),
+ array(
+ new IndexDefinition( 'INDEX',
+ array( 'textField' => 0, 'primaryField'
=> 0 ),
+ IndexDefinition::TYPE_INDEX
+ ),
+ )
+ );
+
+ $instance = $this->newInstance( $existingDefinition );
+ $sql = $instance->getRemoveFieldSql( 'tableName', 'textField' );
+ $this->assertEquals( 'ALTER TABLE tableName RENAME TO
tableName_tmp;CREATE TABLE tableName (primaryField INT NOT NULL, intField INT
DEFAULT 42 NOT NULL);CREATE INDEX INDEX ON tableName
(textField,primaryField);INSERT INTO tableName(primaryField, intField) SELECT
primaryField, intField FROM tableName_tmp;DROP TABLE tableName_tmp;', $sql );
}
}
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/87051
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9fb9ea6a4edf3639c96890687349c75e8275de36
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits