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

DAOCoreTrait::_getOneToManyFromArray()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
cc 5
eloc 4
nc 3
nop 5
dl 0
loc 5
ccs 0
cts 5
cp 0
crap 30
rs 9.6111
c 0
b 0
f 0
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