22 private $jobQueueGroup;
25 private $newProps = [];
28 private $existingProps;
38 private $linkInvalidations;
46 $this->jobQueueGroup = $jobQueueGroup;
67 return [
'pp_propname',
'pp_value' ];
72 foreach ( $this->newProps as $name => $value ) {
73 yield [ (string)$name, $value ];
82 private function getExistingProps() {
83 if ( $this->existingProps ===
null ) {
84 $this->existingProps = [];
86 $this->existingProps[$row->pp_propname] = $row->pp_value;
89 return $this->existingProps;
94 foreach ( $this->getExistingProps() as $name => $value ) {
95 yield [ (string)$name, $value ];
101 $existing = $this->getExistingProps();
102 [ $name, $value ] = $linkId;
103 return \array_key_exists( $name, $existing )
104 && $this->encodeValue( $existing[$name] ) === $this->encodeValue( $value );
109 [ $name, $value ] = $linkId;
110 return \array_key_exists( $name, $this->newProps )
111 && $this->encodeValue( $this->newProps[$name] ) === $this->encodeValue( $value );
117 private function encodeValue( $value ): string {
118 if ( is_bool( $value ) ) {
119 return (
string)(int)$value;
120 } elseif ( $value ===
null ) {
123 return (
string)$value;
129 [ $name, $value ] = $linkId;
131 'pp_propname' => $name,
132 'pp_value' => $this->encodeValue( $value ),
133 'pp_sortkey' => $this->getPropertySortKeyValue( $value )
149 private function getPropertySortKeyValue( $value ) {
150 if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
151 return floatval( $value );
160 'pp_propname' => $linkId[0]
165 $changed = array_unique( array_merge(
166 array_column( $this->insertedLinks, 0 ),
167 array_column( $this->deletedLinks, 0 ) ) );
168 $this->invalidateProperties( $changed );
176 private function invalidateProperties( array $changed ) {
178 foreach ( $changed as $name ) {
179 if ( isset( $this->linkInvalidations[$name] ) ) {
180 $inv = $this->linkInvalidations[$name];
181 if ( !is_array( $inv ) ) {
184 foreach ( $inv as $table ) {
186 $this->getSourcePage(),
188 [
'causeAction' =>
'page-props' ]
195 $this->jobQueueGroup->lazyPush( $jobs );
207 foreach ( $this->getLinkIDs( $setType ) as [ $name, $value ] ) {
208 $props[$name] = $value;
if(!defined('MW_SETUP_CALLBACK'))
finishUpdate()
Subclasses can override this to do any updates associated with their link data, for example dispatchi...
getFromField()
Get the name of the field which links to page_id.string
getExistingFields()
Get the fields to be used in fetchExistingRows().Note that fetchExistingRows() is just a helper for s...
insertLink( $linkId)
Insert a link identified by ID.The subclass is expected to queue the insertion by calling insertRow()...
isExisting( $linkId)
Determine whether a link (from the new set) is in the existing set.bool
deleteLink( $linkId)
Delete a link identified by ID.The subclass is expected to queue the deletion by calling deleteRow().
getExistingLinkIDs()
Get an array (or iterator) of link IDs for the existing state.The subclass should load the data from ...
__construct(ServiceOptions $options, JobQueueGroup $jobQueueGroup)
setParserOutput(ParserOutput $parserOutput)
Subclasses should implement this to extract the data they need from the ParserOutput.
const CONSTRUCTOR_OPTIONS
getAssocArray( $setType)
Get the properties for a given link set as an associative array.
getTableName()
Get the table name.string
getNewLinkIDs()
Get an array (or iterator) of link IDs for the new state.See the LinksTable doc comment for an explan...
isInNewSet( $linkId)
Determine whether a link (from the existing set) is in the new set.bool
A class containing constants representing the names of configuration variables.
const PagePropLinkInvalidations
Name constant for the PagePropLinkInvalidations setting, for use with Config::get()