26 private $revisionStore;
29 private $linkRendererFactory;
32 private $linkBatchFactory;
35 private $hookContainer;
41 private $namespaceInfo;
44 private $commentFormatter;
64 $this->revisionStore = $revisionStore;
65 $this->linkRendererFactory = $linkRendererFactory;
66 $this->linkBatchFactory = $linkBatchFactory;
67 $this->hookContainer = $hookContainer;
68 $this->dbProvider = $dbProvider;
69 $this->namespaceInfo = $namespaceInfo;
70 $this->commentFormatter = $commentFormatter;
84 private function getPagerParams(
int $limit,
string $segment ): array {
86 $seg = explode(
'|', $segment, 2 );
87 if ( count( $seg ) > 1 ) {
88 if ( $seg[0] ===
'after' ) {
91 } elseif ( $seg[0] ==
'before' ) {
102 'offset' => $segment,
120 string $segment =
'',
126 $paramArr = $this->getPagerParams( $limit, $segment );
127 $context->setRequest(
new FauxRequest( $paramArr ) );
130 $pager = $this->getContribsPager( $context, $target, [
132 'revisionsOnly' =>
true
137 if ( $pager->getNumRows() > 0 ) {
138 foreach ( $pager->mResult as $row ) {
140 if ( ++$count > $limit ) {
145 $revision = $this->revisionStore->newRevisionFromRow( $row, 0 );
146 $revisions[] = $revision;
147 if ( $row->ts_tags ) {
148 $tagNames = explode(
',', $row->ts_tags );
149 $tags[ $row->rev_id ] = $this->getContributionTags( $tagNames );
154 $deltas = $this->getContributionDeltas( $revisions );
157 'newest' => $pager->mIsFirst,
158 'oldest' => $pager->mIsLast,
162 $pager->mIsFirst =
false;
163 $pagingQueries = $pager->getPagingQueries();
165 $prev = $pagingQueries[
'prev'][
'offset'] ??
null;
166 $next = $pagingQueries[
'next'][
'offset'] ??
null;
168 $after = $prev ?
'after|' . $prev :
null;
169 $before = $next ?
'before|' . $next :
null;
173 if ( $paramArr[
'dir'] ===
'prev' ) {
174 $revisions = array_reverse( $revisions );
176 return new ContributionsSegment( $revisions, $tags, $before, $after, $deltas, $flags );
183 private function getContributionTags( array $tagNames ): array {
185 foreach ( $tagNames as $name ) {
188 $tagMetadata[$name] = $tagDisplay;
201 private function getContributionDeltas( $revisions ): array {
206 foreach ( $revisions as $revision ) {
207 $revId = $revision->getId();
208 $parentIds[$revId] = $revision->getParentId();
210 $parentSizes = $this->revisionStore->getRevisionSizes( $parentIds );
212 foreach ( $revisions as $revision ) {
213 $parentId = $revision->getParentId();
214 if ( $parentId === 0 ) {
215 $delta = $revision->getSize();
216 } elseif ( !isset( $parentSizes[$parentId] ) ) {
219 $delta = $revision->getSize() - $parentSizes[$parentId];
221 $deltas[ $revision->getId() ] = $delta;
241 $pager = $this->getContribsPager( $context, $user, [
245 $query = $pager->getQueryInfo();
247 $count = $pager->mDb->selectField(
259 private function getContribsPager(
267 $this->linkRendererFactory->create(),
268 $this->linkBatchFactory,
269 $this->hookContainer,
271 $this->revisionStore,
272 $this->namespaceInfo,
274 $this->commentFormatter
Group all the pieces relevant to the context of a request into one instance.
setAuthority(Authority $authority)
Interface for objects which can provide a MediaWiki context on request.