Completed
Push — master ( a5ec56...0143f1 )
by Vitaly
04:57 queued 02:19
created

RealAnalyzer::getEntities()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 18
rs 9.4285
cc 1
eloc 4
nc 1
nop 0
1
<?php
2
//[PHPCOMPRESSOR(remove,start)]
3
/**
4
 * Created by Vitaly Iegorov <[email protected]>.
5
 * on 23.03.16 at 11:45
6
 */
7
namespace samsoncms\api\generator\analyzer;
8
9
use samsoncms\api\Field;
10
use samsoncms\api\generator\exception\ParentEntityNotFound;
11
use samsoncms\api\generator\metadata\RealMetadata;
12
13
/**
14
 * Generic real table entities metadata analyzer.
15
 *
16
 * @package samsoncms\api\analyzer
17
 */
18
class RealAnalyzer extends GenericAnalyzer
19
{
20
    /** @var string Metadata class */
21
    protected $metadataClass = RealMetadata::class;
22
23
    /**
24
     * Analyze virtual entities and gather their metadata.
25
     *
26
     * @return RealMetadata[] Collection of filled metadata
27
     * @throws ParentEntityNotFound
28
     */
29
    public function analyze()
30
    {
31
        /** @var RealMetadata[] $metadataCollection Set pointer to global metadata collection */
32
        $metadataCollection = &self::$metadata;
33
34
        // Iterate all structures, parents first
35
        foreach ($this->getEntities() as $columnRow) {
36
            $table = $columnRow['Table'];
37
38
            /** @var RealMetadata $metadata Set pointer to metadata instance by table name */
39
            $metadata = &$metadataCollection[$table];
40
41
            // If this is a new table - create metadata instance
42
            if (null === $metadata) {
43
                $metadata = new $this->metadataClass;
44
                $metadata->entity = $this->entityName($table);
45
                $metadata->entityClassName = $this->fullEntityName($metadata->entity);
46
            }
47
48
            // Generate correct PSR-2 field name
49
            $fieldName = $this->fieldName($columnRow['Field']);
50
            if (!in_array($fieldName, $metadata->fields)) {
51
                $metadata->fieldNames[$fieldName] = $columnRow['Field'];
52
                $metadata->fields[$columnRow['Field']] = $fieldName;
53
                $metadata->types[$columnRow['Field']] = $this->databaseTypeToPHP($columnRow['Type']);
54
                $metadata->internalTypes[$columnRow['Field']] = $columnRow['Type'];
55
                $metadata->defaults[$columnRow['Field']] = $columnRow['Default'];
56
            }
57
        }
58
59
        return $metadataCollection;
60
    }
61
62
    /**
63
     * Get real entities from database.
64
     *
65
     * @return array Get collection of database entities metadata
66
     */
67
    public function getEntities()
68
    {
69
        // Get tables data
70
        return $this->database->fetch(
71
            'SELECT
72
              `TABLES`.`TABLE_NAME` as `Table`,
73
              `COLUMNS`.`COLUMN_NAME` as `Field`,
74
              `COLUMNS`.`DATA_TYPE` as `Type`,
75
              `COLUMNS`.`IS_NULLABLE` as `Null`,
76
              `COLUMNS`.`COLUMN_KEY` as `Key`,
77
              `COLUMNS`.`COLUMN_DEFAULT` as `Default`,
78
              `COLUMNS`.`EXTRA` as `Extra`
79
              FROM `information_schema`.`TABLES` as `TABLES`
80
              LEFT JOIN `information_schema`.`COLUMNS` as `COLUMNS`
81
              ON `TABLES`.`TABLE_NAME`=`COLUMNS`.`TABLE_NAME`
82
              WHERE `TABLES`.`TABLE_SCHEMA`="' . $this->database->database() . '" AND `COLUMNS`.`TABLE_SCHEMA`="' . $this->database->database() . '"'
83
        );
84
    }
85
86
    /**
87
     * Get PHP data type from database column type.
88
     *
89
     * @param string $type Database column type
90
     *
91
     * @return string PHP data type
92
     */
93
    protected function databaseTypeToPHP($type)
94
    {
95
        switch (strtoupper($type)) {
96
            case 'DECIMAL':
97
            case 'TINY':
98
            case 'TINYINT':
99
            case 'BIT':
100
            case 'INT':
101
            case 'SMALLINT':
102
            case 'MEDIUMINT':
103
            case 'INTEGER':
104
            case 'BIGINT':
105
            case 'SHORT':
106
            case 'LONG':
107
            case 'LONGLONG':
108
            case 'INT24':
109
                return 'int';
110
            case 'FLOAT':
111
                return 'float';
112
            case 'DOUBLE':
113
            case 'DOUBLE PRECISION':
114
                return 'double';
115
            case 'DATETIME':
116
            case 'DATE':
117
            case 'TIMESTAMP':
118
                return 'int';
119
            case 'BOOL':
120
            case 'BOOLEAN':
121
                return 'bool';
122
            case 'CHAR':
123
            case 'VARCHAR':
124
            case 'TEXT':
125
                return 'string';
126
            default:
127
                return 'mixed';
128
        }
129
    }
130
}
131
//[PHPCOMPRESSOR(remove,end)]