Passed
Push — master ( 5a27b6...d7396e )
by Jean-Christophe
02:39
created

ModelParser::parse()   B

Complexity

Conditions 6
Paths 18

Size

Total Lines 27
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 25
nc 18
nop 1
dl 0
loc 27
rs 8.8977
c 0
b 0
f 0
1
<?php
2
3
namespace Ubiquity\orm\parser;
4
5
use Ubiquity\utils\base\UArray;
6
7
class ModelParser {
8
	protected $global;
9
	protected $primaryKeys;
10
	protected $manytoOneMembers;
11
	protected $oneToManyMembers;
12
	protected $manyToManyMembers;
13
	protected $joinColumnMembers;
14
	protected $joinTableMembers;
15
	protected $nullableMembers=[ ];
16
	protected $notSerializableMembers=[ ];
17
	protected $fieldNames;
18
	protected $fieldTypes=[];
19
	protected $yuml;
20
21
	public function parse($modelClass) {
22
		$instance=new $modelClass();
23
		$this->primaryKeys=Reflexion::getKeyFields($instance);
24
		$this->oneToManyMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@oneToMany");
25
		$this->manytoOneMembers=Reflexion::getMembersNameWithAnnotation($modelClass, "@manyToOne");
26
		$this->manyToManyMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@manyToMany");
27
		$this->joinColumnMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@joinColumn");
28
		$this->joinTableMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@joinTable");
29
		$yuml=Reflexion::getAnnotationClass($modelClass, "@yuml");
30
		if(\sizeof($yuml)>0)
31
			$this->yuml=$yuml[0];
32
		$properties=Reflexion::getProperties($instance);
33
		foreach ( $properties as $property ) {
34
			$propName=$property->getName();
35
			$this->fieldNames[$propName]=Reflexion::getFieldName($modelClass, $propName);
36
			$nullable=Reflexion::isNullable($modelClass, $propName);
37
			$serializable=Reflexion::isSerializable($modelClass, $propName);
38
			if ($nullable)
39
				$this->nullableMembers[]=$propName;
40
			if (!$serializable)
41
				$this->notSerializableMembers[]=$propName;
42
			$type=Reflexion::getDbType($modelClass, $propName);
43
			if($type===false)
44
				$type="mixed";
45
			$this->fieldTypes[$propName]=$type;
46
		}
47
		$this->global["#tableName"]=Reflexion::getTableName($modelClass);
48
	}
49
50
	public function __toString() {
51
		$result=$this->global;
52
		$result["#primaryKeys"]=$this->primaryKeys;
53
		$result["#manyToOne"]=$this->manytoOneMembers;
54
		$result["#fieldNames"]=$this->fieldNames;
55
		$result["#fieldTypes"]=$this->fieldTypes;
56
		$result["#nullable"]=$this->nullableMembers;
57
		$result["#notSerializable"]=$this->notSerializableMembers;
58
		if(isset($this->yuml))
59
			$result["#yuml"]=$this->yuml->getPropertiesAndValues();
60
		foreach ( $this->oneToManyMembers as $member => $annotation ) {
61
			$result["#oneToMany"][$member]=$annotation->getPropertiesAndValues();
62
		}
63
		foreach ( $this->manyToManyMembers as $member => $annotation ) {
64
			$result["#manyToMany"][$member]=$annotation->getPropertiesAndValues();
65
		}
66
67
		foreach ( $this->joinTableMembers as $member => $annotation ) {
68
			$result["#joinTable"][$member]=$annotation->getPropertiesAndValues();
69
		}
70
71
		foreach ( $this->joinColumnMembers as $member => $annotation ) {
72
			$result["#joinColumn"][$member]=$annotation->getPropertiesAndValues();
73
			$result["#invertedJoinColumn"][$annotation->name]=[ "member" => $member,"className" =>$annotation->className ];
74
		}
75
		return "return " . UArray::asPhpArray($result, "array") . ";";
76
	}
77
}
78