Passed
Push — master ( 61e57b...69ef8d )
by Jean-Christophe
04:35
created

TableReversor::generatePks()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 4
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 3
nc 2
nop 5
crap 3
1
<?php
2
3
namespace Ubiquity\orm\reverse;
4
5
use Ubiquity\orm\OrmUtils;
6
use Ubiquity\db\reverse\DbGenerator;
7
8
class TableReversor {
9
	private $model;
10
	private $fkFieldsToAdd=[];
11
	private $fkFieldTypesToAdd=[];
12
	private $metas;
13
14 1
	public function __construct($model=null){
15 1
		$this->model=$model;
16 1
	}
17
18 1
	public function initFromClass(){
19 1
		if(isset($this->model))
20 1
			$this->metas=OrmUtils::getModelMetadata($this->model);
21 1
	}
22
23 1
	public function init($metas){
24 1
		$this->metas=$metas;
25 1
	}
26
27 1
	public function generateSQL(DbGenerator $generator){
28 1
		$table=$this->metas["#tableName"];
29 1
		$primaryKeys=$this->metas["#primaryKeys"];
30 1
		$serializables=$this->getSerializableFields();
31 1
		$nullables=$this->metas["#nullable"];
32 1
		$fieldTypes=$this->metas["#fieldTypes"];
33 1
		$manyToOnes=$this->metas["#manyToOne"];
34 1
		$manyToManys=[];
35 1
		if(isset($this->metas["#manyToMany"]))
36 1
			$manyToManys=$this->metas["#manyToMany"];
37 1
		$this->scanManyToManys($generator, $manyToManys);
38 1
		$this->generatePks($generator, $primaryKeys, $table, $fieldTypes,$nullables);
39 1
		$this->generateForeignKeys($generator, $manyToOnes, $table);
40 1
		$serializables=\array_unique(\array_merge($serializables,$this->fkFieldsToAdd));
41 1
		$fieldTypes=\array_merge($fieldTypes,$this->fkFieldTypesToAdd);
42 1
		$fieldsAttributes=$this->generateFieldsAttributes($serializables, $fieldTypes, $nullables);
43 1
		$generator->createTable($table, $fieldsAttributes);
44 1
		foreach ($this->fkFieldsToAdd as $fkField){
45 1
			$generator->addKey($table, [$fkField],"");
46
		}
47 1
	}
48
49 1
	protected function getSerializableFields() {
50 1
		$notSerializable=$this->metas["#notSerializable"];
51 1
		$fieldNames=$this->metas["#fieldNames"];
52 1
		return \array_diff($fieldNames, $notSerializable);
53
	}
54
55 1
	protected function scanManyToManys(DbGenerator $generator,$manyToManys){
56 1
		foreach ($manyToManys as $member=>$manyToMany){
57 1
			if(isset($this->metas["#joinTable"][$member])){
58 1
				$annotJoinTable=$this->metas["#joinTable"][$member];
59 1
				$generator->addManyToMany($annotJoinTable["name"], $manyToMany["targetEntity"]);
60
			}
61
		}
62 1
	}
63
64 1
	protected function generatePks(DbGenerator $generator,$primaryKeys,$table,$fieldTypes,$nullables){
65 1
		$generator->addKey($table, $primaryKeys);
66 1
		if(\sizeof($primaryKeys)===1 && $generator->isInt($fieldTypes[$primaryKeys[0]])){
67 1
			$generator->addAutoInc($table, $this->getFieldAttributes($generator, $primaryKeys[0], $nullables, $fieldTypes));
68
		}
69 1
	}
70
71 1
	protected function generateFieldsAttributes($serializables,$fieldTypes,$nullables){
72 1
		$fieldsAttributes=[];
73 1
		foreach ($serializables as $field){
74 1
			$fieldsAttributes[]=$this->_generateFieldAttributes($field, $nullables, $fieldTypes);
75
		}
76 1
		return $fieldsAttributes;
77
	}
78
79 1
	public function getFieldAttributes(DbGenerator $generator,$field,$nullables,$fieldTypes){
80 1
		return $generator->generateField($this->_generateFieldAttributes($field, $nullables, $fieldTypes));
81
	}
82
83 1
	protected function _generateFieldAttributes($field,$nullables,$fieldTypes){
84 1
		$nullable="NOT NULL";
85 1
		if(\array_search($field, $nullables)!==false){
86 1
			$nullable="";
87
		}
88 1
		return ["name"=>$field,"type"=>$fieldTypes[$field],"extra"=>$nullable];
89
	}
90
91 1
	protected function generateForeignKey(DbGenerator $generator,$tableName,$member){
92 1
		$fieldAnnot=OrmUtils::getMemberJoinColumns("", $member,$this->metas);
93 1
		if($fieldAnnot!==null){
94 1
			$annotationArray=$fieldAnnot[1];
95 1
			$referencesTableName=OrmUtils::getTableName($annotationArray["className"]);
96 1
			$referencesFieldName=OrmUtils::getFirstKey($annotationArray["className"]);
97 1
			$fkFieldName=$fieldAnnot[0];
98 1
			$this->fkFieldsToAdd[]=$fkFieldName;
99 1
			$this->fkFieldTypesToAdd[$fkFieldName]=OrmUtils::getFieldType($annotationArray["className"], $referencesFieldName);
100 1
			$generator->addForeignKey($tableName, $fkFieldName, $referencesTableName, $referencesFieldName);
101
		}
102 1
	}
103
104 1
	protected function generateForeignKeys(DbGenerator $generator,$manyToOnes,$tableName){
105 1
		foreach ($manyToOnes as $member){
106 1
			$this->generateForeignKey($generator, $tableName, $member);
107
		}
108 1
	}
109
}
110