Passed
Push — master ( 5bce84...50f645 )
by Jean-Christophe
16:11
created

DAOCoreTrait::_getOne()   A

Complexity

Conditions 6
Paths 18

Size

Total Lines 22
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 6

Importance

Changes 2
Bugs 1 Features 0
Metric Value
eloc 17
c 2
b 1
f 0
dl 0
loc 22
ccs 18
cts 18
cp 1
rs 9.0777
cc 6
nc 18
nop 5
crap 6
1
<?php
2
3
namespace Ubiquity\orm\traits;
4
5
use Ubiquity\db\SqlUtils;
6
use Ubiquity\events\DAOEvents;
7
use Ubiquity\events\EventsManager;
8
use Ubiquity\orm\OrmUtils;
9
use Ubiquity\orm\parser\ConditionParser;
10
use Ubiquity\orm\parser\Reflexion;
11
use Ubiquity\db\Database;
12
13
/**
14
 * Core Trait for DAO class.
15
 * Ubiquity\orm\traits$DAOCoreTrait
16
 * This class is part of Ubiquity
17
 *
18
 * @author jcheron <[email protected]>
19
 * @version 1.1.5
20
 *
21
 * @property array $db
22
 * @property boolean $useTransformers
23
 * @property string $transformerOp
24
 *
25
 */
26
trait DAOCoreTrait {
27
	protected static $accessors = [ ];
28
	protected static $fields = [ ];
29
30
	abstract public static function _affectsRelationObjects($className, $classPropKey, $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache): void;
31
32
	abstract protected static function prepareManyToMany($db, &$ret, $instance, $member, $annot = null);
33
34
	abstract protected static function prepareManyToOne(&$ret, $instance, $value, $fkField, $annotationArray);
35
36
	abstract protected static function prepareOneToMany(&$ret, $instance, $member, $annot = null);
37
38
	abstract public static function _initRelationFields($included, $metaDatas, &$invertedJoinColumns, &$oneToManyFields, &$manyToManyFields): void;
39
40
	abstract public static function _getIncludedForStep($included);
41
42
	abstract protected static function getDb($model);
43
44 19
	protected static function getClass_($instance) {
45 19
		if (\is_object ( $instance )) {
46 16
			return get_class ( $instance );
47
		}
48 3
		return $instance [0];
49
	}
50
51
	protected static function getInstance_($instance) {
52
		if (\is_object ( $instance )) {
53
			return $instance;
54
		}
55
		return $instance [0];
56
	}
57
58
	protected static function getValue_($instance, $member) {
59
		if (\is_object ( $instance )) {
60
			return Reflexion::getMemberValue ( $instance, $member );
61
		}
62
		return $instance [1];
63
	}
64
65 13
	protected static function getFirstKeyValue_($instance) {
66 13
		if (\is_object ( $instance )) {
67 11
			return OrmUtils::getFirstKeyValue ( $instance );
68
		}
69 2
		return $instance [1];
70
	}
71
72 51
	protected static function _getOne(Database $db, $className, ConditionParser $conditionParser, $included, $useCache) {
73 51
		$conditionParser->limitOne ();
74 51
		$included = self::_getIncludedForStep ( $included );
75 51
		$object = $invertedJoinColumns = $oneToManyFields = $manyToManyFields = null;
76
77 51
		$metaDatas = OrmUtils::getModelMetadata ( $className );
78 51
		$tableName = $metaDatas ['#tableName'];
79 51
		$hasIncluded = $included || (\is_array ( $included ) && \count ( $included ) > 0);
80 51
		if ($hasIncluded) {
81 35
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
82
		}
83 51
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
84 51
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache, true );
85 51
		if ($query) {
86 51
			$oneToManyQueries =	$manyToOneQueries = $manyToManyParsers = [ ];
87 51
			$object = self::_loadObjectFromRow ( $db, $query, $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $metaDatas ['#memberNames'] ?? null, $metaDatas ['#accessors'], $transformers );
88 51
			if ($hasIncluded) {
89 35
				self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, [ $object ], $included, $useCache );
90
			}
91 51
			EventsManager::trigger ( DAOEvents::GET_ONE, $object, $className );
92
		}
93 51
		return $object;
94
	}
95
96
	/**
97
	 *
98
	 * @param Database $db
99
	 * @param string $className
100
	 * @param ConditionParser $conditionParser
101
	 * @param boolean|array $included
102
	 * @param boolean|null $useCache
103
	 * @return array
104
	 */
105 80
	protected static function _getAll(Database $db, $className, ConditionParser $conditionParser, $included = true, $useCache = NULL) {
106 80
		$included = self::_getIncludedForStep ( $included );
107 80
		$objects = [];
108 80
		$invertedJoinColumns =$oneToManyFields = $manyToManyFields = null;
109
110 80
		$metaDatas = OrmUtils::getModelMetadata ( $className );
111 80
		$tableName = $metaDatas ['#tableName'];
112 80
		if ($hasIncluded = ($included || (\is_array ( $included ) && \count ( $included ) > 0))) {
113 38
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
114
		}
115 80
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
116 80
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache );
117
118 80
		$oneToManyQueries = $manyToOneQueries = $manyToManyParsers = [ ];
