Passed
Push — master ( be71ba...d26f6c )
by Jean-Christophe
03:55
created

OrmUtils::objectAsJSON()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 4
ccs 0
cts 4
cp 0
crap 2
rs 10
c 0
b 0
f 0
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 10
	public static function getModelMetadata($className) {
25 10
		if (!isset(self::$modelsMetadatas[$className])) {
26 3
			self::$modelsMetadatas[$className]=CacheManager::getOrmModelCache($className);
27
		}
28 10
		return self::$modelsMetadatas[$className];
29
	}
30
31
	public static function isSerializable($class, $member) {
32
		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
	protected static function _is($class,$member,$like){
40
		$ret=self::getAnnotationInfo($class, $like);
41
		if ($ret !== false){
42
			return \array_search($member, $ret) !== false;
43
		}
44
		return false;
45
	}
46
47
	public static function getFieldName($class, $member) {
48
		$ret=self::getAnnotationInfo($class, "#fieldNames");
49
		if ($ret === false || !isset($ret[$member])){
50
			return $member;
51
		}
52
		return $ret[$member];
53
	}
54
55 9
	public static function getTableName($class) {
56 9
		if(isset(self::getModelMetadata($class)["#tableName"]))
57 9
		return self::getModelMetadata($class)["#tableName"];
58
	}
59
	
60
	public static function getKeyFieldsAndValues($instance) {
61
		$class=get_class($instance);
62
		$kf=self::getAnnotationInfo($class, "#primaryKeys");
63
		return self::getFieldsAndValues_($instance, $kf);
64
	}
65
	
66
	public static function getFieldsAndValues_($instance,$members) {
67
		$ret=[];
68
		foreach ($members as $member){
69
			$v=Reflexion::getMemberValue($instance, $member);
70
			$ret[$member]=$v;
71
		}
72
		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
	public static function isNotNullOrNullAccepted($v, $className, $member) {
109
		$notNull=UString::isNotNull($v);
110
		return ($notNull) || (!$notNull && self::isNullable($className, $member));
111
	}
112
113 1
	public static function getFirstKeyValue($instance) {
114 1
		$prop=OrmUtils::getFirstPropKey(get_class($instance));
115 1
		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 8
	public static function getPropKeyValues($instance,$props) {
129 8
		$values=[];
130 8
		foreach ($props as $prop){
131 8
			$values[]=Reflexion::getPropValue($instance, $prop);
132
		}
133 8
		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 8
	public static function getAnnotationInfo($class, $keyAnnotation) {
161 8
		$metas=self::getModelMetadata($class);
162 8
		if (isset($metas[$keyAnnotation]))
163 8
			return $metas[$keyAnnotation];
164 1
		return false;
165
	}
166
167 6
	public static function getAnnotationInfoMember($class, $keyAnnotation, $member) {
168 6
		$info=self::getAnnotationInfo($class, $keyAnnotation);
169 6
		if ($info !== false) {
170 6
			if(UArray::isAssociative($info)){
171 6
				if (isset($info[$member])) {
172 6
					return $info[$member];
173
				}
174
			}else{
175 1
				if(\array_search($member, $info)!==false){
176 1
					return $member;
177
				}
178
			}
179
		}
180 4
		return false;
181
	}
182
183 1
	public static function setFieldToMemberNames(&$fields,$relFields){
184 1
		foreach ($fields as $index=>$field){
185 1
			if(isset($relFields[$field])){
186 1
				$fields[$index]=$relFields[$field];
187
			}
188
		}
189 1
	}
190
191
	public static function objectAsJSON($instance){
192
		$formatter=new ResponseFormatter();
193
		$datas=$formatter->cleanRestObject($instance);
194
		return $formatter->format(["pk"=>self::getFirstKeyValue($instance),"object"=>$datas]);
195
	}
196
}
197