Passed
Push — master ( 2593c3...f8cd8a )
by Jean-Christophe
11:08
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 3
Bugs 0 Features 0
Metric Value
eloc 13
c 3
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 17
	protected static function getClass_($instance) {
45 17
		if (\is_object ( $instance )) {
46 16
			return get_class ( $instance );
47
		}
48 1
		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 12
	protected static function getFirstKeyValue_($instance) {
66 12
		if (\is_object ( $instance )) {
67 11
			return OrmUtils::getFirstKeyValue ( $instance );
68
		}
69 1
		return $instance [1];
70
	}
71
72 50
	protected static function _getOne(Database $db, $className, ConditionParser $conditionParser, $included, $useCache) {
73 50
		$conditionParser->limitOne ();
74 50
		$included = self::_getIncludedForStep ( $included );
75 50
		$object = $invertedJoinColumns = $oneToManyFields = $manyToManyFields = null;
76
77 50
		$metaDatas = OrmUtils::getModelMetadata ( $className );
78 50
		$tableName = $metaDatas ['#tableName'];
79 50
		$hasIncluded = $included || (\is_array ( $included ) && \count ( $included ) > 0);
80 50
		if ($hasIncluded) {
81 33
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
82
		}
83 50
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
84 50
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache, true );
85 50
		if ($query) {
86 50
			$oneToManyQueries =	$manyToOneQueries = $manyToManyParsers = [ ];
87 50
			$object = self::_loadObjectFromRow ( $db, $query, $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $metaDatas ['#memberNames'] ?? null, $metaDatas ['#accessors'], $transformers );
88 50
			if ($hasIncluded) {
89 33
				self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, [ $object ], $included, $useCache );
90
			}
91 50
			EventsManager::trigger ( DAOEvents::GET_ONE, $object, $className );
92
		}
93 50
		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 77
	protected static function _getAll(Database $db, $className, ConditionParser $conditionParser, $included = true, $useCache = NULL) {
106 77
		$included = self::_getIncludedForStep ( $included );
107 77
		$objects = [];
108 77
		$invertedJoinColumns =$oneToManyFields = $manyToManyFields = null;
109
110 77
		$metaDatas = OrmUtils::getModelMetadata ( $className );
111 77
		$tableName = $metaDatas ['#tableName'];
112 77
		if ($hasIncluded = ($included || (\is_array ( $included ) && \count ( $included ) > 0))) {
113 31
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
114
		}
115 77
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
116 77
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache );
117
118 77
		$oneToManyQueries = $manyToOneQueries = $manyToManyParsers = [ ];
119
120 77
		$propsKeys = OrmUtils::getPropKeys ( $className );
121 77
		foreach ( $query as $row ) {
122 77
			$object = self::_loadObjectFromRow ( $db, $row, $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $metaDatas ['#memberNames'] ?? null, $metaDatas ['#accessors'], $transformers );
123 77
			$objects [OrmUtils::getPropKeyValues ( $object, $propsKeys )] = $object;
124
		}
125 77
		if ($hasIncluded) {
126 31
			self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache );
127
		}
128 77
		EventsManager::trigger ( DAOEvents::GET_ALL, $objects, $className );
129 77
		return $objects;
130
	}
131
132 122
	public static function _getFieldList($tableName, $metaDatas) {
133 122
		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 86
	public static function _loadObjectFromRow(Database $db, $row, $className, $invertedJoinColumns, &$manyToOneQueries, $oneToManyFields, $manyToManyFields, &$oneToManyQueries, &$manyToManyParsers, $memberNames, $accessors, $transformers) {
153 86
		$o = new $className ();
154 86
		if (self::$useTransformers) {
155 8
			self::applyTransformers ( $transformers, $row, $memberNames );
156
		}
157 86
		foreach ( $row as $k => $v ) {
158 86
			if ($accesseur = ($accessors [$k] ?? false)) {
159 86
				$o->$accesseur ( $v );
160
			}
161 86
			$o->_rest [$memberNames [$k] ?? $k] = $v;
162 86
			if (isset ( $invertedJoinColumns ) && isset ( $invertedJoinColumns [$k] )) {
163 25
				$fk = '_' . $k;
164 25
				$o->$fk = $v;
165 25
				self::prepareManyToOne ( $manyToOneQueries, $o, $v, $fk, $invertedJoinColumns [$k] );
166
			}
167
		}
168 86
		self::loadManys ( $o, $db, $oneToManyFields, $oneToManyQueries, $manyToManyFields, $manyToManyParsers );
169 86
		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 86
	protected static function loadManys($o, $db, $oneToManyFields, &$oneToManyQueries, $manyToManyFields, &$manyToManyParsers) {
202 86
		if (isset ( $oneToManyFields )) {
203 48
			foreach ( $oneToManyFields as $k => $annot ) {
204 44
				self::prepareOneToMany ( $oneToManyQueries, $o, $k, $annot );
205
			}
206
		}
207 86
		if (isset ( $manyToManyFields )) {
208 26
			foreach ( $manyToManyFields as $k => $annot ) {
209 25
				self::prepareManyToMany ( $db, $manyToManyParsers, $o, $k, $annot );
210
			}
211
		}
212 86
	}
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
}