Passed
Push — master ( a4d3b7...39c189 )
by Jean-Christophe
10:46
created

OrmUtils::getTransformers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

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