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