119
120 80
		$propsKeys = OrmUtils::getPropKeys ( $className );
121 80
		foreach ( $query as $row ) {
122 80
			$object = self::_loadObjectFromRow ( $db, $row, $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $metaDatas ['#memberNames'] ?? null, $metaDatas ['#accessors'], $transformers );
123 80
			$objects [OrmUtils::getPropKeyValues ( $object, $propsKeys )] = $object;
124
		}
125 80
		if ($hasIncluded) {
126 38
			self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache );
127
		}
128 80
		EventsManager::trigger ( DAOEvents::GET_ALL, $objects, $className );
129 80
		return $objects;
130
	}
131
132 124
	public static function _getFieldList($tableName, $metaDatas) {
133 124
		return self::$fields [$tableName] ??= SqlUtils::getFieldList ( \array_diff ( $metaDatas ['#fieldNames'], $metaDatas ['#notSerializable'] ), $tableName );
134
	}
135
136
	/**
137
	 *
138
	 * @param Database $db
139
	 * @param array $row
140
	 * @param string $className
141
	 * @param array $invertedJoinColumns
142
	 * @param array $manyToOneQueries
143
	 * @param array $oneToManyFields
144
	 * @param array $manyToManyFields
145
	 * @param array $oneToManyQueries
146
	 * @param array $manyToManyParsers
147
	 * @param array $memberNames
148
	 * @param array $accessors
149
	 * @param array $transformers
150
	 * @return object
151
	 */
152 88
	public static function _loadObjectFromRow(Database $db, $row, $className, $invertedJoinColumns, &$manyToOneQueries, $oneToManyFields, $manyToManyFields, &$oneToManyQueries, &$manyToManyParsers, $memberNames, $accessors, $transformers) {
153 88
		$o = new $className ();
154 88
		if (self::$useTransformers) {
155 8
			self::applyTransformers ( $transformers, $row, $memberNames );
156
		}
157 88
		foreach ( $row as $k => $v ) {
158 88
			if ($accesseur = ($accessors [$k] ?? false)) {
159 88
				$o->$accesseur ( $v );
160
			}
161 88
			$o->_rest [$memberNames [$k] ?? $k] = $v;
162 88
			if (isset ( $invertedJoinColumns ) && isset ( $invertedJoinColumns [$k] )) {
163 28
				$fk = '_' . $k;
164 28
				$o->$fk = $v;
165 28
				self::prepareManyToOne ( $manyToOneQueries, $o, $v, $fk, $invertedJoinColumns [$k] );
166
			}
167
		}
168 88
		self::loadManys ( $o, $db, $oneToManyFields, $oneToManyQueries, $manyToManyFields, $manyToManyParsers );
169 88
		return $o;
170
	}
171
172
	/**
173
	 *
174
	 * @param Database $db
175
	 * @param array $row
176
	 * @param string $className
177
	 * @param array $memberNames
178
	 * @param array $transformers
179
	 * @return object
180
	 */
181 4
	public static function _loadSimpleObjectFromRow(Database $db, $row, $className, $memberNames, $transformers) {
182 4
		$o = new $className ();
183 4
		if (self::$useTransformers) {
184
			self::applyTransformers ( $transformers, $row, $memberNames );
185
		}
186 4
		foreach ( $row as $k => $v ) {
187 4
			$o->$k = $v;
188 4
			$o->_rest [$memberNames [$k] ?? $k] = $v;
189
		}
190 4
		return $o;
191
	}
192
193 8
	protected static function applyTransformers($transformers, &$row, $memberNames) {
194 8
		foreach ( $transformers as $member => $transformer ) {
195 7
			$field = \array_search ( $member, $memberNames );
196 7
			$transform = self::$transformerOp;
197 7
			$row [$field] = $transformer::{$transform} ( $row [$field] );
198
		}
199 8
	}
200
201 88
	protected static function loadManys($o, $db, $oneToManyFields, &$oneToManyQueries, $manyToManyFields, &$manyToManyParsers) {
202 88
		if (isset ( $oneToManyFields )) {
203 55
			foreach ( $oneToManyFields as $k => $annot ) {
204 51
				self::prepareOneToMany ( $oneToManyQueries, $o, $k, $annot );
205
			}
206
		}
207 88
		if (isset ( $manyToManyFields )) {
208 29
			foreach ( $manyToManyFields as $k => $annot ) {
209 29
				self::prepareManyToMany ( $db, $manyToManyParsers, $o, $k, $annot );
210
			}
211
		}
212 88
	}
213
214 4
	private static function parseKey(&$keyValues, $className, $quote) {
215 4
		if (! \is_array ( $keyValues )) {
216 4
			if (\strrpos ( $keyValues, '=' ) === false && \strrpos ( $keyValues, '>' ) === false && \strrpos ( $keyValues, '<' ) === false) {
217 4
				$keyValues = $quote . OrmUtils::getFirstKey ( $className ) . $quote . "='" . $keyValues . "'";
218
			}
219
		}
220 4
	}
221
222
	public static function storeDbCache(string $model) {
223
		$offset = self::$modelsDatabase [$model] ?? 'default';
224
		if (isset ( self::$db [$offset] )) {
225
			self::$db [$offset]->storeCache ();
226
		}
227
	}
228
}