Test Failed
Pull Request — master (#96)
by Jean-Christophe
13:01
created

DAOCoreTrait::_loadObjectFromRow()   B

Complexity

Conditions 11
Paths 40

Size

Total Lines 31
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 11

Importance

Changes 0
Metric Value
eloc 21
c 0
b 0
f 0
dl 0
loc 31
ccs 22
cts 22
cp 1
rs 7.3166
cc 11
nc 40
nop 10
crap 11

How to fix   Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
use Ubiquity\orm\core\DAOPreparedQuery;
0 ignored issues
show
Bug introduced by
The type Ubiquity\orm\core\DAOPreparedQuery was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
14
/**
15
 * Core Trait for DAO class.
16
 * Ubiquity\orm\traits$DAOCoreTrait
17
 * This class is part of Ubiquity
18
 *
19
 * @author jcheron <[email protected]>
20
 * @version 1.1.1
21
 *
22
 * @property array $db
23
 * @property boolean $useTransformers
24
 * @property string $transformerOp
25
 *
26
 */
27
trait DAOCoreTrait {
28
	protected static $accessors = [ ];
29
	protected static $fields = [ ];
30
31
	abstract public static function _affectsRelationObjects($className, $classPropKey, $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache): void;
32
33
	abstract protected static function prepareManyToMany(&$ret, $instance, $member, $annot = null);
34
35
	abstract protected static function prepareManyToOne(&$ret, $instance, $value, $fkField, $annotationArray);
36
37
	abstract protected static function prepareOneToMany(&$ret, $instance, $member, $annot = null);
38
39
	abstract public static function _initRelationFields($included, $metaDatas, &$invertedJoinColumns, &$oneToManyFields, &$manyToManyFields): void;
40
41
	abstract public static function _getIncludedForStep($included);
42
43
	abstract protected static function getDb($model);
44 16
45 16
	protected static function getClass_($instance) {
46 13
		if (is_object ( $instance )) {
47
			return get_class ( $instance );
48 3
		}
49
		return $instance [0];
50
	}
51
52
	protected static function getInstance_($instance) {
53
		if (\is_object ( $instance )) {
54
			return $instance;
55
		}
56
		return $instance [0];
57
	}
58
59
	protected static function getValue_($instance, $member) {
60
		if (\is_object ( $instance )) {
61
			return Reflexion::getMemberValue ( $instance, $member );
62
		}
63
		return $instance [1];
64
	}
65 11
66 11
	protected static function getFirstKeyValue_($instance) {
67 9
		if (\is_object ( $instance )) {
68
			return OrmUtils::getFirstKeyValue ( $instance );
69 2
		}
70
		return $instance [1];
71
	}
72 39
73 39
	protected static function _getOne(Database $db, $className, ConditionParser $conditionParser, $included, $useCache) {
74 39
		$conditionParser->limitOne ();
75 39
		$included = self::_getIncludedForStep ( $included );
76 39
		$object = null;
77 39
		$invertedJoinColumns = null;
78 39
		$oneToManyFields = null;
79
		$manyToManyFields = null;
80 39
81 39
		$metaDatas = OrmUtils::getModelMetadata ( $className );
82 39
		$tableName = $metaDatas ['#tableName'];
83 39
		$hasIncluded = $included || (\is_array ( $included ) && \sizeof ( $included ) > 0);
84 27
		if ($hasIncluded) {
85
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
86 39
		}
87 39
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
88 39
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache );
89 39
		if ($query && \sizeof ( $query ) > 0) {
90 39
			$oneToManyQueries = [ ];
91 39
			$manyToOneQueries = [ ];
92 39
			$manyToManyParsers = [ ];
93 39
			$accessors = $metaDatas ['#accessors'];
94 39
			$object = self::_loadObjectFromRow ( \current ( $query ), $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $accessors, $transformers );
95 27
			if ($hasIncluded) {
96
				self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, [ $object ], $included, $useCache );
97 39
			}
98
			EventsManager::trigger ( DAOEvents::GET_ONE, $object, $className );
99 39
		}
100
		return $object;
101
	}
102
103
	/**
104
	 *
105
	 * @param Database $db
106
	 * @param string $className
107
	 * @param ConditionParser $conditionParser
108
	 * @param boolean|array $included
109
	 * @param boolean|null $useCache
110
	 * @return array
111 56
	 */
