Jeroen De Dauw has submitted this change and it was merged.

Change subject: Split code into FieldSqlBuilder
......................................................................


Split code into FieldSqlBuilder

Change-Id: Ib6b3a3bddb5906e5a752238cfd84ab1fe6ee344a
---
A src/MySQL/MySqlFieldSqlBuilder.php
M src/MySQL/MySqlTableSqlBuilder.php
M src/SQLite/SQLiteTableSqlBuilder.php
A src/SQLite/SQliteFieldSqlBuilder.php
A src/Schema/FieldSqlBuilder.php
A tests/phpunit/MySQL/MySqlFieldSqlBuilderTest.php
A tests/phpunit/SQLite/SQliteFieldSqlBuilderTest.php
7 files changed, 298 insertions(+), 109 deletions(-)

Approvals:
  Jeroen De Dauw: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/src/MySQL/MySqlFieldSqlBuilder.php 
b/src/MySQL/MySqlFieldSqlBuilder.php
new file mode 100644
index 0000000..c760b32
--- /dev/null
+++ b/src/MySQL/MySqlFieldSqlBuilder.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Wikibase\Database\MySQL;
+
+use Wikibase\Database\Escaper;
+use Wikibase\Database\Schema\Definitions\FieldDefinition;
+use Wikibase\Database\Schema\FieldSqlBuilder;
+
+/**
+ * @since 0.1
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class MySqlFieldSqlBuilder extends FieldSqlBuilder {
+
+       protected $escaper;
+
+       /**
+        * @param Escaper $escaper
+        */
+       function __construct( $escaper ) {
+               $this->escaper = $escaper;
+       }
+
+       public function getFieldSQL( FieldDefinition $field ){
+               $sql =  $field->getName() . ' ';
+
+               $sql .= $this->getFieldType( $field->getType() );
+
+               $sql .= $this->getDefault( $field->getDefault() );
+
+               $sql .= $this->getNull( $field->allowsNull() );
+
+               // TODO: add all field stuff relevant here
+
+               return $sql;
+       }
+
+       protected function getDefault( $default ) {
+               if ( $default !== null ) {
+                       return ' DEFAULT ' . $this->escaper->getEscapedValue( 
$default );
+               }
+
+               return '';
+       }
+
+       protected function getNull( $allowsNull ) {
+               return $allowsNull ? ' NULL' : ' NOT NULL';
+       }
+
+       /**
+        * Returns the MySQL field type for a given FieldDefinition type 
constant.
+        *
+        * @param string $fieldType
+        *
+        * @return string
+        * @throws RuntimeException
+        */
+       protected function getFieldType( $fieldType ) {
+               switch ( $fieldType ) {
+                       case FieldDefinition::TYPE_INTEGER:
+                               return 'INT';
+                       case FieldDefinition::TYPE_FLOAT:
+                               return 'FLOAT';
+                       case FieldDefinition::TYPE_TEXT:
+                               return 'BLOB';
+                       case FieldDefinition::TYPE_BOOLEAN:
+                               return 'TINYINT';
+                       default:
+                               throw new RuntimeException( __CLASS__ . ' does 
not support db fields of type ' . $fieldType );
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/src/MySQL/MySqlTableSqlBuilder.php 
b/src/MySQL/MySqlTableSqlBuilder.php
index 8c479d6..cc5c80f 100644
--- a/src/MySQL/MySqlTableSqlBuilder.php
+++ b/src/MySQL/MySqlTableSqlBuilder.php
@@ -22,6 +22,8 @@
 
        protected $dbName;
        protected $escaper;
+       protected $tableNameFormatter;
+       protected $fieldSqlBuilder;
 
        /**
         * @param string $dbName
@@ -32,6 +34,7 @@
                $this->dbName = $dbName;
                $this->escaper = $fieldValueEscaper;
                $this->tableNameFormatter = $tableNameFormatter;
+               $this->fieldSqlBuilder = new MySqlFieldSqlBuilder( 
$this->escaper );
        }
 
        /**
@@ -51,7 +54,7 @@
                $queryParts = array();
 
                foreach ( $table->getFields() as $field ) {
-                       $queryParts[] = $field->getName() . ' ' . 
$this->getFieldSQL( $field );
+                       $queryParts[] = $this->fieldSqlBuilder->getFieldSQL( 
$field );
                }
 
                foreach ( $table->getIndexes() as $index ){
@@ -62,25 +65,6 @@
 
                // TODO: table options
                $sql .= ') ' . 'ENGINE=InnoDB, DEFAULT CHARSET=binary';
-
-               return $sql;
-       }
-
-       /**
-        * @since 0.1
-        *
-        * @param FieldDefinition $field
-        *
-        * @return string
-        */
-       protected function getFieldSQL( FieldDefinition $field ) {
-               $sql = $this->getFieldType( $field->getType() );
-
-               $sql .= $this->getDefault( $field->getDefault() );
-
-               $sql .= $this->getNull( $field->allowsNull() );
-
-               // TODO: add all field stuff relevant here
 
                return $sql;
        }
@@ -107,41 +91,6 @@
                $sql .= ' (`'.implode( '`,`', $columnNames ).'`)';
 
                return $sql;
-       }
-
-       protected function getDefault( $default ) {
-               if ( $default !== null ) {
-                       return ' DEFAULT ' . $this->escaper->getEscapedValue( 
$default );
-               }
-
-               return '';
-       }
-
-       protected function getNull( $allowsNull ) {
-               return $allowsNull ? ' NULL' : ' NOT NULL';
-       }
-
-       /**
-        * Returns the MySQL field type for a given FieldDefinition type 
constant.
-        *
-        * @param string $fieldType
-        *
-        * @return string
-        * @throws RuntimeException
-        */
-       protected function getFieldType( $fieldType ) {
-               switch ( $fieldType ) {
-                       case FieldDefinition::TYPE_INTEGER:
-                               return 'INT';
-                       case FieldDefinition::TYPE_FLOAT:
-                               return 'FLOAT';
-                       case FieldDefinition::TYPE_TEXT:
-                               return 'BLOB';
-                       case FieldDefinition::TYPE_BOOLEAN:
-                               return 'TINYINT';
-                       default:
-                               throw new RuntimeException( __CLASS__ . ' does 
not support db fields of type ' . $fieldType );
-               }
        }
 
        /**
diff --git a/src/SQLite/SQLiteTableSqlBuilder.php 
b/src/SQLite/SQLiteTableSqlBuilder.php
index 0d84ba2..7b5dca4 100644
--- a/src/SQLite/SQLiteTableSqlBuilder.php
+++ b/src/SQLite/SQLiteTableSqlBuilder.php
@@ -22,6 +22,7 @@
 
        protected $escaper;
        protected $tableNameFormatter;
+       protected $fieldSqlBuilder;
 
        /**
         * @param Escaper $fieldValueEscaper
@@ -30,6 +31,7 @@
        public function __construct( Escaper $fieldValueEscaper, 
TableNameFormatter $tableNameFormatter ) {
                $this->escaper = $fieldValueEscaper;
                $this->tableNameFormatter = $tableNameFormatter;
+               $this->fieldSqlBuilder = new SQliteFieldSqlBuilder( 
$this->escaper );
        }
 
        /**
@@ -49,7 +51,7 @@
                $fields = array();
 
                foreach ( $table->getFields() as $field ) {
-                       $fields[] = $field->getName() . ' ' . 
$this->getFieldSQL( $field );
+                       $fields[] = $this->fieldSqlBuilder->getFieldSQL( $field 
);
                }
 
                $sql .= implode( ', ', $fields );
@@ -66,24 +68,6 @@
 
        protected function formatTableName( $name ) {
                return $this->tableNameFormatter->formatTableName( $name );
-       }
-
-       /**
-        * @since 0.1
-        *
-        * @param FieldDefinition $field
-        *
-        * @return string
-        * @throws RuntimeException
-        */
-       protected function getFieldSQL( FieldDefinition $field ) {
-               $sql = $this->getFieldType( $field->getType() );
-
-               $sql .= $this->getDefault( $field->getDefault() );
-
-               $sql .= $this->getNull( $field->allowsNull() );
-
-               return $sql;
        }
 
        /**
@@ -108,41 +92,6 @@
                $sql .= ' ('.implode( ',', $columnNames ).');';
 
                return $sql;
-       }
-
-       protected function getDefault( $default ) {
-               if ( $default !== null ) {
-                       return ' DEFAULT ' . $this->escaper->getEscapedValue( 
$default );
-               }
-
-               return '';
-       }
-
-       protected function getNull( $allowsNull ) {
-               return $allowsNull ? ' NULL' : ' NOT NULL';
-       }
-
-       /**
-        * Returns the MySQL field type for a given FieldDefinition type 
constant.
-        *
-        * @param string $fieldType
-        *
-        * @return string
-        * @throws RuntimeException
-        */
-       protected function getFieldType( $fieldType ) {
-               switch ( $fieldType ) {
-                       case FieldDefinition::TYPE_INTEGER:
-                               return 'INT';
-                       case FieldDefinition::TYPE_FLOAT:
-                               return 'FLOAT';
-                       case FieldDefinition::TYPE_TEXT:
-                               return 'BLOB';
-                       case FieldDefinition::TYPE_BOOLEAN:
-                               return 'TINYINT';
-                       default:
-                               throw new RuntimeException( __CLASS__ . ' does 
not support db fields of type ' . $fieldType );
-               }
        }
 
        /**
diff --git a/src/SQLite/SQliteFieldSqlBuilder.php 
b/src/SQLite/SQliteFieldSqlBuilder.php
new file mode 100644
index 0000000..53b3e20
--- /dev/null
+++ b/src/SQLite/SQliteFieldSqlBuilder.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Wikibase\Database\SQLite;
+
+use Wikibase\Database\Schema\Definitions\FieldDefinition;
+use Wikibase\Database\Schema\FieldSqlBuilder;
+
+/**
+ * @since 0.1
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class SQliteFieldSqlBuilder extends FieldSqlBuilder {
+
+       protected $escaper;
+
+       /**
+        * @param Escaper $escaper
+        */
+       function __construct( $escaper ) {
+               $this->escaper = $escaper;
+       }
+
+       public function getFieldSQL( FieldDefinition $field ){
+               $sql = $field->getName() . ' ';
+
+               $sql .= $this->getFieldType( $field->getType() );
+
+               $sql .= $this->getDefault( $field->getDefault() );
+
+               $sql .= $this->getNull( $field->allowsNull() );
+
+               return $sql;
+       }
+
+       protected function getDefault( $default ) {
+               if ( $default !== null ) {
+                       return ' DEFAULT ' . $this->escaper->getEscapedValue( 
$default );
+               }
+
+               return '';
+       }
+
+       protected function getNull( $allowsNull ) {
+               return $allowsNull ? ' NULL' : ' NOT NULL';
+       }
+
+       /**
+        * Returns the MySQL field type for a given FieldDefinition type 
constant.
+        *
+        * @param string $fieldType
+        *
+        * @return string
+        * @throws RuntimeException
+        */
+       protected function getFieldType( $fieldType ) {
+               switch ( $fieldType ) {
+                       case FieldDefinition::TYPE_INTEGER:
+                               return 'INT';
+                       case FieldDefinition::TYPE_FLOAT:
+                               return 'FLOAT';
+                       case FieldDefinition::TYPE_TEXT:
+                               return 'BLOB';
+                       case FieldDefinition::TYPE_BOOLEAN:
+                               return 'TINYINT';
+                       default:
+                               throw new RuntimeException( __CLASS__ . ' does 
not support db fields of type ' . $fieldType );
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/src/Schema/FieldSqlBuilder.php b/src/Schema/FieldSqlBuilder.php
new file mode 100644
index 0000000..2c26644
--- /dev/null
+++ b/src/Schema/FieldSqlBuilder.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Wikibase\Database\Schema;
+
+use DatabaseBase;
+use Wikibase\Database\Schema\Definitions\FieldDefinition;
+use Wikibase\Database\Schema\Definitions\TableDefinition;
+
+/**
+ * @since 0.1
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+abstract class FieldSqlBuilder {
+
+       /**
+        * @since 0.1
+        *
+        * @param FieldDefinition $field
+        *
+        * @return string The SQL for creating the field
+        */
+       public abstract function getFieldSQL( FieldDefinition $field );
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/MySQL/MySqlFieldSqlBuilderTest.php 
b/tests/phpunit/MySQL/MySqlFieldSqlBuilderTest.php
new file mode 100644
index 0000000..699b673
--- /dev/null
+++ b/tests/phpunit/MySQL/MySqlFieldSqlBuilderTest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Wikibase\Database\Tests\MySQL;
+
+use Wikibase\Database\MySQL\MySqlFieldSqlBuilder;
+use Wikibase\Database\Schema\Definitions\FieldDefinition;
+
+/**
+ * @covers Wikibase\Database\MySql\MySqlFieldSqlBuilder
+ *
+ * @group Wikibase
+ * @group WikibaseDatabase
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class MySqlFieldSqlBuilderTest extends \PHPUnit_Framework_TestCase {
+
+       private function newInstance() {
+               $mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedValue' )
+                       ->will( $this->returnArgument(0) );
+
+               return new MySqlFieldSqlBuilder( $mockEscaper );
+       }
+
+       /**
+        * @dataProvider fieldAndSqlProvider
+        */
+       public function testGetCreateTableSql( FieldDefinition $field, 
$expectedSQL ) {
+               $sqlBuilder = $this->newInstance();
+
+               $actualSQL = $sqlBuilder->getFieldSQL( $field );
+
+               $this->assertEquals( $expectedSQL, $actualSQL );
+       }
+
+       public function fieldAndSqlProvider() {
+               $argLists = array();
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'bool' ),
+                       'fieldName TINYINT NULL'
+               );
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'float', false, '1' ),
+                       'fieldName FLOAT DEFAULT 1 NOT NULL'
+               );
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'str', false, 'foo' ),
+                       'fieldName BLOB DEFAULT foo NOT NULL'
+               );
+
+               return $argLists;
+       }
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/SQLite/SQliteFieldSqlBuilderTest.php 
b/tests/phpunit/SQLite/SQliteFieldSqlBuilderTest.php
new file mode 100644
index 0000000..c9b4d1e
--- /dev/null
+++ b/tests/phpunit/SQLite/SQliteFieldSqlBuilderTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Database\Tests\MySQL;
+use Wikibase\Database\Schema\Definitions\FieldDefinition;
+use Wikibase\Database\SQLite\SQliteFieldSqlBuilder;
+
+/**
+ * @covers Wikibase\Database\SQLite\SQLiteFieldSqlBuilder
+ *
+ * @group Wikibase
+ * @group WikibaseDatabase
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Adam Shorland
+ */
+class SQliteFieldSqlBuilderTest extends \PHPUnit_Framework_TestCase {
+
+       private function newInstance() {
+               $mockEscaper = $this->getMock( 'Wikibase\Database\Escaper' );
+               $mockEscaper->expects( $this->any() )
+                       ->method( 'getEscapedValue' )
+                       ->will( $this->returnArgument(0) );
+
+               return new SQliteFieldSqlBuilder( $mockEscaper );
+       }
+
+       /**
+        * @dataProvider fieldAndSqlProvider
+        */
+       public function testGetCreateTableSql( FieldDefinition $field, 
$expectedSQL ) {
+               $sqlBuilder = $this->newInstance();
+
+               $actualSQL = $sqlBuilder->getFieldSQL( $field );
+
+               $this->assertEquals( $expectedSQL, $actualSQL );
+       }
+
+       public function fieldAndSqlProvider() {
+               $argLists = array();
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'bool' ),
+                       'fieldName TINYINT NULL'
+               );
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'bool', false, '1' ),
+                       'fieldName TINYINT DEFAULT 1 NOT NULL'
+               );
+
+               $argLists[] = array(
+                       new FieldDefinition( 'fieldName', 'str', false, 'foo' ),
+                       'fieldName BLOB DEFAULT foo NOT NULL'
+               );
+
+               return $argLists;
+       }
+
+}
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/86871
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib6b3a3bddb5906e5a752238cfd84ab1fe6ee344a
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to