| Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/includes/Store/HashSiteLinkStore.php |
<?php
namespace Wikibase\Lib\Store;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\SiteLink;
/**
* An array based dummy implementation of a SiteLinkStore for exclusive use in tests.
* @todo Should be moved to the tests folder and namespace.
*
* @license GPL-2.0+
* @author Katie Filbert < aude.wiki@gmail.com >
*/
class HashSiteLinkStore implements SiteLinkStore {
/**
* @var SiteLink[] indexed by prefixed ItemId
*/
private $linksByItemId = array();
/**
* @var ItemId[] indexed by SiteLink link text "siteid:title"
*/
private $itemIdsByLink = array();
/**
* @see SiteLinkStore::getItemIdForLink
*
* @param string $globalSiteId
* @param string $pageTitle
*
* @return ItemId|null
*/
public function getItemIdForLink( $globalSiteId, $pageTitle ) {
$key = "$globalSiteId:$pageTitle";
if ( isset( $this->itemIdsByLink[$key] ) ) {
return $this->itemIdsByLink[$key];
} else {
return null;
}
}
/**
* @see SiteLinkStore::getLinks
*
* @param int[] $numericIds Numeric (unprefixed) item ids, Defaults to array()
* @param string[] $siteIds Defaults to array()
* @param string[] $pageNames Defaults to array()
*
* @return array[]
*/
public function getLinks(
array $numericIds = array(),
array $siteIds = array(),
array $pageNames = array()
) {
$links = array();
foreach ( $this->linksByItemId as $prefixedId => $siteLinks ) {
/** @var SiteLink $siteLink */
foreach ( $siteLinks as $siteLink ) {
$itemId = new ItemId( $prefixedId );
if ( $this->linkMatches( $itemId, $siteLink, $numericIds, $siteIds, $pageNames ) ) {
$links[] = array(
$siteLink->getSiteId(),
$siteLink->getPageName(),
$itemId->getNumericId(),
);
}
}
}
return $links;
}
/**
* Returns true if the link matches the given conditions.
*
* @param ItemId $itemId
* @param SiteLink $siteLink
* @param int[] $numericIds Numeric (unprefixed) item ids
* @param string[] $siteIds
* @param string[] $pageNames
*
* @return bool
*/
private function linkMatches(
ItemId $itemId,
SiteLink $siteLink,
array $numericIds,
array $siteIds,
array $pageNames
) {
return ( empty( $numericIds ) || in_array( $itemId->getNumericId(), $numericIds ) )
&& ( empty( $siteIds ) || in_array( $siteLink->getSiteId(), $siteIds ) )
&& ( empty( $pageNames ) || in_array( $siteLink->getPageName(), $pageNames ) );
}
/**
* @see SiteLinkStore::getSiteLinksForItem
*
* @param ItemId $itemId
*
* @return SiteLink[]
*/
public function getSiteLinksForItem( ItemId $itemId ) {
$prefixedId = $itemId->getSerialization();
if ( array_key_exists( $prefixedId, $this->linksByItemId ) ) {
return $this->linksByItemId[$prefixedId];
}
return array();
}
/**
* @see SiteLinkStore::getItemIdForSiteLink
*
* @param SiteLink $siteLink
*
* @return ItemId|null
*/
public function getItemIdForSiteLink( SiteLink $siteLink ) {
$siteLinkKey = $this->makeSiteLinkKey( $siteLink );
if ( array_key_exists( $siteLinkKey, $this->itemIdsByLink ) ) {
return $this->itemIdsByLink[$siteLinkKey];
}
return null;
}
/**
* @see SiteLinkStore::saveLinksOfItem
*
* @param Item $item
*
* @return bool
*/
public function saveLinksOfItem( Item $item ) {
$itemId = $item->getId();
$this->deleteLinksOfItem( $itemId );
foreach ( $item->getSiteLinkList() as $siteLink ) {
$this->indexByLink( $itemId, $siteLink );
$this->indexByItemId( $itemId, $siteLink );
}
return true;
}
/**
* See SiteLinkStore::deleteLinksOfItem
*
* @param ItemId $itemId
*
* @return bool
*/
public function deleteLinksOfItem( ItemId $itemId ) {
$prefixedId = $itemId->getSerialization();
$siteLinks = $this->getSiteLinksForItem( $itemId );
foreach ( $siteLinks as $siteLink ) {
$key = $this->makeSiteLinkKey( $siteLink );
unset( $this->itemIdsByLink[$key] );
}
unset( $this->linksByItemId[$prefixedId] );
return true;
}
/**
* @see SiteLinkStore::clear
*/
public function clear() {
$this->linksByItemId = array();
$this->itemIdsByLink = array();
}
private function indexByLink( ItemId $itemId, SiteLink $siteLink ) {
$key = $this->makeSiteLinkKey( $siteLink );
$this->itemIdsByLink[$key] = $itemId;
}
private function indexByItemId( ItemId $itemId, SiteLink $siteLink ) {
$prefixedId = $itemId->getSerialization();
$this->linksByItemId[$prefixedId][] = $siteLink;
}
/**
* @param SiteLink $siteLink
*
* @return string
*/
private function makeSiteLinkKey( SiteLink $siteLink ) {
return $siteLink->getSiteId() . ':' . $siteLink->getPageName();
}
}