Passed
Push — master ( 213516...f477f5 )
by Jean-Christophe
04:14
created

OrmUtils::getAnnotationInfoMember()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5.0342

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 14
ccs 8
cts 9
cp 0.8889
rs 9.6111
c 0
b 0
f 0
cc 5
nc 5
nop 3
crap 5.0342
1
<?php
2
3
namespace Ubiquity\orm;
4
5
use Ubiquity\orm\parser\Reflexion;
6
use Ubiquity\cache\CacheManager;
7
use Ubiquity\utils\base\UString;
8
use Ubiquity\utils\base\UArray;
9
use Ubiquity\controllers\rest\ResponseFormatter;
10
use Ubiquity\orm\traits\OrmUtilsRelationsTrait;
11
use Ubiquity\orm\traits\OrmUtilsFieldsTrait;
12
13
/**
14
 * Object/relational mapping utilities
15
 * @author jc
16
 * @version 1.0.2
17
 */
18
class OrmUtils {
19
	
20
	use OrmUtilsFieldsTrait,OrmUtilsRelationsTrait;
21
	
22
	private static $modelsMetadatas;
23
24 12
	public static function getModelMetadata($className) {
25 12
		if (!isset(self::$modelsMetadatas[$className])) {
26 4
			self::$modelsMetadatas[$className]=CacheManager::getOrmModelCache($className);
27
		}
28 12
		return self::$modelsMetadatas[$className];
29
	}
30
31 1
	public static function isSerializable($class, $member) {
32 1
		return !self::_is($class, $member, "#notSerializable");
33
	}
34
35
	public static function isNullable($class, $member) {
36
		return self::_is($class, $member, "#nullable");
37
	}
38
	
39 1
	protected static function _is($class,$member,$like){
40 1
		$ret=self::getAnnotationInfo($class, $like);
41 1
		if ($ret !== false){
42 1
			return \array_search($member, $ret) !== false;
43
		}
44
		return false;
45
	}
46
47 1
	public static function getFieldName($class, $member) {
48 1
		$ret=self::getAnnotationInfo($class, "#fieldNames");
49 1
		if ($ret === false || !isset($ret[$member])){
50
			return $member;
51
		}
52 1
		return $ret[$member];
53
	}
54
55 11
	public static function getTableName($class) {
56 11
		if(isset(self::getModelMetadata($class)["#tableName"]))
57 11
		return self::getModelMetadata($class)["#tableName"];
58
	}
59
	
60 1
	public static function getKeyFieldsAndValues($instance) {
61 1
		$class=get_class($instance);
62 1
		$kf=self::getAnnotationInfo($class, "#primaryKeys");
63 1
		return self::getFieldsAndValues_($instance, $kf);
64
	}
65
	
66 1
	public static function getFieldsAndValues_($instance,$members) {
67 1
		$ret=[];
68 1
		foreach ($members as $member){
69 1
			$v=Reflexion::getMemberValue($instance, $member);
70 1
			$ret[$member]=$v;
71
		}
72 1
		return $ret;
73
	}
74
	
75
	public static function getKeyPropsAndValues_($instance,$props) {
76
		$ret=[];
77
		foreach ($props as $prop){
78
			$v=Reflexion::getPropValue($instance, $prop);
79
			$ret[$prop->getName()]=$v;
80
		}
81
		return $ret;
82
	}
83
	
84
	public static function getMembers($className) {
85
		$fieldNames=self::getAnnotationInfo($className, "#fieldNames");
86
		if ($fieldNames !== false)
87
			return \array_keys($fieldNames);
88
		return [ ];
89
	}
90
91
	public static function getMembersAndValues($instance, $members=NULL) {
92
		$ret=array ();
93
		$className=get_class($instance);
94
		if (is_null($members))
95
			$members=self::getMembers($className);
96
		foreach ( $members as $member ) {
97
			if (self::isSerializable($className, $member)) {
98
				$v=Reflexion::getMemberValue($instance, $member);
99
				if (self::isNotNullOrNullAccepted($v, $className, $member)) {
100
					$name=self::getFieldName($className, $member);
101
					$ret[$name]=$v;
102
				}
103
			}
104
		}
105
		return $ret;
106
	}
107
108 1
	public static function isNotNullOrNullAccepted($v, $className, $member) {
109 1
		$notNull=UString::isNotNull($v);
110 1
		return ($notNull) || (!$notNull && self::isNullable($className, $member));
111
	}
112
113 7
	public static function getFirstKeyValue($instance) {
114 7
		$prop=OrmUtils::getFirstPropKey(get_class($instance));
115 7
		return Reflexion::getPropValue($instance, $prop);
116
	}
117
	
118
	public static function getFirstKeyValue_($instance,$members) {
119
		$fkv=self::getFieldsAndValues_($instance,$members);
120
		return \current($fkv);
121
	}
122
	
123
	public static function getKeyValues($instance) {
124
		$fkv=self::getKeyFieldsAndValues($instance);
125
		return implode("_",$fkv);
126
	}
127
	
128 10
	public static function getPropKeyValues($instance,$props) {
129 10
		$values=[];
130 10
		foreach ($props as $prop){
131 10
			$values[]=Reflexion::getPropValue($instance, $prop);
132
		}
133 10
		return implode("_",$values);
134
	}
135
136
	public static function getMembersWithAnnotation($class, $annotation) {
137
		if (isset(self::getModelMetadata($class)[$annotation]))
138
			return self::getModelMetadata($class)[$annotation];
139
		return [ ];
140
	}
141
142
	/**
143
	 *
144
	 * @param object $instance
145
	 * @param string $memberKey
146
	 * @param array $array
147
	 * @return boolean
148
	 */
149
	public static function exists($instance, $memberKey, $array) {
150
		$accessor="get" . ucfirst($memberKey);
151
		if (method_exists($instance, $accessor)) {
152
			foreach ( $array as $value ) {
153
				if ($value->$accessor() == $instance->$accessor())
154
					return true;
155
			}
156
		}
157
		return false;
158
	}
159
160 10
	public static function getAnnotationInfo($class, $keyAnnotation) {
161 10
		$metas=self::getModelMetadata($class);
162 10
		if (isset($metas[$keyAnnotation]))
163 10
			return $metas[$keyAnnotation];
164 2
		return false;
165
	}
166
167 8
	public static function getAnnotationInfoMember($class, $keyAnnotation, $member) {
168 8
		$info=self::getAnnotationInfo($class, $keyAnnotation);
169 8
		if ($info !== false) {
170 8
			if(UArray::isAssociative($info)){
171 8
				if (isset($info[$member])) {
172 8
					return $info[$member];
173
				}
174
			}else{
175 1
				if(\array_search($member, $info)!==false){
176 1
					return $member;
177
				}
178
			}
179
		}
180
		return false;
181
	}
182
183 2
	public static function setFieldToMemberNames(&$fields,$relFields){
184 2
		foreach ($fields as $index=>$field){
185 2
			if(isset($relFields[$field])){
186 1
				$fields[$index]=$relFields[$field];
187
			}
188
		}
189 2
	}
190
191 1
	public static function objectAsJSON($instance){
192 1
		$formatter=new ResponseFormatter();
193 1
		$datas=$formatter->cleanRestObject($instance);
194 1
		return $formatter->format(["pk"=>self::getFirstKeyValue($instance),"object"=>$datas]);
195
	}
196
}
197