Version20190210182615::up()   F
last analyzed

Complexity

Conditions 25
Paths > 20000

Size

Total Lines 161
Code Lines 103

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 25
eloc 103
nc 1310720
nop 1
dl 0
loc 161
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
8
9
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
10
use Doctrine\DBAL\Schema\Schema;
11
12
class Version20190210182615 extends AbstractMigrationChamilo
13
{
14
    public function getDescription(): string
15
    {
16
        return 'Session changes';
17
    }
18
19
    public function up(Schema $schema): void
20
    {
21
        $table = $schema->getTable('session');
22
        if (false === $table->hasColumn('position')) {
23
            $this->addSql('ALTER TABLE session ADD COLUMN position INT DEFAULT 0 NOT NULL');
24
        } else {
25
            $this->addSql('ALTER TABLE session CHANGE position position INT DEFAULT 0 NOT NULL');
26
        }
27
28
        $this->addSql('UPDATE session SET promotion_id = NULL WHERE promotion_id = 0');
29
        if (!$table->hasForeignKey('FK_D044D5D4139DF194')) {
30
            $this->addSql('ALTER TABLE session ADD CONSTRAINT FK_D044D5D4139DF194 FOREIGN KEY (promotion_id) REFERENCES promotion (id) ON DELETE CASCADE');
31
            $this->addSql('CREATE INDEX IDX_D044D5D4139DF194 ON session (promotion_id);');
32
        }
33
34
        if (!$table->hasColumn('status')) {
35
            $this->addSql('ALTER TABLE session ADD COLUMN status INT NOT NULL');
36
        } else {
37
            $this->addSql('ALTER TABLE session CHANGE status status INT NOT NULL');
38
        }
39
40
        if (!$table->hasForeignKey('FK_D044D5D4EF87E278')) {
41
            $this->addSql('ALTER TABLE session ADD CONSTRAINT FK_D044D5D4EF87E278 FOREIGN KEY(session_admin_id) REFERENCES user(id);');
42
        }
43
44
        $this->addSql('UPDATE session_category SET date_start = NULL WHERE CAST(date_start AS CHAR(11)) = "0000-00-00"');
45
        $this->addSql('UPDATE session_category SET date_end = NULL WHERE CAST(date_end AS CHAR(11)) = "0000-00-00"');
46
47
        $table = $schema->getTable('session_rel_course_rel_user');
48
49
        if (!$table->hasColumn('progress')) {
50
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD progress INT NOT NULL');
51
        }
52
53
        if ($table->hasForeignKey('FK_720167E91D79BD3')) {
54
            $this->addSql('ALTER TABLE session_rel_course_rel_user DROP FOREIGN KEY FK_720167E91D79BD3');
55
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD CONSTRAINT FK_720167E91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE CASCADE');
56
        } else {
57
            $this->addSql('ALTER TABLE session_rel_course_rel_user ADD CONSTRAINT FK_720167E91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE CASCADE');
58
        }
59
60
        // Remove duplicates.
61
        $sql = 'SELECT max(id) id, session_id, c_id, user_id, status, count(*) as count
62
                FROM session_rel_course_rel_user
63
                GROUP BY session_id, c_id, user_id, status
64
                HAVING count > 1';
65
        $result = $this->connection->executeQuery($sql);
66
        $items = $result->fetchAllAssociative();
67
68
        foreach ($items as $item) {
69
            $userId = $item['user_id'];
70
            $sessionId = $item['session_id'];
71
            $courseId = $item['c_id'];
72
            $status = $item['status'];
73
74
            $sql = "SELECT id
75
                    FROM session_rel_course_rel_user
76
                    WHERE user_id = $userId AND session_id = $sessionId AND c_id = $courseId AND status = $status";
77
            $result = $this->connection->executeQuery($sql);
78
            $subItems = $result->fetchAllAssociative();
79
            $counter = 0;
80
            foreach ($subItems as $subItem) {
81
                $id = $subItem['id'];
82
                if (0 === $counter) {
83
                    $counter++;
84
85
                    continue;
86
                }
87
                $sql = "DELETE FROM session_rel_course_rel_user WHERE id = $id";
88
                $this->connection->executeQuery($sql);
89
                $counter++;
90
            }
91
        }
92
93
        if (!$table->hasIndex('course_session_unique')) {
94
            $this->addSql(' CREATE UNIQUE INDEX course_session_unique ON session_rel_course_rel_user (session_id, c_id, user_id, status);');
95
        }
96
97
        $table = $schema->getTable('session_rel_course');
98
        if (!$table->hasIndex('course_session_unique')) {
99
            $this->addSql('CREATE UNIQUE INDEX course_session_unique ON session_rel_course (session_id, c_id)');
100
        }
101
102
        $table = $schema->getTable('session_rel_user');
103
        if (!$table->hasIndex('session_user_unique')) {
104
            $this->addSql('CREATE UNIQUE INDEX session_user_unique ON session_rel_user (session_id, user_id, relation_type);');
105
        }
106
107
        // Move id_coach to session_rel_user
108
        $result = $this->connection->executeQuery('SELECT id, session_admin_id, id_coach FROM session');
109
        $items = $result->fetchAllAssociative();
110
111
        foreach ($items as $item) {
112
            $coachId = (int) $item['id_coach'];
113
            $adminId = (int) $item['session_admin_id'];
114
            $sessionId = (int) $item['id'];
115
116
            if (!empty($coachId)) {
117
                $sql = "SELECT * FROM session_rel_user
118
                        WHERE user_id = $coachId AND session_id = $sessionId AND relation_type = 3 ";
119
                $result = $this->connection->executeQuery($sql);
120
                $exists = $result->fetchAllAssociative();
121
                if (empty($exists)) {
122
                    $sql = "INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id)
123
                            VALUES (3, 0, NOW(), $coachId, $sessionId)";
124
                    $this->connection->executeQuery($sql);
125
                }
126
            }
127
128
            if (!empty($adminId)) {
129
                $sql = "SELECT * FROM session_rel_user
130
                        WHERE user_id = $adminId AND session_id = $sessionId AND relation_type = 4 ";
131
                $result = $this->connection->executeQuery($sql);
132
                $exists = $result->fetchAllAssociative();
133
                if (empty($exists)) {
134
                    $sql = "INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id)
135
                            VALUES (4, 0, NOW(), $adminId, $sessionId)";
136
                    $this->connection->executeQuery($sql);
137
                }
138
            }
139
        }
140
141
        $sql = 'SELECT user_id, session_id, status
142
                FROM session_rel_course_rel_user scu
143
                WHERE user_id NOT IN (SELECT user_id FROM session_rel_user WHERE session_id = scu.session_id)';
144
        $result = $this->connection->executeQuery($sql);
145
        $items = $result->fetchAllAssociative();
146
147
        foreach ($items as $item) {
148
            $userId = (int) $item['user_id'];
149
            $sessionId = (int) $item['session_id'];
150
            $status = (int) $item['status'];
151
            if (!empty($userId)) {
152
                $sql = "SELECT * FROM session_rel_user
153
                        WHERE user_id = $userId AND session_id = $sessionId AND relation_type = $status";
154
                $result = $this->connection->executeQuery($sql);
155
                $exists = $result->fetchAllAssociative();
156
                if (empty($exists)) {
157
                    $sql = "INSERT INTO session_rel_user (relation_type, duration, registered_at, user_id, session_id)
158
                            VALUES ($status, 0, NOW(), $userId, $sessionId)";
159
                    $this->connection->executeQuery($sql);
160
                }
161
            }
162
        }
163
164
        $table = $schema->getTable('session');
165
        if ($table->hasForeignKey('FK_D044D5D4D1DC2CFC')) {
166
            $this->addSql('ALTER TABLE session DROP FOREIGN KEY FK_D044D5D4D1DC2CFC');
167
        }
168
169
        // $this->addSql('ALTER TABLE session DROP COLUMN id_coach');
170
        if ($table->hasForeignKey('FK_D044D5D4EF87E278')) {
171
            $this->addSql('ALTER TABLE session DROP FOREIGN KEY FK_D044D5D4EF87E278');
172
        }
173
174
        if ($table->hasIndex('idx_id_coach')) {
175
            $this->addSql('DROP INDEX idx_id_coach ON session');
176
        }
177
178
        if ($table->hasForeignKey('idx_id_session_admin_id')) {
179
            $this->addSql('DROP INDEX idx_id_session_admin_id ON session');
180
        }
181
        // $this->addSql('ALTER TABLE session DROP COLUMN session_admin_id');
182
    }
183
184
    public function down(Schema $schema): void {}
185
}
186