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

Reply via email to