jenkins-bot has submitted this change and it was merged. Change subject: (bug 49742) Introducing PropertyInfoDataTypeLookup ......................................................................
(bug 49742) Introducing PropertyInfoDataTypeLookup Adding an implementation of DataTypeLookup that is based on a PropertyInfoStore. Change-Id: Ibb8f50230be53575bee69b4fb64f6bd27e02ccbf --- M lib/WikibaseLib.classes.php M lib/includes/EntityRetrievingDataTypeLookup.php A lib/includes/PropertyInfoDataTypeLookup.php M lib/tests/phpunit/EntityRetrievingDataTypeLookupTest.php A lib/tests/phpunit/PropertyInfoDataTypeLookupTest.php 5 files changed, 252 insertions(+), 2 deletions(-) Approvals: Aude: Looks good to me, approved jenkins-bot: Verified diff --git a/lib/WikibaseLib.classes.php b/lib/WikibaseLib.classes.php index 0bac36d..b226735 100644 --- a/lib/WikibaseLib.classes.php +++ b/lib/WikibaseLib.classes.php @@ -44,6 +44,7 @@ 'Wikibase\Lib\GuidGenerator' => 'includes/GuidGenerator.php', 'Wikibase\Lib\V4GuidGenerator' => 'includes/GuidGenerator.php', 'Wikibase\Lib\EntityRetrievingDataTypeLookup' => 'includes/EntityRetrievingDataTypeLookup.php', + 'Wikibase\Lib\PropertyInfoDataTypeLookup' => 'includes/PropertyInfoDataTypeLookup.php', 'Wikibase\Lib\ClaimGuidGenerator' => 'includes/GuidGenerator.php', 'Wikibase\Lib\ClaimGuidValidator' => 'includes/ClaimGuidValidator.php', 'Wikibase\Lib\InMemoryDataTypeLookup' => 'includes/InMemoryDataTypeLookup.php', diff --git a/lib/includes/EntityRetrievingDataTypeLookup.php b/lib/includes/EntityRetrievingDataTypeLookup.php index d273084..add731d 100644 --- a/lib/includes/EntityRetrievingDataTypeLookup.php +++ b/lib/includes/EntityRetrievingDataTypeLookup.php @@ -8,7 +8,8 @@ use Wikibase\Property; /** - * PropertyDataTypeLookup that uses an EntityLookup to find the + * PropertyDataTypeLookup that uses an EntityLookup to find + * a property's data type ID. * * 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 @@ -52,7 +53,6 @@ * @return string */ public function getDataTypeIdForProperty( EntityId $propertyId ) { - //TODO: use memcached here, or wrap this object! $this->verifyIdIsOfAProperty( $propertyId ); return $this->getProperty( $propertyId )->getDataTypeId(); } diff --git a/lib/includes/PropertyInfoDataTypeLookup.php b/lib/includes/PropertyInfoDataTypeLookup.php new file mode 100644 index 0000000..8f8ab24 --- /dev/null +++ b/lib/includes/PropertyInfoDataTypeLookup.php @@ -0,0 +1,93 @@ +<?php + +namespace Wikibase\Lib; + +use InvalidArgumentException; +use Wikibase\EntityId; +use Wikibase\EntityLookup; +use Wikibase\Property; +use Wikibase\PropertyInfoStore; + +/** + * PropertyDataTypeLookup that uses an PropertyInfoStore to find + * a property's data type ID. + * + * 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.4 + * + * @file + * @ingroup WikibaseLib + * + * @licence GNU GPL v2+ + * @author Daniel Kinzler + */ +class PropertyInfoDataTypeLookup implements PropertyDataTypeLookup { + + /** + * @var PropertyDataTypeLookup + */ + private $fallbackLookup; + + /** + * @var PropertyInfoStore + */ + private $infoStore; + + /** + * @param PropertyInfoStore $infoStore + * @param PropertyDataTypeLookup $fallbackLookup + */ + public function __construct( PropertyInfoStore $infoStore, PropertyDataTypeLookup $fallbackLookup = null ) { + $this->infoStore = $infoStore; + $this->fallbackLookup = $fallbackLookup; + } + + /** + * @since 0.4 + * + * @param EntityId $propertyId + * + * @return string + */ + public function getDataTypeIdForProperty( EntityId $propertyId ) { + $dataTypeId = null; + $info = $this->infoStore->getPropertyInfo( $propertyId ); + + if ( $info !== null && isset( $info[PropertyInfoStore::KEY_DATA_TYPE] ) ) { + $dataTypeId = $info[PropertyInfoStore::KEY_DATA_TYPE]; + } + + if ( $dataTypeId === null && $this->fallbackLookup !== null ) { + $dataTypeId = $this->fallbackLookup->getDataTypeIdForProperty( $propertyId ); + + if ( $dataTypeId !== null ) { + wfDebugLog( __CLASS__, __FUNCTION__ . ': No property info found for ' + . $propertyId . ', but property ID could be retrieved from fallback store!' ); + + //TODO: Automatically update the info store? + //TODO: Suggest to run rebuildPropertyInfo.php + } + } + + if ( $dataTypeId === null ) { + throw new PropertyNotFoundException( $propertyId ); + } + + return $dataTypeId; + } + +} diff --git a/lib/tests/phpunit/EntityRetrievingDataTypeLookupTest.php b/lib/tests/phpunit/EntityRetrievingDataTypeLookupTest.php index 17dcfd5..e4b42f3 100644 --- a/lib/tests/phpunit/EntityRetrievingDataTypeLookupTest.php +++ b/lib/tests/phpunit/EntityRetrievingDataTypeLookupTest.php @@ -31,6 +31,7 @@ * @ingroup WikibaseLib * @ingroup Test * + * @group Wikibase * @group WikibaseLib * @group DataTypeLookupTest * diff --git a/lib/tests/phpunit/PropertyInfoDataTypeLookupTest.php b/lib/tests/phpunit/PropertyInfoDataTypeLookupTest.php new file mode 100644 index 0000000..29b7c1d --- /dev/null +++ b/lib/tests/phpunit/PropertyInfoDataTypeLookupTest.php @@ -0,0 +1,155 @@ +<?php + +namespace Wikibase\Lib\Test; + +use Wikibase\EntityId; +use Wikibase\Lib\EntityRetrievingDataTypeLookup; +use Wikibase\Lib\PropertyDataTypeLookup; +use Wikibase\Lib\PropertyInfoDataTypeLookup; +use Wikibase\Property; +use Wikibase\PropertyInfoStore; +use Wikibase\Test\MockPropertyInfoStore; +use Wikibase\Test\MockRepository; + +/** + * Tests for the Wikibase\Lib\PropertyInfoDataTypeLookup class. + * + * 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.4 + * + * @file + * @ingroup WikibaseLib + * @ingroup Test + * + * @group Wikibase + * @group WikibaseLib + * @group DataTypeLookupTest + * + * @licence GNU GPL v2+ + * @author Jeroen De Dauw < jeroended...@gmail.com > + * @author Daniel Kinzler + */ +class PropertyInfoDataTypeLookupTest extends \PHPUnit_Framework_TestCase { + + private $propertiesAndTypes = array( + 1 => 'NyanData all the way across the sky', + 42 => 'string', + 1337 => 'percentage', + 9001 => 'positive whole number', + ); + + private function newEntityLookup() { + $lookup = new MockRepository(); + + foreach ( $this->propertiesAndTypes as $propertyId => $dataTypeId ) { + $property = Property::newEmpty(); + $property->setId( $propertyId ); + $property->setDataTypeId( $dataTypeId ); + + $lookup->putEntity( $property ); + } + + return $lookup; + } + + public function getDataTypeForPropertyProvider() { + $argLists = array(); + + $emptyInfoStore = new MockPropertyInfoStore(); + $mockInfoStore = new MockPropertyInfoStore(); + + $mockRepo = new MockRepository(); + $mockDataTypeLookup = new EntityRetrievingDataTypeLookup( $mockRepo ); + + foreach ( $this->propertiesAndTypes as $propertyId => $dataTypeId ) { + $id = new EntityId( Property::ENTITY_TYPE, $propertyId ); + + // register property info + $mockInfoStore->setPropertyInfo( + $id, + array( PropertyInfoStore::KEY_DATA_TYPE => $dataTypeId ) + ); + + // register property as an entity, for the fallback + $property = Property::newEmpty(); + $property->setId( $id ); + $property->setDataTypeId( $dataTypeId ); + $mockRepo->putEntity( $property ); + + // try with a working info store + $argLists[] = array( + $mockInfoStore, + null, + $id, + $dataTypeId + ); + + // try with via fallback + $argLists[] = array( + $emptyInfoStore, + $mockDataTypeLookup, + $id, + $dataTypeId + ); + } + + // try unknown property + $id = new EntityId( Property::ENTITY_TYPE, 23 ); + + // try with a working info store + $argLists[] = array( + $mockInfoStore, + null, + $id, + false + ); + + // try with via fallback + $argLists[] = array( + $emptyInfoStore, + $mockDataTypeLookup, + $id, + false + ); + + return $argLists; + } + + /** + * @dataProvider getDataTypeForPropertyProvider + */ + public function testGetDataTypeForProperty( + PropertyInfoStore $infoStore, + PropertyDataTypeLookup $fallbackLookup = null, + EntityId $propertyId, + $expectedDataType + ) { + if ( $expectedDataType === false ) { + $this->setExpectedException( 'Wikibase\Lib\PropertyNotFoundException' ); + } + + $lookup = new PropertyInfoDataTypeLookup( $infoStore, $fallbackLookup ); + + $actualDataType = $lookup->getDataTypeIdForProperty( $propertyId ); + + if ( $expectedDataType !== false ) { + $this->assertInternalType( 'string', $actualDataType ); + $this->assertEquals( $expectedDataType, $actualDataType ); + } + } + +} -- To view, visit https://gerrit.wikimedia.org/r/71341 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ibb8f50230be53575bee69b4fb64f6bd27e02ccbf Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Daniel Werner <daniel.wer...@wikimedia.de> Gerrit-Reviewer: Jeroen De Dauw <jeroended...@gmail.com> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits