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

DAOCoreTrait::_getOne()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
nc 2
cc 2
nop 4
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