Passed
Push — 4.x ( 17e0c5...e9b635 )
by Doug
07:44
created

updateFile()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 35
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 35
rs 9.6333
cc 1
nc 1
nop 2
1
<?php
2
/**
3
 * PHPCoord.
4
 *
5
 * @author Doug Wright
6
 */
7
declare(strict_types=1);
8
9
use PHPCoord\EPSG\Import\AddNewConstantsVisitor;
10
use PHPCoord\EPSG\Import\ASTPrettyPrinter;
11
use PHPCoord\EPSG\Import\RemoveExistingConstantsVisitor;
12
use PhpParser\Lexer\Emulative;
13
use PhpParser\NodeTraverser;
14
use PhpParser\NodeVisitor\CloningVisitor;
15
use PhpParser\Parser\Php7;
16
17
require __DIR__ . '/../../../vendor/autoload.php';
18
19
/**
20
 * Imports raw EPSG Dataset from Postgres format.
21
 */
22
$resDir = __DIR__ . '/../../../resources';
23
$srcDir = dirname(__DIR__, 2);
24
25
createSQLiteDB($resDir);
26
generateConstants($resDir, $srcDir);
27
csFixGeneratedFiles($srcDir);
28
29
function createSQLiteDB(string $resDir): void
30
{
31
    //remove old file if any
32
    if (file_exists($resDir . '/epsg/epsg.sqlite')) {
33
        unlink($resDir . '/epsg/epsg.sqlite');
34
    }
35
36
    $sqlite = new SQLite3(
37
        $resDir . '/epsg/epsg.sqlite',
38
        SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE
39
    );
40
    $sqlite->enableExceptions(true);
41
    $sqlite->exec('PRAGMA journal_mode=WAL'); //WAL is faster
42
43
    $tableSchema = file_get_contents($resDir . '/epsg/PostgreSQL_Table_Script.sql');
44
    $sqlite->exec($tableSchema);
45
46
    $tableData = file_get_contents($resDir . '/epsg/PostgreSQL_Data_Script.sql');
47
    $sqlite->exec($tableData);
48
49
    $sqlite->exec('VACUUM');
50
    $sqlite->exec('PRAGMA journal_mode=DELETE'); //but WAL is not openable read-only in older SQLite
51
    $sqlite->close();
52
}
53
54
function generateConstants(string $resDir, string $srcDir): void
55
{
56
    $sqlite = new SQLite3(
57
        $resDir . '/epsg/epsg.sqlite',
58
        SQLITE3_OPEN_READONLY
59
    );
60
    $sqlite->enableExceptions(true);
61
62
    /*
63
     * Units of Measure
64
     */
65
    $sql = "
66
            SELECT
67
                m.uom_code AS constant_value,
68
                m.unit_of_meas_type || '_' || m.unit_of_meas_name AS constant_name,
69
                m.unit_of_meas_name || '\n' || m.remarks AS constant_help,
70
                m.deprecated
71
            FROM epsg_unitofmeasure m
72
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_unitofmeasure' AND dep.object_code = m.uom_code AND dep.deprecation_date <= '2020-09-01'
73
            WHERE dep.deprecation_id IS NULL
74
            ORDER BY constant_name
75
            ";
76
77
    $result = $sqlite->query($sql);
78
79
    updateFile($srcDir . '/UnitOfMeasure/UnitOfMeasure.php', $result);
80
81
    /*
82
     * Prime Meridians
83
     */
84
    $sql = "
85
            SELECT
86
                p.prime_meridian_code AS constant_value,
87
                p.prime_meridian_name AS constant_name,
88
                p.prime_meridian_name || '\n' || p.remarks AS constant_help,
89
                p.deprecated
90
            FROM epsg_primemeridian p
91
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_primemeridian' AND dep.object_code = p.prime_meridian_code AND dep.deprecation_date <= '2020-09-01'
92
            WHERE dep.deprecation_id IS NULL
93
            ORDER BY constant_name
94
            ";
95
96
    $result = $sqlite->query($sql);
97
98
    updateFile($srcDir . '/Datum/PrimeMeridian.php', $result);
99
100
    /*
101
     * Ellipsoids
102
     */
103
    $sql = "
104
            SELECT
105
            DISTINCT
106
                e.ellipsoid_code AS constant_value,
107
                e.ellipsoid_name AS constant_name,
108
                e.ellipsoid_name || '\n' || e.remarks AS constant_help,
109
                e.deprecated
110
            FROM epsg_ellipsoid e
111
            JOIN epsg_datum d ON d.ellipsoid_code = e.ellipsoid_code -- there are some never used entries
112
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_ellipsoid' AND dep.object_code = e.ellipsoid_code AND dep.deprecation_date <= '2020-09-01'
113
            WHERE dep.deprecation_id IS NULL
114
            ORDER BY constant_name
115
            ";
116
    $result = $sqlite->query($sql);
117
118
    updateFile($srcDir . '/Datum/Ellipsoid.php', $result);
119
120
    /*
121
     * Datums
122
     */
123
    $sql = "
124
            SELECT
125
                DISTINCT
126
                d.datum_code AS constant_value,
127
                d.datum_name AS constant_name,
128
                d.datum_name || '\n' || 'Type: ' || d.datum_type || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || d.origin_description || '\n' || d.remarks AS constant_help,
129
                d.deprecated
130
            FROM epsg_datum d
131
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_datum' AND dep.object_code = d.datum_code AND dep.deprecation_date <= '2020-09-01'
132
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_datum' AND u.object_code = d.datum_code
133
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
134
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
135
            WHERE dep.deprecation_id IS NULL AND d.datum_type != 'engineering'
136
            ORDER BY constant_name
137
        ";
138
    $result = $sqlite->query($sql);
139
140
    updateFile($srcDir . '/Datum/Datum.php', $result);
141
142
    /*
143
     * Coordinate systems
144
     */
145
    $sql = "
146
            SELECT
147
                DISTINCT
148
                cs.coord_sys_code AS constant_value,
149
                cs.coord_sys_name || CASE cs.coord_sys_code WHEN 4531 THEN '_LOWERCASE' ELSE '' END AS constant_name,
150
                cs.coord_sys_name || '\n' || 'Type: ' || cs.coord_sys_type || '\n' || cs.remarks AS constant_help,
151
                cs.deprecated
152
            FROM epsg_coordinatesystem cs
153
            JOIN epsg_coordinatereferencesystem crs ON crs.coord_sys_code = cs.coord_sys_code AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
154
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatesystem' AND dep.object_code = cs.coord_sys_code AND dep.deprecation_date <= '2020-09-01'
155
            WHERE dep.deprecation_id IS NULL AND cs.coord_sys_type != 'ordinal'
156
            ORDER BY constant_name
157
        ";
158
    $result = $sqlite->query($sql);
159
160
    updateFile($srcDir . '/CoordinateSystem/CoordinateSystem.php', $result);
161
162
    /*
163
     * Coordinate systems (cartesian)
164
     */
165
    $sql = "
166
            SELECT
167
                DISTINCT
168
                cs.coord_sys_code AS constant_value,
169
                REPLACE(REPLACE(REPLACE(cs.coord_sys_name, 'Cartesian 2D CS', ''), 'Cartesian 3D CS', ''), 'for', '') || CASE cs.coord_sys_code WHEN 4531 THEN '_LOWERCASE' ELSE '' END AS constant_name,
170
                cs.coord_sys_name || '\n' || 'Type: ' || cs.coord_sys_type || '\n' || cs.remarks AS constant_help,
171
                cs.deprecated
172
            FROM epsg_coordinatesystem cs
173
            JOIN epsg_coordinatereferencesystem crs ON crs.coord_sys_code = cs.coord_sys_code AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
174
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatesystem' AND dep.object_code = cs.coord_sys_code AND dep.deprecation_date <= '2020-09-01'
175
            WHERE dep.deprecation_id IS NULL AND cs.coord_sys_type != 'ordinal'
176
            AND cs.coord_sys_type = 'Cartesian'
177
            ORDER BY constant_name
178
        ";
179
    $result = $sqlite->query($sql);
180
181
    updateFile($srcDir . '/CoordinateSystem/Cartesian.php', $result);
182
183
    /*
184
     * Coordinate systems (ellipsoidal)
185
     */
186
    $sql = "
187
            SELECT
188
                DISTINCT
189
                cs.coord_sys_code AS constant_value,
190
                REPLACE(REPLACE(REPLACE(cs.coord_sys_name, 'Ellipsoidal 2D CS', ''), 'Ellipsoidal 3D CS', ''), 'for', '') AS constant_name,
191
                cs.coord_sys_name || '\n' || 'Type: ' || cs.coord_sys_type || '\n' || cs.remarks AS constant_help,
192
                cs.deprecated
193
            FROM epsg_coordinatesystem cs
194
            JOIN epsg_coordinatereferencesystem crs ON crs.coord_sys_code = cs.coord_sys_code AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
195
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatesystem' AND dep.object_code = cs.coord_sys_code AND dep.deprecation_date <= '2020-09-01'
196
            WHERE dep.deprecation_id IS NULL AND cs.coord_sys_type != 'ordinal'
197
            AND cs.coord_sys_type = 'ellipsoidal'
198
            ORDER BY constant_name
199
        ";
200
    $result = $sqlite->query($sql);
201
202
    updateFile($srcDir . '/CoordinateSystem/Ellipsoidal.php', $result);
203
204
    /*
205
     * Coordinate systems (vertical)
206
     */
207
    $sql = "
208
            SELECT
209
                DISTINCT
210
                cs.coord_sys_code AS constant_value,
211
                REPLACE(REPLACE(cs.coord_sys_name, 'Vertical CS', ''), 'for', '') AS constant_name,
212
                cs.coord_sys_name || '\n' || 'Type: ' || cs.coord_sys_type || '\n' || cs.remarks AS constant_help,
213
                cs.deprecated
214
            FROM epsg_coordinatesystem cs
215
            JOIN epsg_coordinatereferencesystem crs ON crs.coord_sys_code = cs.coord_sys_code AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
216
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatesystem' AND dep.object_code = cs.coord_sys_code AND dep.deprecation_date <= '2020-09-01'
217
            WHERE dep.deprecation_id IS NULL AND cs.coord_sys_type != 'ordinal'
218
            AND cs.coord_sys_type = 'vertical'
219
            ORDER BY constant_name
220
        ";
221
    $result = $sqlite->query($sql);
222
223
    updateFile($srcDir . '/CoordinateSystem/Vertical.php', $result);
224
225
    /*
226
     * Coordinate systems (other)
227
     */
228
    $sql = "
229
            SELECT
230
                DISTINCT
231
                cs.coord_sys_code AS constant_value,
232
                cs.coord_sys_name AS constant_name,
233
                cs.coord_sys_name || '\n' || 'Type: ' || cs.coord_sys_type || '\n' || cs.remarks AS constant_help,
234
                cs.deprecated
235
            FROM epsg_coordinatesystem cs
236
            JOIN epsg_coordinatereferencesystem crs ON crs.coord_sys_code = cs.coord_sys_code AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
237
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatesystem' AND dep.object_code = cs.coord_sys_code AND dep.deprecation_date <= '2020-09-01'
238
            WHERE dep.deprecation_id IS NULL AND cs.coord_sys_type != 'ordinal'
239
            AND cs.coord_sys_type NOT IN ('Cartesian', 'ellipsoidal', 'vertical')
240
            ORDER BY constant_name
241
        ";
242
    $result = $sqlite->query($sql);
243
244
    updateFile($srcDir . '/CoordinateSystem/CoordinateSystem.php', $result);
245
246
    /*
247
     * Coordinate reference systems (compound)
248
     */
249
    $sql = "
250
            SELECT
251
                crs.coord_ref_sys_code AS constant_value,
252
                crs.coord_ref_sys_name AS constant_name,
253
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
254
                crs.deprecated
255
            FROM epsg_coordinatereferencesystem crs
256
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
257
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
258
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
259
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
260
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
261
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
262
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
263
            AND crs.coord_ref_sys_kind = 'compound'
264
            GROUP BY crs.coord_ref_sys_code
265
            ORDER BY constant_name
266
        ";
267
268
    $result = $sqlite->query($sql);
269
270
    updateFile($srcDir . '/CoordinateReferenceSystem/Compound.php', $result);
271
272
    /*
273
     * Coordinate reference systems (geocentric)
274
     */
275
    $sql = "
276
            SELECT
277
                crs.coord_ref_sys_code AS constant_value,
278
                crs.coord_ref_sys_name AS constant_name,
279
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
280
                crs.deprecated
281
            FROM epsg_coordinatereferencesystem crs
282
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
283
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
284
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
285
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
286
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
287
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
288
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
289
            AND crs.coord_ref_sys_kind = 'geocentric'
290
            GROUP BY crs.coord_ref_sys_code
291
            ORDER BY constant_name
292
        ";
293
294
    $result = $sqlite->query($sql);
295
296
    updateFile($srcDir . '/CoordinateReferenceSystem/Geocentric.php', $result);
297
298
    /*
299
     * Coordinate reference systems (geographic 2D)
300
     */
301
    $sql = "
302
            SELECT
303
                crs.coord_ref_sys_code AS constant_value,
304
                crs.coord_ref_sys_name AS constant_name,
305
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
306
                crs.deprecated
307
            FROM epsg_coordinatereferencesystem crs
308
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
309
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
310
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
311
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
312
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
313
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
314
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
315
            AND crs.coord_ref_sys_kind = 'geographic 2D'
316
            GROUP BY crs.coord_ref_sys_code
317
            ORDER BY constant_name
318
        ";
319
320
    $result = $sqlite->query($sql);
321
322
    updateFile($srcDir . '/CoordinateReferenceSystem/Geographic2D.php', $result);
323
324
    /*
325
     * Coordinate reference systems (geographic 3D)
326
     */
327
    $sql = "
328
            SELECT
329
                crs.coord_ref_sys_code AS constant_value,
330
                crs.coord_ref_sys_name AS constant_name,
331
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
332
                crs.deprecated
333
            FROM epsg_coordinatereferencesystem crs
334
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
335
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
336
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
337
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
338
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
339
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
340
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
341
            AND crs.coord_ref_sys_kind = 'geographic 3D'
342
            GROUP BY crs.coord_ref_sys_code
343
            ORDER BY constant_name
344
        ";
345
346
    $result = $sqlite->query($sql);
347
348
    updateFile($srcDir . '/CoordinateReferenceSystem/Geographic3D.php', $result);
349
350
    /*
351
     * Coordinate reference systems (projected)
352
     */
353
    $sql = "
354
            SELECT
355
                crs.coord_ref_sys_code AS constant_value,
356
                crs.coord_ref_sys_name AS constant_name,
357
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
358
                crs.deprecated
359
            FROM epsg_coordinatereferencesystem crs
360
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
361
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
362
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
363
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
364
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
365
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
366
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
367
            AND crs.coord_ref_sys_kind = 'projected'
368
            GROUP BY crs.coord_ref_sys_code
369
            ORDER BY constant_name
370
        ";
371
372
    $result = $sqlite->query($sql);
373
374
    updateFile($srcDir . '/CoordinateReferenceSystem/Projected.php', $result);
375
376
    /*
377
     * Coordinate reference systems (vertical)
378
     */
379
    $sql = "
380
            SELECT
381
                crs.coord_ref_sys_code AS constant_value,
382
                crs.coord_ref_sys_name AS constant_name,
383
                crs.coord_ref_sys_name || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
384
                crs.deprecated
385
            FROM epsg_coordinatereferencesystem crs
386
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
387
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
388
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
389
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
390
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
391
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
392
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
393
            AND crs.coord_ref_sys_kind = 'vertical'
394
            GROUP BY crs.coord_ref_sys_code
395
            ORDER BY constant_name
396
        ";
397
398
    $result = $sqlite->query($sql);
399
400
    updateFile($srcDir . '/CoordinateReferenceSystem/Vertical.php', $result);
401
402
    /*
403
     * Coordinate reference systems (other)
404
     */
405
    $sql = "
406
            SELECT
407
                crs.coord_ref_sys_code AS constant_value,
408
                crs.coord_ref_sys_kind || '_' || crs.coord_ref_sys_name AS constant_name,
409
                crs.coord_ref_sys_name || '\n' || 'Type: ' || crs.coord_ref_sys_kind || '\n' || 'Extent: ' || e.extent_description || '\n' || 'Scope: ' || s.scope || '\n' || crs.remarks AS constant_help,
410
                crs.deprecated
411
            FROM epsg_coordinatereferencesystem crs
412
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordinatereferencesystem' AND dep.object_code = crs.coord_ref_sys_code AND dep.deprecation_date <= '2020-09-01'
413
            LEFT JOIN epsg_usage u ON u.object_table_name = 'epsg_coordinatereferencesystem' AND u.object_code = crs.coord_ref_sys_code
414
            LEFT JOIN epsg_scope s ON u.scope_code = s.scope_code
415
            LEFT JOIN epsg_extent e ON u.extent_code = e.extent_code
416
            WHERE dep.deprecation_id IS NULL AND crs.coord_ref_sys_kind NOT IN ('engineering', 'derived') AND crs.coord_ref_sys_name NOT LIKE '%example%'
417
            AND (crs.cmpd_horizcrs_code IS NULL OR crs.cmpd_horizcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
418
            AND (crs.cmpd_vertcrs_code IS NULL OR crs.cmpd_vertcrs_code NOT IN (SELECT coord_ref_sys_code FROM epsg_coordinatereferencesystem WHERE coord_ref_sys_kind IN ('engineering', 'derived')))
419
            AND crs.coord_ref_sys_kind NOT IN ('compound', 'geocentric', 'geographic 2D', 'geographic 3D', 'projected', 'vertical')
420
            GROUP BY crs.coord_ref_sys_code
421
            ORDER BY constant_name
422
        ";
423
424
    $result = $sqlite->query($sql);
425
426
    updateFile($srcDir . '/CoordinateReferenceSystem/CoordinateReferenceSystem.php', $result);
427
428
    /*
429
     * Coordinate operation methods
430
     */
431
    $sql = "
432
            SELECT
433
                m.coord_op_method_code AS constant_value,
434
                m.coord_op_method_name AS constant_name,
435
                m.coord_op_method_name || '\n' || m.remarks AS constant_help,
436
                m.deprecated
437
            FROM epsg_coordoperationmethod m
438
            -- on this table, the deprecated ids are used internally, so don't exclude them unless they were replaced
439
            LEFT JOIN epsg_deprecation dep ON dep.object_table_name = 'epsg_coordoperationmethod' AND dep.object_code = m.coord_op_method_code
440
            WHERE dep.replaced_by IS NULL
441
            AND m.coord_op_method_name NOT LIKE '%wellbore%'
442
            AND m.coord_op_method_name NOT LIKE '%mining%'
443
            AND m.coord_op_method_name NOT LIKE '%seismic%'
444
            GROUP BY m.coord_op_method_code
445
            ORDER BY constant_name
446
        ";
447
448
    $result = $sqlite->query($sql);
449
450
    updateFile($srcDir . '/CoordinateOperation/CoordinateOperationMethods.php', $result);
451
452
    $sqlite->close();
453
}
454
455
function updateFile(string $fileName, SQLite3Result $classConstants): void
456
{
457
    $lexer = new Emulative([
458
        'usedAttributes' => [
459
            'comments',
460
            'startLine', 'endLine',
461
            'startTokenPos', 'endTokenPos',
462
        ],
463
    ]);
464
    $parser = new Php7($lexer);
465
466
    $traverser = new NodeTraverser();
467
    $traverser->addVisitor(new CloningVisitor());
468
469
    $oldStmts = $parser->parse(file_get_contents($fileName));
470
    $oldTokens = $lexer->getTokens();
471
472
    $newStmts = $traverser->traverse($oldStmts);
0 ignored issues
show
Bug introduced by
It seems like $oldStmts can also be of type null; however, parameter $nodes of PhpParser\NodeTraverser::traverse() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

472
    $newStmts = $traverser->traverse(/** @scrutinizer ignore-type */ $oldStmts);
Loading history...
473
474
    /*
475
     * First remove all existing EPSG consts
476
     */
477
    $traverser = new NodeTraverser();
478
    $traverser->addVisitor(new RemoveExistingConstantsVisitor());
479
    $newStmts = $traverser->traverse($newStmts);
480
481
    /*
482
     * Then add the ones wanted
483
     */
484
    $traverser = new NodeTraverser();
485
    $traverser->addVisitor(new AddNewConstantsVisitor($classConstants));
486
    $newStmts = $traverser->traverse($newStmts);
487
488
    $prettyPrinter = new ASTPrettyPrinter();
489
    file_put_contents($fileName, $prettyPrinter->printFormatPreserving($newStmts, $oldStmts, $oldTokens));
0 ignored issues
show
Bug introduced by
It seems like $oldStmts can also be of type null; however, parameter $origStmts of PhpParser\PrettyPrinterA...printFormatPreserving() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

489
    file_put_contents($fileName, $prettyPrinter->printFormatPreserving($newStmts, /** @scrutinizer ignore-type */ $oldStmts, $oldTokens));
Loading history...
490
}
491
492
function csFixGeneratedFiles(string $srcDir): void
493
{
494
    chdir(dirname($srcDir));
495
    shell_exec('php vendor/friendsofphp/php-cs-fixer/php-cs-fixer fix');
496
}
497