Completed
Push — master ( f8de39...2f8dbe )
by Jean-Christophe
01:36
created

DAOCoreTrait::loadObjectFromRow()   B

Complexity

Conditions 11
Paths 20

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 30
rs 7.3166
c 0
b 0
f 0
nc 20
cc 11
nop 9

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