MediaWiki  master
JobSpecification.php
Go to the documentation of this file.
1 <?php
25 
44  protected $type;
45 
47  protected $params;
48 
50  protected $page;
51 
53  protected $opts;
54 
63  public function __construct(
64  $type, array $params, array $opts = [], PageReference $page = null
65  ) {
66  $this->validateParams( $params );
67  $this->validateParams( $opts );
68 
69  $this->type = $type;
70  if ( $page ) {
71  // Make sure JobQueue classes can pull the title from parameters alone
72  if ( $page->getDBkey() !== '' ) {
73  $params += [
74  'namespace' => $page->getNamespace(),
75  'title' => $page->getDBkey()
76  ];
77  }
78  } else {
79  // We aim to remove the page from job specification and all we need
80  // is namespace/dbkey, so use LOCAL no matter what.
81  $page = PageReferenceValue::localReference( NS_SPECIAL, 'Badtitle/' . __CLASS__ );
82  }
83  $this->params = $params;
84  $this->page = $page;
85  $this->opts = $opts;
86  }
87 
91  protected function validateParams( array $params ) {
92  foreach ( $params as $p => $v ) {
93  if ( is_array( $v ) ) {
94  $this->validateParams( $v );
95  } elseif ( !is_scalar( $v ) && $v !== null ) {
96  throw new UnexpectedValueException( "Job parameter $p is not JSON serializable." );
97  }
98  }
99  }
100 
101  public function getType() {
102  return $this->type;
103  }
104 
105  public function getParams() {
106  return $this->params;
107  }
108 
109  public function getReleaseTimestamp() {
110  return isset( $this->params['jobReleaseTimestamp'] )
111  ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
112  : null;
113  }
114 
115  public function ignoreDuplicates() {
116  return !empty( $this->opts['removeDuplicates'] );
117  }
118 
119  public function getDeduplicationInfo() {
120  $info = [
121  'type' => $this->getType(),
122  'params' => $this->getParams()
123  ];
124  if ( is_array( $info['params'] ) ) {
125  // Identical jobs with different "root" jobs should count as duplicates
126  unset( $info['params']['rootJobSignature'] );
127  unset( $info['params']['rootJobTimestamp'] );
128  // Likewise for jobs with different delay times
129  unset( $info['params']['jobReleaseTimestamp'] );
130  if ( isset( $this->opts['removeDuplicatesIgnoreParams'] ) ) {
131  foreach ( $this->opts['removeDuplicatesIgnoreParams'] as $field ) {
132  unset( $info['params'][$field] );
133  }
134  }
135  }
136 
137  return $info;
138  }
139 
140  public function getRootJobParams() {
141  return [
142  'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
143  'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
144  ];
145  }
146 
147  public function hasRootJobParams() {
148  return isset( $this->params['rootJobSignature'] )
149  && isset( $this->params['rootJobTimestamp'] );
150  }
151 
152  public function isRootJob() {
153  return $this->hasRootJobParams() && !empty( $this->params['rootJobIsSelf'] );
154  }
155 
161  public function toSerializableArray() {
162  wfDeprecated( __METHOD__, '1.41' );
163  return [
164  'type' => $this->type,
165  'params' => $this->params,
166  'opts' => $this->opts,
167  'title' => [
168  'ns' => $this->page->getNamespace(),
169  'key' => $this->page->getDBkey()
170  ]
171  ];
172  }
173 
179  public static function newFromArray( array $map ) {
180  return new self(
181  $map['type'],
182  $map['params'],
183  $map['opts'],
184  PageReferenceValue::localReference( $map['title']['ns'], $map['title']['key'] )
185  );
186  }
187 }
const NS_SPECIAL
Definition: Defines.php:53
wfTimestampOrNull( $outputtype=TS_UNIX, $ts=null)
Return a formatted timestamp, or null if input is null.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
Job queue task description base code.
PageReference $page
array $params
Array of job parameters or false if none.
__construct( $type, array $params, array $opts=[], PageReference $page=null)
validateParams(array $params)
static newFromArray(array $map)
getDeduplicationInfo()
Subclasses may need to override this to make duplication detection work.
Immutable value object representing a page reference.
Interface for serializable objects that describe a job queue task.
Interface for objects (potentially) representing a page that can be viewable and linked to on a wiki.
getNamespace()
Returns the page's namespace number.
getDBkey()
Get the page title in DB key form.