Passed
Push — master ( 319518...e48b7c )
by Jean-Christophe
09:24 queued 11s
created

OrmUtils::getFirstKeyValue()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

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