Jeroen De Dauw has uploaded a new change for review. https://gerrit.wikimedia.org/r/64080
Change subject: Added select method to QueryInterface ...................................................................... Added select method to QueryInterface Change-Id: Ia613af8f9fb734235059c1ef20161c2f744080de --- M Database/Database.classes.php M Database/Database.mw.php M Database/Database/MediaWikiQueryInterface.php M Database/Database/QueryInterface.php A Database/Database/ResultIterator.php M Database/tests/phpunit/MediaWikiQueryInterfaceTest.php A Database/tests/phpunit/ResultIteratorTest.php 7 files changed, 283 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/80/64080/1 diff --git a/Database/Database.classes.php b/Database/Database.classes.php index 74359d1..01fb8f2 100644 --- a/Database/Database.classes.php +++ b/Database/Database.classes.php @@ -36,6 +36,7 @@ 'Wikibase\Database\MediaWikiQueryInterface', 'Wikibase\Database\MessageReporter', 'Wikibase\Database\QueryInterface', + 'Wikibase\Database\ResultIterator', 'Wikibase\Database\TableBuilder', 'Wikibase\Database\TableDefinition', ); diff --git a/Database/Database.mw.php b/Database/Database.mw.php index 27490c8..ac926d0 100644 --- a/Database/Database.mw.php +++ b/Database/Database.mw.php @@ -65,6 +65,7 @@ 'FieldDefinition', 'MediaWikiQueryInterface', + 'ResultIterator', 'TableBuilder', 'TableDefinition', ); diff --git a/Database/Database/MediaWikiQueryInterface.php b/Database/Database/MediaWikiQueryInterface.php index a86f60c..e575f30 100644 --- a/Database/Database/MediaWikiQueryInterface.php +++ b/Database/Database/MediaWikiQueryInterface.php @@ -169,4 +169,32 @@ return $this->getDB()->insertId(); } + /** + * @see QueryInterface::select + * + * @since 0.1 + * + * @param string $tableName + * @param array $fields + * @param array $conditions + * + * @return ResultIterator + */ + public function select( $tableName, array $fields, array $conditions ) { + $selectionResult = $this->getDB()->select( + $tableName, + $fields, + $conditions, + __METHOD__ + ); + + if ( $selectionResult instanceof \ResultWrapper ) { + return new ResultIterator( iterator_to_array( $selectionResult ) ); + } + + // TODO: throw + } + } + + diff --git a/Database/Database/QueryInterface.php b/Database/Database/QueryInterface.php index 03b5d41..79ffc8e 100644 --- a/Database/Database/QueryInterface.php +++ b/Database/Database/QueryInterface.php @@ -117,4 +117,19 @@ */ public function getInsertId(); + /** + * Selects the specified fields from the rows that match the provided conditions. + * The conditions are provided as an associative array in + * which the keys are the field names. + * + * @since 0.1 + * + * @param string $tableName + * @param array $fields + * @param array $conditions + * + * @return ResultIterator + */ + public function select( $tableName, array $fields, array $conditions ); + } diff --git a/Database/Database/ResultIterator.php b/Database/Database/ResultIterator.php new file mode 100644 index 0000000..a7cd243 --- /dev/null +++ b/Database/Database/ResultIterator.php @@ -0,0 +1,91 @@ +<?php + +namespace Wikibase\Database; + +/** + * Iterator for selection results. + * Each item is an object that has as properties the field names. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @since 0.1 + * + * @file + * @ingroup WikibaseDatabase + * + * @licence GNU GPL v2+ + * @author Jeroen De Dauw < jeroended...@gmail.com > + */ +class ResultIterator implements \Iterator { + + protected $iterator; + + public function __construct( array $rows ) { + $this->iterator = new \ArrayIterator( $rows ); + } + + /** + * Return the current element + * + * @link http://php.net/manual/en/iterator.current.php + * @return mixed Can return any type. + */ + public function current() { + return $this->iterator->current(); + } + + /** + * Move forward to next element + * + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ + public function next() { + $this->iterator->next(); + } + + /** + * Return the key of the current element + * + * @link http://php.net/manual/en/iterator.key.php + * @return mixed scalar on success, or null on failure. + */ + public function key() { + return $this->iterator->key(); + } + + /** + * Checks if current position is valid + * + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ + public function valid() { + return $this->iterator->current(); + } + + /** + * Rewind the Iterator to the first element + * + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + public function rewind() { + $this->iterator->rewind(); + } + +} diff --git a/Database/tests/phpunit/MediaWikiQueryInterfaceTest.php b/Database/tests/phpunit/MediaWikiQueryInterfaceTest.php index aee3861..669de0f 100644 --- a/Database/tests/phpunit/MediaWikiQueryInterfaceTest.php +++ b/Database/tests/phpunit/MediaWikiQueryInterfaceTest.php @@ -327,6 +327,74 @@ $this->assertEquals( 42, $queryInterface->getInsertId() ); } + /** + * @dataProvider selectProvider + */ + public function testSelect( $tableName, array $fields, array $conditions ) { + $connection = $this->getMock( 'DatabaseMysql' ); + $extendedAbstraction = $this->getMockBuilder( '\Wikibase\Database\MWDB\ExtendedMySQLAbstraction' ) + ->disableOriginalConstructor()->getMock(); + + $queryInterface = new MediaWikiQueryInterface( + new DirectConnectionProvider( $connection ), + $extendedAbstraction + ); + + $connection->expects( $this->once() ) + ->method( 'select' ) + ->with( + $this->equalTo( $tableName ), + $this->equalTo( $fields ), + $this->equalTo( $conditions ) + ); + + $queryInterface->select( $tableName, $fields, $conditions ); + + // Ideally we would have the select method result a mock ResultWrapper + // and would assert if the data was present in the selection result. + // It however seems somewhat impossible to create a mock of ResultWrapper. + } + + public function selectProvider() { + $argLists = array(); + + $argLists[] = array( + 'table', + array( + 'foo', + 'bar', + 'baz', + ), + array( + 'intfield' => 42, + 'strfield' => 'nyan', + ) + ); + + $argLists[] = array( + 'table', + array( + 'foo', + 'bar', + 'baz', + ), + array( + ) + ); + + $argLists[] = array( + 'onoez', + array( + 'foo', + ), + array( + 'intfield' => 42, + ) + ); + + return $argLists; + } + } class DirectConnectionProvider implements DBConnectionProvider { diff --git a/Database/tests/phpunit/ResultIteratorTest.php b/Database/tests/phpunit/ResultIteratorTest.php new file mode 100644 index 0000000..86d2d3f --- /dev/null +++ b/Database/tests/phpunit/ResultIteratorTest.php @@ -0,0 +1,79 @@ +<?php + +namespace Wikibase\Test\Database; + +use Wikibase\Database\ResultIterator; + +/** + * @covers Wikibase\Database\TableBuilder + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @since 0.1 + * + * @ingroup WikibaseDatabaseTest + * + * @group Wikibase + * @group WikibaseDatabase + * + * @licence GNU GPL v2+ + * @author Jeroen De Dauw < jeroended...@gmail.com > + */ +class ResultIteratorTest extends \PHPUnit_Framework_TestCase { + + public function testCanConstruct() { + new ResultIterator( array() ); + $this->assertTrue( true ); + } + + /** + * @dataProvider rowProvider + */ + public function testRetainsInputData( array $inputRows ) { + $iterator = new ResultIterator( $inputRows ); + + $this->assertEquals( + $inputRows, + iterator_to_array( $iterator ) + ); + } + + public function rowProvider() { + $argLists = array(); + + $argLists[] = array( array( + ) ); + + $argLists[] = array( array( + (object)array( 'foo' => 4, 'bar' => 2 ), + ) ); + + $argLists[] = array( array( + (object)array( 'foo' => 4, 'bar' => 2 ), + (object)array( 'foo' => 1, 'bar' => 3 ), + ) ); + + $argLists[] = array( array( + (object)array( 'foo' => 4, 'bar' => 2 ), + (object)array( 'foo' => 1, 'bar' => 3 ), + (object)array( 'baz' => 'nyan', 'bah' => 'cat' ), + ) ); + + return $argLists; + } + +} -- To view, visit https://gerrit.wikimedia.org/r/64080 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia613af8f9fb734235059c1ef20161c2f744080de Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Jeroen De Dauw <jeroended...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits