Passed
Push — master ( b9acc3...1dafdc )
by Jean-Christophe
03:25
created

DAOCoreTrait::loadObjectFromRow()   B

Complexity

Conditions 11
Paths 36

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 11

Importance

Changes 0
Metric Value
eloc 21
dl 0
loc 30
ccs 22
cts 22
cp 1
rs 7.3166
c 0
b 0
f 0
cc 11
nc 36
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\orm\OrmUtils;
6
use Ubiquity\log\Logger;
7
use Ubiquity\events\EventsManager;
8
use Ubiquity\orm\parser\ConditionParser;
9
use Ubiquity\db\SqlUtils;
10
use Ubiquity\orm\parser\Reflexion;
11
12
/**
13
 * @author jc
14
 * @property \Ubiquity\db\Database $db
15
 *
16
 */
17
trait DAOCoreTrait {
18
	abstract protected static function _affectsRelationObjects($className,$classPropKey,$manyToOneQueries,$oneToManyQueries,$manyToManyParsers,$objects,$included,$useCache);
19
	abstract protected static function prepareManyToMany(&$ret,$instance, $member, $annot=null);
20
	abstract protected static function prepareManyToOne(&$ret, $instance,$value, $fkField,$annotationArray);
21
	abstract protected static function prepareOneToMany(&$ret,$instance, $member, $annot=null);
22
	abstract protected static function _initRelationFields($included,$metaDatas,&$invertedJoinColumns,&$oneToManyFields,&$manyToManyFields);
23
	abstract protected static function getIncludedForStep($included);
24
	
25
	private static function _getOneToManyFromArray(&$ret, $array, $fkv, $elementAccessor,$prop) {
26
		foreach ( $array as $element ) {
27
			$elementRef=$element->$elementAccessor();
28
			if (($elementRef == $fkv) || (is_object($elementRef) && Reflexion::getPropValue($elementRef,$prop) == $fkv)){
29
				$ret[]=$element;
30
			}
31
		}
32
	}
33
	
34
/*	private static function _getOneToManyFromArray($array, $fkv, $mappedBy,$prop) {
35
		$elementAccessor="get" . ucfirst($mappedBy);
36
		return array_filter($array,function($element) use($elementAccessor,$fkv,$prop){
37
			$elementRef=$element->$elementAccessor();
38
			return ($elementRef == $fkv) || (is_object($elementRef) && Reflexion::getPropValue($elementRef,$prop) == $fkv);
39
		});
40
	}
41
	*/
42
	private static function getManyToManyFromArray($instance, $array, $class, $parser) {
43
		$ret=[];
44
		$continue=true;
45
		$accessorToMember="get" . ucfirst($parser->getInversedBy());
46
		$myPkAccessor="get" . ucfirst($parser->getMyPk());
47
		
48
		if (!method_exists($instance, $myPkAccessor)) {
49
			Logger::warn("DAO", "L'accesseur au membre clé primaire " . $myPkAccessor . " est manquant pour " . $class,"ManyToMany");
50
		}
51
		if (sizeof($array) > 0){
52
			$continue=method_exists(current($array), $accessorToMember);
53
		}
54
		if ($continue) {
55
			foreach ( $array as $targetEntityInstance ) {
56
				$instances=$targetEntityInstance->$accessorToMember();
57
				if (is_array($instances)) {
58
					foreach ( $instances as $inst ) {
59
						if ($inst->$myPkAccessor() == $instance->$myPkAccessor())
60
							array_push($ret, $targetEntityInstance);
61
					}
62
				}
63
			}
64
		} else {
65
			Logger::warn("DAO", "L'accesseur au membre " . $parser->getInversedBy() . " est manquant pour " . $parser->getTargetEntity(),"ManyToMany");
66
		}
67
		return $ret;
68
	}
69
	
70 6
	protected static function _getOne($className,ConditionParser $conditionParser,$included,$useCache){
71 6
		$conditionParser->limitOne();
72 6
		$retour=self::_getAll($className, $conditionParser, $included,$useCache);
73 6
		if (sizeof($retour) < 1){
74
			return null;
75
		}
76 6
		$result= \current($retour);
77 6
		EventsManager::trigger("dao.getone", $result,$className);
78 6
		return $result;
79
	}
80
	
81
	
82
	/**
83
	 * @param string $className
84
	 * @param ConditionParser $conditionParser
85
	 * @param boolean|array $included
86
	 * @param boolean|null $useCache
87
	 * @return array
88
	 */
89 9
	protected static function _getAll($className, ConditionParser $conditionParser, $included=true,$useCache=NULL) {
90 9
		$included=self::getIncludedForStep($included);
91 9
		$objects=array ();
92 9
		$invertedJoinColumns=null;
93 9
		$oneToManyFields=null;
94 9
		$manyToManyFields=null;
95
		
96 9
		$metaDatas=OrmUtils::getModelMetadata($className);
97 9
		$tableName=$metaDatas["#tableName"];
98 9
		$hasIncluded=$included || (is_array($included) && sizeof($included)>0);
99 9
		if($hasIncluded){
100 6
			self::_initRelationFields($included, $metaDatas, $invertedJoinColumns, $oneToManyFields, $manyToManyFields);
101
		}
102 9
		$condition=SqlUtils::checkWhere($conditionParser->getCondition());
103 9
		$members=\array_diff($metaDatas["#fieldNames"],$metaDatas["#notSerializable"]);
104 9
		$query=self::$db->prepareAndExecute($tableName, $condition,$members,$conditionParser->getParams(),$useCache);
105 9
		$oneToManyQueries=[];
106 9
		$manyToOneQueries=[];
107 9
		$manyToManyParsers=[];
108 9
		$propsKeys=OrmUtils::getPropKeys($className);
109 9
		$accessors=OrmUtils::getAccessors($className,$members);
110 9
		$fields=array_flip($members);
111 9
		foreach ( $query as $row ) {
112 9
			$object=self::loadObjectFromRow($row, $className, $invertedJoinColumns, $oneToManyFields,$manyToManyFields, $oneToManyQueries,$manyToOneQueries,$manyToManyParsers,$accessors,$fields);
113 9
			$key=OrmUtils::getPropKeyValues($object,$propsKeys);
114 9
			$objects[$key]=$object;
115
		}
116 9
		if($hasIncluded){
117 6
			$classPropKey=OrmUtils::getFirstPropKey($className);
118 6
			self::_affectsRelationObjects($className,$classPropKey,$manyToOneQueries, $oneToManyQueries, $manyToManyParsers, $objects, $included, $useCache);
119
		}
120 9
		EventsManager::trigger("dao.getall", $objects,$className);
121 9
		return $objects;
122
	}
123
	
124
	
125
	/**
126
	 * @param array $row
127
	 * @param string $className
128
	 * @param array $invertedJoinColumns
129
	 * @param array $oneToManyFields
130
	 * @param array $oneToManyQueries
131
	 * @param array $manyToOneQueries
132
	 * @param array $manyToManyParsers
133
	 * @param array $accessors
134
	 * @param array $fields
135
	 * @return object
136
	 */
137 9
	private static function loadObjectFromRow($row, $className, &$invertedJoinColumns, &$oneToManyFields, &$manyToManyFields,&$oneToManyQueries,&$manyToOneQueries,&$manyToManyParsers,&$accessors,&$fields) {
138 9
		$o=new $className();
139 9
		foreach ( $row as $k => $v ) {
140 9
			if(isset($fields[$k])){
141 9
				if(isset($accessors[$k])){
142 9
					$accesseur=$accessors[$k];
143 9
					$o->$accesseur($v);
144 9
				}elseif(isset($accessors[$fields[$k]])){
145 9
					$accesseur=$accessors[$fields[$k]];
146 9
					$o->$accesseur($v);
147
				}
148
			}
149 9
			$o->_rest[$k]=$v;
150 9
			if (isset($invertedJoinColumns) && isset($invertedJoinColumns[$k])) {
151 6
				$fk="_".$k;
152 6
				$o->$fk=$v;
153 9
				self::prepareManyToOne($manyToOneQueries,$o,$v, $fk,$invertedJoinColumns[$k]);
154
			}
155
		}
156 9
		if (isset($oneToManyFields)) {
157 1
			foreach ( $oneToManyFields as $k => $annot ) {
158 1
				self::prepareOneToMany($oneToManyQueries,$o, $k, $annot);
159
			}
160
		}
161 9
		if (isset($manyToManyFields)) {
162 5
			foreach ( $manyToManyFields as $k => $annot ) {
163 5
				self::prepareManyToMany($manyToManyParsers,$o, $k, $annot);
164
			}
165
		}
166 9
		return $o;
167
	}
168
	
169 1
	private static function parseKey(&$keyValues,$className){
170 1
		if (!is_array($keyValues)) {
171 1
			if (strrpos($keyValues, "=") === false && strrpos($keyValues, ">") === false && strrpos($keyValues, "<") === false) {
172 1
				$keyValues="`" . OrmUtils::getFirstKey($className) . "`='" . $keyValues . "'";
173
			}
174
		}
175 1
	}
176
}
177
178