Addshore has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/80544


Change subject: Add index support to createTable
......................................................................

Add index support to createTable

Change-Id: If0a43b32151e648bce711352f1e34abc96e33274
---
M src/MySQL/MySqlTableSqlBuilder.php
M tests/phpunit/MySQL/MySQLTableSqlBuilderTest.php
2 files changed, 105 insertions(+), 6 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseDatabase 
refs/changes/44/80544/1

diff --git a/src/MySQL/MySqlTableSqlBuilder.php 
b/src/MySQL/MySqlTableSqlBuilder.php
index 1008a00..8a5466a 100644
--- a/src/MySQL/MySqlTableSqlBuilder.php
+++ b/src/MySQL/MySqlTableSqlBuilder.php
@@ -5,6 +5,7 @@
 use RuntimeException;
 use Wikibase\Database\Escaper;
 use Wikibase\Database\FieldDefinition;
+use Wikibase\Database\IndexDefinition;
 use Wikibase\Database\TableDefinition;
 use Wikibase\Database\TableSqlBuilder;
 
@@ -50,18 +51,20 @@
                // TODO: get rid of global (DatabaseBase currently provides no 
access to its mTablePrefix field)
                $sql = 'CREATE TABLE `' . $this->dbName . '`.' . 
$this->tablePrefix . $table->getName() . ' (';
 
-               $fields = array();
+               $queryParts = array();
 
                foreach ( $table->getFields() as $field ) {
-                       $fields[] = $field->getName() . ' ' . 
$this->getFieldSQL( $field );
+                       $queryParts[] = $field->getName() . ' ' . 
$this->getFieldSQL( $field );
                }
 
-               $sql .= implode( ', ', $fields );
+               foreach ( $table->getIndexes() as $index ){
+                       $queryParts[] = $this->getIndexSQL( $index );
+               }
+
+               $sql .= implode( ', ', $queryParts );
 
                // TODO: table options
                $sql .= ') ' . 'ENGINE=InnoDB, DEFAULT CHARSET=binary';
-
-               // TODO: indexes
 
                return $sql;
        }
@@ -72,7 +75,6 @@
         * @param FieldDefinition $field
         *
         * @return string
-        * @throws RuntimeException
         */
        protected function getFieldSQL( FieldDefinition $field ) {
                $sql = $this->getFieldType( $field->getType() );
@@ -82,6 +84,30 @@
                $sql .= $this->getNull( $field->allowsNull() );
 
                // TODO: add all field stuff relevant here
+
+               return $sql;
+       }
+
+       /**
+        * @since 0.1
+        *
+        * @param IndexDefinition $index
+        *
+        * @return string
+        */
+       protected function getIndexSQL( IndexDefinition $index ) {
+               $sql = $this->getIndexType( $index->getType() );
+
+               if( $index->getType() !== IndexDefinition::TYPE_PRIMARY ){
+                       $sql .= ' `'.$index->getName().'`';
+               }
+
+               $collumNames = array();
+               foreach( $index->getColumns() as $collumName => $intSize ){
+                       $collumNames[] = $collumName;
+               }
+
+               $sql .= ' (`'.implode( '`,`', $collumNames ).'`)';
 
                return $sql;
        }
@@ -121,4 +147,29 @@
                }
        }
 
+       /**
+        * Returns the MySQL field type for a given IndexDefinition type 
constant.
+        *
+        * @param string $indexType
+        *
+        * @return string
+        * @throws RuntimeException
+        */
+       protected function getIndexType( $indexType ) {
+               switch ( $indexType ) {
+                       case IndexDefinition::TYPE_PRIMARY:
+                               return 'PRIMARY KEY';
+                       case IndexDefinition::TYPE_INDEX:
+                               return 'INDEX';
+                       case IndexDefinition::TYPE_UNIQUE:
+                               return 'UNIQUE INDEX';
+                       case IndexDefinition::TYPE_SPATIAL:
+                               return 'SPATIAL INDEX';
+                       case IndexDefinition::TYPE_FULLTEXT:
+                               return 'FULLTEXT INDEX';
+                       default:
+                               throw new RuntimeException( __CLASS__ . ' does 
not support db indexes of type ' . $indexType );
+               }
+       }
+
 }
diff --git a/tests/phpunit/MySQL/MySQLTableSqlBuilderTest.php 
b/tests/phpunit/MySQL/MySQLTableSqlBuilderTest.php
index 88adff4..c74a26e 100644
--- a/tests/phpunit/MySQL/MySQLTableSqlBuilderTest.php
+++ b/tests/phpunit/MySQL/MySQLTableSqlBuilderTest.php
@@ -3,6 +3,7 @@
 namespace Wikibase\Database\Tests\MySQL;
 
 use Wikibase\Database\FieldDefinition;
+use Wikibase\Database\IndexDefinition;
 use Wikibase\Database\MySQL\MySqlTableSqlBuilder;
 use Wikibase\Database\TableDefinition;
 
@@ -81,6 +82,53 @@
                        'CREATE TABLE `dbName`.prefix_tableName (primaryField 
INT NOT NULL, textField BLOB NULL, intField INT DEFAULT  NOT NULL) 
ENGINE=InnoDB, DEFAULT CHARSET=binary'
                );
 
+
+               $argLists[] = array(
+                       new TableDefinition(
+                               'tableName',
+                               array(
+                                       new FieldDefinition(
+                                               'textField', 
FieldDefinition::TYPE_TEXT
+                                       ),
+                                       new FieldDefinition(
+                                               'intField', 
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42
+                                       ),
+                               ),
+                               array(
+                                       new IndexDefinition(
+                                               'indexName', array( 'textField' 
=> 0, 'intField' => 0 ), IndexDefinition::TYPE_INDEX
+                                       ),
+                               )
+                       ),
+                       'CREATE TABLE `dbName`.prefix_tableName (textField BLOB 
NULL, intField INT DEFAULT  NOT NULL, INDEX `indexName` 
(`textField`,`intField`)) ENGINE=InnoDB, DEFAULT CHARSET=binary'
+               );
+
+               $argLists[] = array(
+                       new TableDefinition(
+                               'tableName',
+                               array(
+                                       new FieldDefinition(
+                                               'textField', 
FieldDefinition::TYPE_TEXT
+                                       ),
+                                       new FieldDefinition(
+                                               'intField', 
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42
+                                       ),
+                                       new FieldDefinition(
+                                               'textField2', 
FieldDefinition::TYPE_TEXT
+                                       ),
+                               ),
+                               array(
+                                       new IndexDefinition(
+                                               'indexName', array( 'intField' 
=> 0 ), IndexDefinition::TYPE_INDEX
+                                       ),
+                                       new IndexDefinition(
+                                               'uniqueIndexName', array( 
'textField2' => 0 ), IndexDefinition::TYPE_UNIQUE
+                                       ),
+                               )
+                       ),
+                       'CREATE TABLE `dbName`.prefix_tableName (textField BLOB 
NULL, intField INT DEFAULT  NOT NULL, textField2 BLOB NULL, INDEX `indexName` 
(`intField`), UNIQUE INDEX `uniqueIndexName` (`textField2`)) ENGINE=InnoDB, 
DEFAULT CHARSET=binary'
+               );
+
                return $argLists;
        }
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: If0a43b32151e648bce711352f1e34abc96e33274
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to