Passed
Push — master ( e1ca0a...c1379c )
by Jean-Christophe
04:54
created

OrmUtils::getFieldsAndValues_()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 7
ccs 6
cts 6
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 2
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 21
	public static function getModelMetadata($className) {
25 21
		if (!isset(self::$modelsMetadatas[$className])) {
26 8
			self::$modelsMetadatas[$className]=CacheManager::getOrmModelCache($className);
27
		}
28 21
		return self::$modelsMetadatas[$className];
29
	}
30
31 3
	public static function isSerializable($class, $member) {
32 3
		return !self::_is($class, $member, "#notSerializable");
33
	}
34
35 2
	public static function isNullable($class, $member) {
36 2
		return self::_is($class, $member, "#nullable");
37
	}
38
	
39 3
	protected static function _is($class,$member,$like){
40 3
		$ret=self::getAnnotationInfo($class, $like);
41 3
		if ($ret !== false){
42 3
			return \array_search($member, $ret) !== false;
43
		}
44
		return false;
45
	}
46
47 3
	public static function getFieldName($class, $member) {
48 3
		$ret=self::getAnnotationInfo($class, "#fieldNames");
49 3
		if ($ret === false || !isset($ret[$member])){
50
			return $member;
51
		}
52 3
		return $ret[$member];
53
	}
54
55 15
	public static function getTableName($class) {
56 15
		if(isset(self::getModelMetadata($class)["#tableName"]))
57 15
		return self::getModelMetadata($class)["#tableName"];
58
	}
59
	
60 3
	public static function getKeyFieldsAndValues($instance) {
61 3
		$class=get_class($instance);
62 3
		$kf=self::getAnnotationInfo($class, "#primaryKeys");
63 3
		return self::getFieldsAndValues_($instance, $kf);
64
	}
65
	
66 3
	public static function getFieldsAndValues_($instance,$members) {
67 3
		$ret=[];
68 3
		foreach ($members as $member){
69 3
			$v=Reflexion::getMemberValue($instance, $member);
70 3
			$ret[$member]=$v;
71
		}
72 3
		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 1
	public static function getMembers($className) {
85 1
		$fieldNames=self::getAnnotationInfo($className, "#fieldNames");
86 1
		if ($fieldNames !== false)
87 1
			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 3
	public static function isNotNullOrNullAccepted($v, $className, $member) {
109 3
		$notNull=UString::isNotNull($v);
110 3
		return ($notNull) || (!$notNull && self::isNullable($className, $member));
111
	}
112
113 11
	public static function getFirstKeyValue($instance) {
114 11
		$prop=OrmUtils::getFirstPropKey(get_class($instance));
115 11
		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 18
	public static function getPropKeyValues($instance,$props) {
129 18
		$values=[];
130 18
		foreach ($props as $prop){
131 18
			$values[]=Reflexion::getPropValue($instance, $prop);
132
		}
133 18
		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 19
	public static function getAnnotationInfo($class, $keyAnnotation) {
161 19
		$metas=self::getModelMetadata($class);
162 19
		if (isset($metas[$keyAnnotation]))
163 19
			return $metas[$keyAnnotation];
164 4
		return false;
165
	}
166
167 12
	public static function getAnnotationInfoMember($class, $keyAnnotation, $member) {
168 12
		$info=self::getAnnotationInfo($class, $keyAnnotation);
169 12
		if ($info !== false) {
170 12
			if(UArray::isAssociative($info)){
171 12
				if (isset($info[$member])) {
172 12
					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 4
	public static function setFieldToMemberNames(&$fields,$relFields){
184 4
		foreach ($fields as $index=>$field){
185 4
			if(isset($relFields[$field])){
186 1
				$fields[$index]=$relFields[$field];
187
			}
188
		}
189 4
	}
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