Passed
Push — master ( ab6f49...c762ff )
by
unknown
16:59 queued 08:07
created

Version20251205164500::down()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 57
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 32
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 57
rs 9.408

How to fix   Long Method   

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
final class Version20251205164500 extends AbstractMigrationChamilo
13
{
14
    public function getDescription(): string
15
    {
16
        return 'Refactor search engine tables for Xapian: rename specific_field* and simplify search_engine_ref structure.';
17
    }
18
19
    public function up(Schema $schema): void
20
    {
21
        // Rename specific_field -> search_engine_field
22
        //    (structure remains the same: id, code, title)
23
        $this->write('Renaming table specific_field -> search_engine_field...');
24
        $this->connection->executeStatement(
25
            'RENAME TABLE specific_field TO search_engine_field'
26
        );
27
28
        // Rename specific_field_values -> search_engine_field_value
29
        //    and adapt its columns:
30
        //    - drop course_code, tool_id
31
        //    - rename ref_id -> resource_node_id
32
        $this->write('Renaming table specific_field_values -> search_engine_field_value...');
33
        $this->connection->executeStatement(
34
            'RENAME TABLE specific_field_values TO search_engine_field_value'
35
        );
36
37
        $this->write('Dropping legacy columns course_code, tool_id from search_engine_field_value...');
38
        $this->connection->executeStatement(
39
            'ALTER TABLE search_engine_field_value
40
                 DROP COLUMN course_code,
41
                 DROP COLUMN tool_id'
42
        );
43
44
        $this->write('Renaming ref_id -> resource_node_id in search_engine_field_value...');
45
        $this->connection->executeStatement(
46
            'ALTER TABLE search_engine_field_value
47
                 CHANGE ref_id resource_node_id INT NOT NULL'
48
        );
49
50
        // Simplify search_engine_ref:
51
        //    - drop FK to course (c_id)
52
        //    - drop columns c_id, tool_id, ref_id_high_level
53
        //    - rename ref_id_second_level -> resource_node_id
54
        $this->write('Updating search_engine_ref structure...');
55
56
        try {
57
            $this->connection->executeStatement(
58
                'ALTER TABLE search_engine_ref DROP FOREIGN KEY FK_473F037891D79BD3'
59
            );
60
            $this->write('Dropped foreign key FK_473F037891D79BD3 from search_engine_ref.');
61
        } catch (\Throwable $e) {
62
            $this->write('Foreign key FK_473F037891D79BD3 not found on search_engine_ref, skipping FK drop.');
63
        }
64
65
        $this->connection->executeStatement(
66
            'ALTER TABLE search_engine_ref
67
                 DROP COLUMN c_id,
68
                 DROP COLUMN tool_id,
69
                 DROP COLUMN ref_id_high_level,
70
                 CHANGE ref_id_second_level resource_node_id INT DEFAULT NULL'
71
        );
72
73
        $this->write('search_engine_ref updated (c_id/tool_id/ref_id_high_level removed, ref_id_second_level -> resource_node_id).');
74
    }
75
76
    public function down(Schema $schema): void
77
    {
78
        $this->write('Reverting search_engine_ref structure...');
79
80
        // Revert search_engine_ref
81
        //    - rename resource_node_id -> ref_id_second_level
82
        //    - re-add c_id, tool_id, ref_id_high_level (as nullable/default values)
83
        $this->connection->executeStatement(
84
            'ALTER TABLE search_engine_ref
85
                 CHANGE resource_node_id ref_id_second_level INT DEFAULT NULL,
86
                 ADD c_id INT DEFAULT NULL AFTER id,
87
                 ADD tool_id VARCHAR(100) NOT NULL DEFAULT \'\' AFTER c_id,
88
                 ADD ref_id_high_level INT NOT NULL DEFAULT 0 AFTER tool_id'
89
        );
90
91
        try {
92
            $this->connection->executeStatement(
93
                'CREATE INDEX IDX_473F037891D79BD3 ON search_engine_ref (c_id)'
94
            );
95
        } catch (\Throwable $e) {
96
            $this->write('Could not recreate index IDX_473F037891D79BD3 on search_engine_ref: '.$e->getMessage());
97
        }
98
99
        try {
100
            $this->connection->executeStatement(
101
                'ALTER TABLE search_engine_ref
102
                     ADD CONSTRAINT FK_473F037891D79BD3
103
                     FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE SET NULL'
104
            );
105
        } catch (\Throwable $e) {
106
            $this->write('Could not recreate foreign key FK_473F037891D79BD3 on search_engine_ref: '.$e->getMessage());
107
        }
108
109
        // Revert search_engine_field_value
110
        $this->write('Reverting search_engine_field_value -> specific_field_values...');
111
112
        // resource_node_id -> ref_id
113
        $this->connection->executeStatement(
114
            'ALTER TABLE search_engine_field_value
115
                 CHANGE resource_node_id ref_id INT NOT NULL'
116
        );
117
118
        $this->connection->executeStatement(
119
            "ALTER TABLE search_engine_field_value
120
                 ADD course_code VARCHAR(40) NOT NULL DEFAULT '',
121
                 ADD tool_id VARCHAR(100) NOT NULL DEFAULT ''"
122
        );
123
124
        $this->connection->executeStatement(
125
            'RENAME TABLE search_engine_field_value TO specific_field_values'
126
        );
127
128
        // Revert search_engine_field -> specific_field
129
        $this->write('Reverting search_engine_field -> specific_field...');
130
131
        $this->connection->executeStatement(
132
            'RENAME TABLE search_engine_field TO specific_field'
133
        );
134
    }
135
}
136