Passed
Push — master ( 692e25...3de2b2 )
by Jean-Christophe
01:30
created

_affectsObjectsFromArray()   B

Complexity

Conditions 7
Paths 17

Size

Total Lines 19
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 16
nc 17
nop 5
dl 0
loc 19
rs 8.8333
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\orm\parser\Reflexion;
8
9
trait DAORelationsAssignmentsTrait {
10
	protected static function setToMember($member, $instance, $value, $accessor) {
11
		$instance->$accessor($value);
12
		$instance->_rest[$member]=$value;
13
	}
14
	
15
	protected static function getAccessor($member, $instance,$part) {
16
		$accessor="set" . ucfirst($member);
17
		if (method_exists($instance, $accessor)) {
18
			return $accessor;
19
		}
20
		$class=get_class($instance);
21
		Logger::warn("DAO", "Missing modifier " . $accessor . " in " . $class,$part);
22
		return false;
23
	}
24
	
25
	protected static function _affectsRelationObjects($className,$manyToOneQueries,$oneToManyQueries,$manyToManyParsers,$objects,$included,$useCache){
26
		if(\sizeof($manyToOneQueries)>0){
27
			self::_affectsObjectsFromArray($manyToOneQueries,$included, function($object,$member,$manyToOneObjects,$fkField,$accessor){
28
				self::affectsManyToOneFromArray($object,$member,$manyToOneObjects,$fkField,$accessor);
29
			},'getManyToOne');
30
		}
31
		if(\sizeof($oneToManyQueries)>0){
32
			$classPropKey=OrmUtils::getFirstPropKey($className);
33
			self::_affectsObjectsFromArray($oneToManyQueries,$included, function($object,$member,$relationObjects,$fkField,$accessor,$class,$prop) use ($classPropKey){
34
				self::affectsOneToManyFromArray($object,$member,$relationObjects,$fkField,$accessor,$class,$prop,$classPropKey);
35
			},'getOneToMany');
36
		}
37
		if(\sizeof($manyToManyParsers)>0){
38
			self::_affectsManyToManyObjectsFromArray($className,$manyToManyParsers, $objects,$included,$useCache);
39
		}
40
	}
41
	
42
	private static function affectsManyToOneFromArray($object,$member,$manyToOneObjects,$fkField,$accessor){
43
		if(isset($object->$fkField)){
44
			$value=$manyToOneObjects[$object->$fkField];
45
			self::setToMember($member, $object, $value, $accessor);
46
		}
47
	}
48
	
49
	/**
50
	 * @param object $instance
51
	 * @param string $member
52
	 * @param array $array
53
	 * @param string $mappedBy
54
	 * @param string $class
55
	 * @param \ReflectionProperty $prop
56
	 */
57
	private static function affectsOneToManyFromArray($instance, $member, $array=null, $mappedBy=null,$accessor="",$class="",$prop=null,$classPropKey=null) {
58
		$ret=array ();
59
		if (!isset($mappedBy)){
60
			$annot=OrmUtils::getAnnotationInfoMember($class, "#oneToMany", $member);
61
			$mappedBy=$annot["mappedBy"];
62
		}
63
		if ($mappedBy !== false) {
64
			$fkv=Reflexion::getPropValue($instance,$classPropKey);
65
			self::_getOneToManyFromArray($ret, $array, $fkv, $mappedBy,$prop);
66
			self::setToMember($member, $instance, $ret, $accessor);
67
		}
68
		return $ret;
69
	}
70
	
71
	private static function _affectsObjectsFromArray($queries,$included,$affectsCallback,$part,$useCache=NULL){
72
		$includedNext=false;
73
		foreach ($queries as $key=>$pendingRelationsRequest){
74
			list($class,$member,$fkField)=\explode("|", $key);
75
			if(is_array($included)){
76
				$includedNext=self::_getIncludedNext($included, $member);
77
			}
78
			$objectsParsers=$pendingRelationsRequest->getObjectsConditionParsers();
79
			$prop=null;
80
			if('getOneToMany'===$part){
81
				$prop=OrmUtils::getFirstPropKey($class);
82
			}
83
			foreach ($objectsParsers as $objectsConditionParser){
84
				$objectsConditionParser->compileParts();
85
				$relationObjects=self::_getAll($class,$objectsConditionParser->getConditionParser(),$includedNext,$useCache);
86
				$objects=$objectsConditionParser->getObjects();
87
				if($accessor=self::getAccessor($member, current($objects), $part)){
88
					foreach ($objects as $object){
89
						$affectsCallback($object, $member,$relationObjects,$fkField,$accessor,$class,$prop);
90
					}
91
				}
92
			}
93
		}
94
	}
95
	
96
	private static function _affectsManyToManyObjectsFromArray($objectsClass,$parsers,$objects,$included,$useCache=NULL){
97
		$includedNext=false;
98
		$prop=OrmUtils::getFirstPropKey($objectsClass);
99
		foreach ($parsers as $key=>$parser){
100
			list($class,$member)=\explode("|", $key);
101
			if(is_array($included)){
102
				$includedNext=self::_getIncludedNext($included, $member);
103
			}
104
			$myPkValues=[];
105
			$cParser=self::generateManyToManyParser($parser, $myPkValues);
106
			$relationObjects=self::_getAll($class,$cParser,$includedNext,$useCache);
107
			if($accessor=self::getAccessor($member, current($objects), 'getManyToMany')){
108
				foreach ($objects as $object){
109
					$pkV=Reflexion::getPropValue($object, $prop);
110
					if(isset($myPkValues[$pkV])){
111
						$ret=self::getManyToManyFromArrayIds($class,$relationObjects, $myPkValues[$pkV]);
112
						self::setToMember($member, $object, $ret, $accessor);
113
					}
114
				}
115
			}
116
		}
117
	}
118
}
119
120