MediaWiki REL1_32
PageProps.php
Go to the documentation of this file.
1<?php
22use Wikimedia\ScopedCallback;
23
29class PageProps {
30
34 private static $instance;
35
50 public static function overrideInstance( PageProps $store = null ) {
51 if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
52 throw new MWException(
53 'Cannot override ' . __CLASS__ . 'default instance in operation.'
54 );
55 }
56 $previousValue = self::$instance;
57 self::$instance = $store;
58 return new ScopedCallback( function () use ( $previousValue ) {
59 self::$instance = $previousValue;
60 } );
61 }
62
66 public static function getInstance() {
67 if ( self::$instance === null ) {
68 self::$instance = new self();
69 }
70 return self::$instance;
71 }
72
74 const CACHE_TTL = 10; // integer; TTL in seconds
75 const CACHE_SIZE = 100; // integer; max cached pages
76
78 private $cache = null;
79
83 private function __construct() {
84 $this->cache = new MapCacheLRU( self::CACHE_SIZE );
85 }
86
91 public function ensureCacheSize( $size ) {
92 if ( $this->cache->getMaxSize() < $size ) {
93 $this->cache->setMaxSize( $size );
94 }
95 }
96
115 public function getProperties( $titles, $propertyNames ) {
116 if ( is_array( $propertyNames ) ) {
117 $gotArray = true;
118 } else {
119 $propertyNames = [ $propertyNames ];
120 $gotArray = false;
121 }
122
123 $values = [];
124 $goodIDs = $this->getGoodIDs( $titles );
125 $queryIDs = [];
126 foreach ( $goodIDs as $pageID ) {
127 foreach ( $propertyNames as $propertyName ) {
128 $propertyValue = $this->getCachedProperty( $pageID, $propertyName );
129 if ( $propertyValue === false ) {
130 $queryIDs[] = $pageID;
131 break;
132 } else {
133 if ( $gotArray ) {
134 $values[$pageID][$propertyName] = $propertyValue;
135 } else {
136 $values[$pageID] = $propertyValue;
137 }
138 }
139 }
140 }
141
142 if ( $queryIDs ) {
144 $result = $dbr->select(
145 'page_props',
146 [
147 'pp_page',
148 'pp_propname',
149 'pp_value'
150 ],
151 [
152 'pp_page' => $queryIDs,
153 'pp_propname' => $propertyNames
154 ],
155 __METHOD__
156 );
157
158 foreach ( $result as $row ) {
159 $pageID = $row->pp_page;
160 $propertyName = $row->pp_propname;
161 $propertyValue = $row->pp_value;
162 $this->cacheProperty( $pageID, $propertyName, $propertyValue );
163 if ( $gotArray ) {
164 $values[$pageID][$propertyName] = $propertyValue;
165 } else {
166 $values[$pageID] = $propertyValue;
167 }
168 }
169 }
170
171 return $values;
172 }
173
187 public function getAllProperties( $titles ) {
188 $values = [];
189 $goodIDs = $this->getGoodIDs( $titles );
190 $queryIDs = [];
191 foreach ( $goodIDs as $pageID ) {
192 $pageProperties = $this->getCachedProperties( $pageID );
193 if ( $pageProperties === false ) {
194 $queryIDs[] = $pageID;
195 } else {
196 $values[$pageID] = $pageProperties;
197 }
198 }
199
200 if ( $queryIDs != [] ) {
202 $result = $dbr->select(
203 'page_props',
204 [
205 'pp_page',
206 'pp_propname',
207 'pp_value'
208 ],
209 [
210 'pp_page' => $queryIDs,
211 ],
212 __METHOD__
213 );
214
215 $currentPageID = 0;
216 $pageProperties = [];
217 foreach ( $result as $row ) {
218 $pageID = $row->pp_page;
219 if ( $currentPageID != $pageID ) {
220 if ( $pageProperties != [] ) {
221 $this->cacheProperties( $currentPageID, $pageProperties );
222 $values[$currentPageID] = $pageProperties;
223 }
224 $currentPageID = $pageID;
225 $pageProperties = [];
226 }
227 $pageProperties[$row->pp_propname] = $row->pp_value;
228 }
229 if ( $pageProperties != [] ) {
230 $this->cacheProperties( $pageID, $pageProperties );
231 $values[$pageID] = $pageProperties;
232 }
233 }
234
235 return $values;
236 }
237
242 private function getGoodIDs( $titles ) {
243 $result = [];
244 if ( is_array( $titles ) ) {
245 ( new LinkBatch( $titles ) )->execute();
246
247 foreach ( $titles as $title ) {
248 $pageID = $title->getArticleID();
249 if ( $pageID > 0 ) {
250 $result[] = $pageID;
251 }
252 }
253 } else {
254 $pageID = $titles->getArticleID();
255 if ( $pageID > 0 ) {
256 $result[] = $pageID;
257 }
258 }
259 return $result;
260 }
261
269 private function getCachedProperty( $pageID, $propertyName ) {
270 if ( $this->cache->hasField( $pageID, $propertyName, self::CACHE_TTL ) ) {
271 return $this->cache->getField( $pageID, $propertyName );
272 }
273 if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
274 $pageProperties = $this->cache->getField( 0, $pageID );
275 if ( isset( $pageProperties[$propertyName] ) ) {
276 return $pageProperties[$propertyName];
277 }
278 }
279 return false;
280 }
281
288 private function getCachedProperties( $pageID ) {
289 if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
290 return $this->cache->getField( 0, $pageID );
291 }
292 return false;
293 }
294
302 private function cacheProperty( $pageID, $propertyName, $propertyValue ) {
303 $this->cache->setField( $pageID, $propertyName, $propertyValue );
304 }
305
312 private function cacheProperties( $pageID, $pageProperties ) {
313 $this->cache->clear( $pageID );
314 $this->cache->setField( 0, $pageID, $pageProperties );
315 }
316}
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
Class representing a list of titles The execute() method checks them all for existence and adds them ...
Definition LinkBatch.php:34
MediaWiki exception.
Handles a simple LRU key/value map with a maximum number of entries.
Gives access to properties of a page.
Definition PageProps.php:29
const CACHE_SIZE
Definition PageProps.php:75
getGoodIDs( $titles)
$cache
Property cache.
Definition PageProps.php:78
static overrideInstance(PageProps $store=null)
Overrides the default instance of this class This is intended for use while testing and will fail if ...
Definition PageProps.php:50
static PageProps $instance
Definition PageProps.php:34
ensureCacheSize( $size)
Ensure that cache has at least this size.
Definition PageProps.php:91
getCachedProperty( $pageID, $propertyName)
Get a property from the cache.
cacheProperty( $pageID, $propertyName, $propertyValue)
Save a property to the cache.
getProperties( $titles, $propertyNames)
Given one or more Titles and one or more names of properties, returns an associative array mapping pa...
const CACHE_TTL
Cache parameters.
Definition PageProps.php:74
getCachedProperties( $pageID)
Get properties from the cache.
__construct()
Create a PageProps object.
Definition PageProps.php:83
cacheProperties( $pageID, $pageProperties)
Save properties to the cache.
static getInstance()
Definition PageProps.php:66
getAllProperties( $titles)
Get all page property values.
namespace being checked & $result
Definition hooks.txt:2385
linkcache txt The LinkCache class maintains a list of article titles and the information about whether or not the article exists in the database This is used to mark up links when displaying a page If the same link appears more than once on any page then it only has to be looked up once In most cases link lookups are done in batches with the LinkBatch class or the equivalent in so the link cache is mostly useful for short snippets of parsed and for links in the navigation areas of the skin The link cache was formerly used to track links used in a document for the purposes of updating the link tables This application is now deprecated To create a you can use the following $titles
Definition linkcache.txt:17
$batch execute()
you have access to all of the normal MediaWiki so you can get a DB use the cache
const DB_REPLICA
Definition defines.php:25