112 56
	protected static function _getAll(Database $db, $className, ConditionParser $conditionParser, $included = true, $useCache = NULL) {
113 56
		$included = self::_getIncludedForStep ( $included );
114 56
		$objects = array ();
115 56
		$invertedJoinColumns = null;
116 56
		$oneToManyFields = null;
117
		$manyToManyFields = null;
118 56
119 56
		$metaDatas = OrmUtils::getModelMetadata ( $className );
120 56
		$tableName = $metaDatas ['#tableName'];
121 56
		if ($hasIncluded = $included || (\is_array ( $included ) && \sizeof ( $included ) > 0)) {
0 ignored issues
show
Comprehensibility introduced by
Consider adding parentheses for clarity. Current Interpretation: $hasIncluded = ($include... sizeof($included) > 0), Probably Intended Meaning: ($hasIncluded = $include...& sizeof($included) > 0
Loading history...
122 24
			self::_initRelationFields ( $included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields );
123
		}
124 56
		$transformers = $metaDatas ['#transformers'] [self::$transformerOp] ?? [ ];
125 56
		$query = $db->prepareAndExecute ( $tableName, SqlUtils::checkWhere ( $conditionParser->getCondition () ), self::_getFieldList ( $tableName, $metaDatas ), $conditionParser->getParams (), $useCache );
126 56
		$oneToManyQueries = [ ];
127 56
		$manyToOneQueries = [ ];
128 56
		$manyToManyParsers = [ ];
129 56
		$propsKeys = OrmUtils::getPropKeys ( $className );
130 56
		$accessors = $metaDatas ['#accessors'];
131 56
		foreach ( $query as $row ) {
132 56
			$object = self::_loadObjectFromRow ( $row, $className, $invertedJoinColumns, $manyToOneQueries, $oneToManyFields, $manyToManyFields, $oneToManyQueries, $manyToManyParsers, $accessors, $transformers );
133 56
			$key = OrmUtils::getPropKeyValues ( $object, $propsKeys );
134 56
			$objects [$key] = $object;
135
		}
136 56
		if ($hasIncluded) {
137 24
			self::_affectsRelationObjects ( $className, OrmUtils::getFirstPropKey ( $className ), $manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache );
138
		}
139 56
		EventsManager::trigger ( DAOEvents::GET_ALL, $objects, $className );
140 56
		return $objects;
141
	}
142
143 62
	public static function _getFieldList($tableName, $metaDatas) {
144 62
		return self::$fields [$tableName] ?? (self::$fields [$tableName] = SqlUtils::getFieldList ( \array_diff ( $metaDatas ['#fieldNames'], $metaDatas ['#notSerializable'] ), $tableName ));
145
	}
146
147
	/**
148
	 *
149
	 * @param array $row
150
	 * @param string $className
151
	 * @param array $invertedJoinColumns
152
	 * @param array $manyToOneQueries
153
	 * @param array $accessors
154
	 * @return object
155
	 */
156 62
	public static function _loadObjectFromRow($row, $className, &$invertedJoinColumns, &$manyToOneQueries, &$oneToManyFields, &$manyToManyFields, &$oneToManyQueries, &$manyToManyParsers, &$accessors, &$transformers) {
157 62
		$o = new $className ();
158 62
		if (self::$useTransformers) {
159 8
			foreach ( $transformers as $field => $transformer ) {
160 4
				$transform = self::$transformerOp;
161 4
				$row [$field] = $transformer::$transform ( $row [$field] );
162
			}
163
		}
164 62
		foreach ( $row as $k => $v ) {
165 62
			if (isset ( $accessors [$k] )) {
166 62
				$accesseur = $accessors [$k];
167 62
				$o->$accesseur ( $v );
168
			}
169 62
			$o->_rest [$k] = $v;
170 62
			if (isset ( $invertedJoinColumns ) && isset ( $invertedJoinColumns [$k] )) {
171 23
				$fk = '_' . $k;
172 23
				$o->$fk = $v;
173 62
				self::prepareManyToOne ( $manyToOneQueries, $o, $v, $fk, $invertedJoinColumns [$k] );
174
			}
175
		}
176 62
		if (isset ( $oneToManyFields )) {
177 40
			foreach ( $oneToManyFields as $k => $annot ) {
178 37
				self::prepareOneToMany ( $oneToManyQueries, $o, $k, $annot );
179
			}
180
		}
181 62
		if (isset ( $manyToManyFields )) {
182 23
			foreach ( $manyToManyFields as $k => $annot ) {
183 23
				self::prepareManyToMany ( $manyToManyParsers, $o, $k, $annot );
184
			}
185
		}
186 62
		return $o;
187
	}
188
189 3
	private static function parseKey(&$keyValues, $className, $quote) {
190 3
		if (! \is_array ( $keyValues )) {
191 3
			if (\strrpos ( $keyValues, '=' ) === false && \strrpos ( $keyValues, '>' ) === false && \strrpos ( $keyValues, '<' ) === false) {
192 3
				$keyValues = $quote . OrmUtils::getFirstKey ( $className ) . $quote . "='" . $keyValues . "'";
193
			}
194
		}
195 3
	}
196
}
197