Completed
Pull Request — master (#106)
by MusikAnimal
02:46
created

TopEditsRepository::getTopEdits()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 46
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 46
rs 8.4751
c 0
b 0
f 0
cc 5
eloc 27
nc 7
nop 4
1
<?php
2
/**
3
 * This file contains only the TopEditsRepository class.
4
 */
5
6
namespace Xtools;
7
8
use DateInterval;
9
10
/**
11
 * TopEditsRepository is responsible for retrieving data from the database
12
 * about the top-edited pages of a user. It doesn't do any post-processing
13
 * of that information.
14
 */
15
class TopEditsRepository extends Repository
16
{
17
    /**
18
     * Get the top edits by a user in a single namespace.
19
     * @param Project $project
20
     * @param User $user
21
     * @param int $namespace Namespace ID.
22
     * @param int $limit Number of edits to fetch.
23
     * @return string[] page_namespace, page_title, page_is_redirect,
24
     *   count (number of edits), assessment (page assessment).
25
     */
26
    public function getTopEditsNamespace(Project $project, User $user, $namespace = 0, $limit = 100)
27
    {
28
        // Set up cache.
29
        $cacheKey = 'topedits.'.$project->getDatabaseName().'.'.$user->getCacheKey().
30
            $namespace.$limit;
31
        if ($this->cache->hasItem($cacheKey)) {
32
            return $this->cache->getItem($cacheKey)->get();
33
        }
34
35
        $pageTable = $this->getTableName($project->getDatabaseName(), 'page');
36
        $revisionTable = $this->getTableName($project->getDatabaseName(), 'revision');
37
38
        $hasPageAssessments = $this->isLabs() && $project->hasPageAssessments() && $namespace === 0;
39
        $pageAssessmentsTable = $this->getTableName($project->getDatabaseName(), 'page_assessments');
0 ignored issues
show
Unused Code introduced by
$pageAssessmentsTable is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
40
        $paSelect = $hasPageAssessments
41
            ?  ", (
42
                    SELECT pa_class
43
                    FROM page_assessments
44
                    WHERE pa_page_id = page_id
45
                    LIMIT 1
46
                ) AS pa_class"
47
            : '';
48
49
        $sql = "SELECT page_namespace, page_title, page_is_redirect, COUNT(page_title) AS count
50
                    $paSelect
51
                FROM $pageTable JOIN $revisionTable ON page_id = rev_page
52
                WHERE rev_user_text = :username
53
                AND page_namespace = :namespace
54
                GROUP BY page_namespace, page_title
55
                ORDER BY count DESC
56
                LIMIT $limit";
57
        $resultQuery = $this->getProjectsConnection()->prepare($sql);
58
        $username = $user->getUsername();
59
        $resultQuery->bindParam('username', $username);
60
        $resultQuery->bindParam('namespace', $namespace);
61
        $resultQuery->execute();
62
        $results = $resultQuery->fetchAll();
63
64
        // Cache for 10 minutes, and return.
65
        $cacheItem = $this->cache->getItem($cacheKey)
66
            ->set($results)
67
            ->expiresAfter(new DateInterval('PT10M'));
68
        $this->cache->save($cacheItem);
69
70
        return $results;
71
    }
72
73
    /**
74
     * Get the top edits by a user across all namespaces.
75
     * @param Project $project
76
     * @param User $user
77
     * @param int $limit Number of edits to fetch.
78
     * @return string[] page_namespace, page_title, page_is_redirect,
79
     *   count (number of edits), assessment (page assessment).
80
     */
81
    public function getTopEditsAllNamespaces(Project $project, User $user, $limit = 10)
82
    {
83
        // Set up cache.
84
        $cacheKey = 'topedits.'.$project->getDatabaseName().'.'.$user->getCacheKey().
85
            'all'.$limit;
86
        if ($this->cache->hasItem($cacheKey)) {
87
            return $this->cache->getItem($cacheKey)->get();
88
        }
89
90
        $pageTable = $this->getTableName($project->getDatabaseName(), 'page');
91
        $revisionTable = $this->getTableName($project->getDatabaseName(), 'revision');
92
        $hasPageAssessments = $this->isLabs() && $project->hasPageAssessments();
93
        $pageAssessmentsTable = $this->getTableName($project->getDatabaseName(), 'page_assessments');
94
        $paSelect = $hasPageAssessments
95
            ?  ", (
96
                    SELECT pa_class
97
                    FROM $pageAssessmentsTable
98
                    WHERE pa_page_id = e.page_id
99
                    LIMIT 1
100
                ) AS pa_class"
101
            : ', NULL as pa_class';
102
103
        $sql = "SELECT c.page_namespace, e.page_title, c.count $paSelect
104
                FROM
105
                (
106
                    SELECT b.page_namespace, b.rev_page, b.count
107
                        ,@rn := if(@ns = b.page_namespace, @rn + 1, 1) AS row_number
108
                        ,@ns := b.page_namespace AS dummy
109
                    FROM
110
                    (
111
                        SELECT page_namespace, rev_page, count(rev_page) AS count
112
                        FROM $revisionTable
113
                        JOIN $pageTable ON page_id = rev_page
114
                        WHERE rev_user_text = :username
115
                        GROUP BY page_namespace, rev_page
116
                    ) AS b
117
                    JOIN (SELECT @ns := NULL, @rn := 0) AS vars
118
                    ORDER BY b.page_namespace ASC, b.count DESC
119
                ) AS c
120
                JOIN $pageTable e ON e.page_id = c.rev_page
121
                WHERE c.row_number < $limit";
122
        $resultQuery = $this->getProjectsConnection()->prepare($sql);
123
        $username = $user->getUsername();
124
        $resultQuery->bindParam('username', $username);
125
        $resultQuery->execute();
126
        $results = $resultQuery->fetchAll();
127
128
        // Cache for 10 minutes, and return.
129
        $cacheItem = $this->cache->getItem($cacheKey)
130
            ->set($results)
131
            ->expiresAfter(new DateInterval('PT10M'));
132
        $this->cache->save($cacheItem);
133
134
        return $results;
135
    }
136
137
    /**
138
     * Get the display titles of the given pages.
139
     * @param Project $project
140
     * @param  string[] $titles List of page titles.
141
     * @return string[] Keys are the original supplied titles, and values are the display titles.
142
     */
143
    public function getDisplayTitles(Project $project, $titles)
144
    {
145
        /** @var ApiHelper $apiHelper */
146
        $apiHelper = $this->container->get('app.api_helper');
147
148
        return $apiHelper->displayTitles($project->getDomain(), $titles);
149
    }
150
}
151