jenkins-bot has submitted this change and it was merged.
Change subject: Added indexes field to TableDefinition
......................................................................
Added indexes field to TableDefinition
Change-Id: Icdfe6f59ed5ebf0e2c9e2aa63bf98a92c36d0b1a
---
M src/TableDefinition.php
M tests/phpunit/TableDefinitionTest.php
2 files changed, 143 insertions(+), 8 deletions(-)
Approvals:
Denny Vrandecic: Looks good to me, approved
jenkins-bot: Verified
diff --git a/src/TableDefinition.php b/src/TableDefinition.php
index ca86411..dc1c1d3 100644
--- a/src/TableDefinition.php
+++ b/src/TableDefinition.php
@@ -34,21 +34,42 @@
/**
* @since 0.1
*
+ * @var IndexDefinition[]
+ */
+ private $indexes;
+
+ /**
+ * @since 0.1
+ *
* @param string $name
* @param FieldDefinition[] $fields
+ * @param IndexDefinition[] $indexes
*
* @throws InvalidArgumentException
*/
- public function __construct( $name, array $fields ) {
+ public function __construct( $name, array $fields, array $indexes =
array() ) {
+ $this->setName( $name );
+ $this->setFields( $fields );
+ $this->setIndexes( $indexes );
+ }
+
+ protected function setName( $name ) {
if ( !is_string( $name ) ) {
throw new InvalidArgumentException( 'The table $name
needs to be a string' );
}
+ $this->name = $name;
+ }
+
+ /**
+ * @param FieldDefinition[] $fields
+ *
+ * @throws InvalidArgumentException
+ */
+ protected function setFields( array $fields ) {
if ( empty( $fields ) ) {
throw new InvalidArgumentException( 'The table $fields
list cannot be empty' );
}
-
- $this->name = $name;
$this->fields = array();
@@ -62,6 +83,23 @@
}
$this->fields[$field->getName()] = $field;
+ }
+ }
+
+ /**
+ * @param IndexDefinition[] $indexes
+ *
+ * @throws InvalidArgumentException
+ */
+ protected function setIndexes( array $indexes ) {
+ $this->indexes = array();
+
+ foreach ( $indexes as $index ) {
+ if ( !( $index instanceof IndexDefinition ) ) {
+ throw new InvalidArgumentException( 'All table
indexes should be of type IndexDefinition' );
+ }
+
+ $this->indexes[$index->getName()] = $index;
}
}
@@ -90,6 +128,19 @@
}
/**
+ * Returns the indexes that this table has.
+ * The array keys in the returned array correspond to the names
+ * of the indexes defined by the value they point to.
+ *
+ * @since 0.1
+ *
+ * @return IndexDefinition[]
+ */
+ public function getIndexes() {
+ return $this->indexes;
+ }
+
+ /**
* Returns if the table has a field with the provided name.
*
* @since 0.1
@@ -112,7 +163,7 @@
* @return TableDefinition
*/
public function mutateName( $cloneName ) {
- return new self( $cloneName, $this->fields );
+ return new self( $cloneName, $this->fields, $this->indexes );
}
/**
@@ -125,9 +176,7 @@
* @return TableDefinition
*/
public function mutateFields( array $fields ) {
- return new self( $this->name, $fields );
+ return new self( $this->name, $fields, $this->indexes );
}
-
- // TODO: multiple field indices
}
diff --git a/tests/phpunit/TableDefinitionTest.php
b/tests/phpunit/TableDefinitionTest.php
index 2f2f670..30ff9ad 100644
--- a/tests/phpunit/TableDefinitionTest.php
+++ b/tests/phpunit/TableDefinitionTest.php
@@ -3,6 +3,7 @@
namespace Wikibase\Database\Tests;
use Wikibase\Database\FieldDefinition;
+use Wikibase\Database\IndexDefinition;
use Wikibase\Database\TableDefinition;
/**
@@ -36,7 +37,31 @@
array(
new FieldDefinition( 'o',
FieldDefinition::TYPE_TEXT ),
new FieldDefinition( 'h',
FieldDefinition::TYPE_TEXT ),
- new FieldDefinition( 'i',
FieldDefinition::TYPE_INTEGER, false, 42 ),
+ new FieldDefinition( 'i',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42 ),
+ )
+ );
+
+ $instances[] = new TableDefinition(
+ 'spam',
+ array(
+ new FieldDefinition( 'o',
FieldDefinition::TYPE_TEXT ),
+ new FieldDefinition( 'h',
FieldDefinition::TYPE_TEXT ),
+ new FieldDefinition( 'i',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42 ),
+ ),
+ array(
+ new IndexDefinition( 'o', array( 'o' => 0 ) ),
+ )
+ );
+
+ $instances[] = new TableDefinition(
+ 'spam',
+ array(
+ new FieldDefinition( 'o',
FieldDefinition::TYPE_TEXT ),
+ ),
+ array(
+ new IndexDefinition( 'o', array( 'o' => 0 ) ),
+ new IndexDefinition( 'h', array( 'h' => 42 ) ),
+ new IndexDefinition( 'foo', array( 'bar' => 5,
'baz' => 0 ) ),
)
);
@@ -146,4 +171,65 @@
$this->assertEquals( $table->getName(), $newTable->getName() );
}
+ /**
+ * @dataProvider instanceProvider
+ *
+ * @param TableDefinition $table
+ */
+ public function testReturnTypeOfGetIndexes( TableDefinition $table ) {
+ $this->assertInternalType( 'array', $table->getIndexes() );
+ $this->assertContainsOnlyInstancesOf(
'Wikibase\Database\IndexDefinition', $table->getIndexes() );
+
+ $newTable = new TableDefinition( $table->getName(),
$table->getFields(), $table->getIndexes() );
+
+ $this->assertEquals(
+ $table->getIndexes(),
+ $newTable->getIndexes(),
+ 'The TableDefinition indexes are set and obtained
correctly'
+ );
+ }
+
+ /**
+ * @dataProvider invalidIndexesProvider
+ */
+ public function testCannotConstructWithInvalidIndexList( array
$invalidIndexList ) {
+ $this->setExpectedException( 'InvalidArgumentException' );
+
+ new TableDefinition(
+ 'foo',
+ array( new FieldDefinition( 'h',
FieldDefinition::TYPE_TEXT ) ),
+ $invalidIndexList
+ );
+ }
+
+ public function invalidIndexesProvider() {
+ $mockIndexDefinition = $this->getMockBuilder(
'Wikibase\Database\IndexDefinition' )
+ ->disableOriginalConstructor()->getMock();
+
+ $argLists = array();
+
+ $argLists[] = array( array(
+ null
+ ) );
+
+ $argLists[] = array( array(
+ 'foo bar'
+ ) );
+
+ $argLists[] = array( array(
+ $mockIndexDefinition,
+ array()
+ ) );
+
+ $argLists[] = array( array(
+ $mockIndexDefinition,
+ $mockIndexDefinition,
+ 4.2,
+ $mockIndexDefinition,
+ $mockIndexDefinition
+ ) );
+
+ return $argLists;
+ }
+
}
--
To view, visit https://gerrit.wikimedia.org/r/76728
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Icdfe6f59ed5ebf0e2c9e2aa63bf98a92c36d0b1a
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Denny Vrandecic <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits