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

DAOCoreTrait::_loadObjectFromRow()   A

Complexity

Conditions 6
Paths 10

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 6

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 13
c 4
b 0
f 0
dl 0
loc 18
ccs 14
cts 14
cp 1
rs 9.2222
cc 6
nc 10
nop 12
crap 6

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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
}