Test Failed
Push — master ( 968994...3c9b1c )
by Jean-Christophe
06:55 queued 10s
created

OrmUtilsRelationsTrait::getUJoinSQL()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 34
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 7.5412

Importance

Changes 0
Metric Value
eloc 30
dl 0
loc 34
ccs 16
cts 30
cp 0.5333
rs 9.1288
c 0
b 0
f 0
cc 5
nc 12
nop 4
crap 7.5412
1
<?php
2
3
namespace Ubiquity\orm\traits;
4
5
use Ubiquity\orm\parser\ManyToManyParser;
6
7
/**
8
 * Trait for DAO relations.
9
 * Ubiquity\orm\traits$OrmUtilsRelationsTrait
10
 * This class is part of Ubiquity
11
 *
12
 * @author jcheron <[email protected]>
13
 * @version 1.0.2
14
 *
15
 */
16
trait OrmUtilsRelationsTrait {
17
18
	abstract public static function getAnnotationInfoMember($class, $keyAnnotation, $member);
19
20
	abstract public static function getAnnotationInfo($class, $keyAnnotation);
21
22
	abstract public static function getTableName($class);
23
24
	abstract public static function getFirstKey($class);
25
26
	abstract public static function getModelMetadata($className);
27
28
	abstract public static function getKeyFieldsAndValues($instance);
29
30
	public static function getJoinTables($class) {
31
		$result = [ ];
32
33
		if (isset ( self::getModelMetadata ( $class ) ["#joinTable"] )) {
34
			$jts = self::getModelMetadata ( $class ) ["#joinTable"];
35
			foreach ( $jts as $jt ) {
36
				$result [] = $jt ["name"];
37
			}
38
		}
39
		return $result;
40
	}
41
42
	public static function getAllJoinTables($models) {
43
		$result = [ ];
44
		foreach ( $models as $model ) {
45
			$result = array_merge ( $result, self::getJoinTables ( $model ) );
46
		}
47
		return $result;
48
	}
49
50 3
	public static function getFieldsInRelations($class) {
51 3
		$result = [ ];
52
53 3
		if ($manyToOne = self::getAnnotationInfo ( $class, "#manyToOne" )) {
54
			$result = \array_merge ( $result, $manyToOne );
55
		}
56 3
		if ($oneToMany = self::getAnnotationInfo ( $class, "#oneToMany" )) {
57 3
			$result = \array_merge ( $result, \array_keys ( $oneToMany ) );
58
		}
59 3
		if ($manyToMany = self::getAnnotationInfo ( $class, "#manyToMany" )) {
60
			$result = \array_merge ( $result, \array_keys ( $manyToMany ) );
61
		}
62 3
		return $result;
63
	}
64
65 6
	public static function getRelationInfos($class) {
66 6
		$result = [ ];
67 6
		$joinColumns = self::getAnnotationInfo ( $class, "#joinColumn" );
68 6
		$invertedJoinColumns = self::getAnnotationInfo ( $class, "#invertedJoinColumn" );
69 6
		if ($manyToOne = self::getAnnotationInfo ( $class, "#manyToOne" )) {
70 5
			foreach ( $manyToOne as $oneField ) {
71 5
				$field = $joinColumns [$oneField] ['name'];
72 5
				$result [$field] = $invertedJoinColumns [$field];
73 5
				$result [$oneField] = $invertedJoinColumns [$field];
74
			}
75
		}
76 6
		if ($oneToMany = self::getAnnotationInfo ( $class, "#oneToMany" )) {
77 6
			$result = \array_merge ( $result, $oneToMany );
78
		}
79 6
		if ($manyToMany = self::getAnnotationInfo ( $class, "#manyToMany" )) {
80 5
			$result = \array_merge ( $result, $manyToMany );
81
		}
82 6
		return $result;
83
	}
84
85 4
	public static function getFieldsInRelations_($class) {
86 4
		return self::getFieldsInRelationsForUpdate_ ( $class ) ["relations"];
87
	}
88
89 5
	public static function getFieldsInRelationsForUpdate_($class) {
90 5
		$result = [ ];
91 5
		if ($manyToOne = self::getAnnotationInfo ( $class, "#manyToOne" )) {
92 1
			foreach ( $manyToOne as $member ) {
93 1
				$joinColumn = self::getAnnotationInfoMember ( $class, "#joinColumn", $member );
94 1
				$result [$joinColumn ["name"]] = $member;
95
			}
96
		}
97 5
		if ($manyToMany = self::getAnnotationInfo ( $class, "#manyToMany" )) {
98
			$manyToMany = array_keys ( $manyToMany );
99
			foreach ( $manyToMany as $member ) {
100
				$result [$member . "Ids"] = $member;
101
			}
102
		}
103 5
		if ($oneToMany = self::getAnnotationInfo ( $class, "#oneToMany" )) {
104 4
			$oneToMany = array_keys ( $oneToMany );
105 4
			foreach ( $oneToMany as $member ) {
106 4
				$result [$member . "Ids"] = $member;
107
			}
108
		}
109 5
		return [ "relations" => $result,"manyToOne" => $manyToOne,"manyToMany" => $manyToMany,"oneToMany" => $oneToMany ];
110
	}
111
112 4
	public static function getAnnotFieldsInRelations($class) {
113 4
		$result = [ ];
114 4
		if ($manyToOnes = self::getAnnotationInfo ( $class, "#manyToOne" )) {
115 3
			$joinColumns = self::getAnnotationInfo ( $class, "#joinColumn" );
116 3
			foreach ( $manyToOnes as $manyToOne ) {
117 3
				if (isset ( $joinColumns [$manyToOne] )) {
118 3
					$result [$manyToOne] = [ "type" => "manyToOne","value" => $joinColumns [$manyToOne] ];
119
				}
120
			}
121
		}
122 4
		if ($oneToManys = self::getAnnotationInfo ( $class, "#oneToMany" )) {
123 4
			foreach ( $oneToManys as $field => $oneToMany ) {
124 4
				$result [$field] = [ "type" => "oneToMany","value" => $oneToMany ];
125
			}
126
		}
127 4
		if ($manyToManys = self::getAnnotationInfo ( $class, "#manyToMany" )) {
128 3
			foreach ( $manyToManys as $field => $manyToMany ) {
129 3
				$result [$field] = [ "type" => "manyToMany","value" => $manyToMany ];
130
			}
131
		}
132 4
		return $result;
133
	}
134
135 3
	public static function getUJoinSQL($model, $arrayAnnot, $field, &$aliases) {
136 3
		$type = $arrayAnnot ["type"];
137 3
		$annot = $arrayAnnot ["value"];
138 3
		$table = self::getTableName ( $model );
139 3
		$tableAlias = (isset ( $aliases [$table] )) ? $aliases [$table] : $table;
140 3
		if ($type === "manyToOne") {
141
			$fkClass = $annot ["className"];
142
			$fkTable = self::getTableName ( $fkClass );
143
			$fkField = $annot ["name"];
144
			$pkField = self::getFirstKey ( $fkClass );
145
			$alias = self::getJoinAlias ( $table, $fkTable );
146
			$result = "INNER JOIN `{$fkTable}` `{$alias}` ON `{$tableAlias}`.`{$fkField}`=`{$alias}`.`{$pkField}`";
147 3
		} elseif ($type === "oneToMany") {
148
			$fkClass = $annot ["className"];
149
			$fkAnnot = self::getAnnotationInfoMember ( $fkClass, "#joinColumn", $annot ["mappedBy"] );
150
			$fkTable = self::getTableName ( $fkClass );
151
			$fkField = $fkAnnot ["name"];
152
			$pkField = self::getFirstKey ( $model );
153
			$alias = self::getJoinAlias ( $table, $fkTable );
154
			$result = "INNER JOIN `{$fkTable}` `{$alias}` ON `{$tableAlias}`.`{$pkField}`=`{$alias}`.`{$fkField}`";
155
		} else {
156 3
			$parser = new ManyToManyParser ( $model, $field );
157 3
			$parser->init ( $annot );
158 3
			$fkTable = $parser->getTargetEntityTable ();
159 3
			$fkClass = $parser->getTargetEntityClass ();
160 3
			$alias = self::getJoinAlias ( $table, $fkTable );
161 3
			$result = $parser->getSQL ( $alias, $aliases );
162
		}
163
164 3
		if (array_search ( $alias, $aliases ) !== false) {
165
			$result = "";
166
		}
167 3
		$aliases [$fkTable] = $alias;
168 3
		return [ "class" => $fkClass,"table" => $fkTable,"sql" => $result,"alias" => $alias ];
169
	}
170
171 3
	private static function getJoinAlias($table, $fkTable) {
172 3
		return uniqid ( $fkTable . '_' . $table [0] );
173
	}
174
175
	public static function getOneToManyFields($class) {
176
		return self::getAnnotationInfo ( $class, "#oneToMany" );
177
	}
178
179
	public static function getManyToOneFields($class) {
180
		return self::getAnnotationInfo ( $class, "#manyToOne" );
181
	}
182
183
	public static function getManyToManyFields($class) {
184
		$result = self::getAnnotationInfo ( $class, "#manyToMany" );
185
		if ($result !== false)
186
			return \array_keys ( $result );
187
		return [ ];
188
	}
189
190 24
	public static function getDefaultFk($classname) {
191 24
		return "id" . \ucfirst ( self::getTableName ( $classname ) );
192
	}
193
194 5
	public static function getMemberJoinColumns($instance, $member, $metaDatas = NULL) {
195 5
		if (! isset ( $metaDatas )) {
196 4
			if (is_object ( $instance )) {
197
				$class = get_class ( $instance );
198
			} else {
199 4
				$class = $instance;
200
			}
201 4
			$metaDatas = self::getModelMetadata ( $class );
202
		}
203 5
		$invertedJoinColumns = $metaDatas ["#invertedJoinColumn"];
204 5
		foreach ( $invertedJoinColumns as $field => $invertedJoinColumn ) {
205 5
			if ($invertedJoinColumn ["member"] === $member) {
206 5
				return [ $field,$invertedJoinColumn ];
207
			}
208
		}
209
		return null;
210
	}
211
212
	/**
213
	 *
214
	 * @param object $instance
215
	 * @return mixed[]
216
	 */
217 13
	public static function getManyToOneMembersAndValues($instance) {
218 13
		$ret = array ();
219 13
		$class = get_class ( $instance );
220 13
		$members = self::getAnnotationInfo ( $class, "#manyToOne" );
221 13
		if ($members !== false) {
222 13
			foreach ( $members as $member ) {
223 4
				$memberAccessor = "get" . ucfirst ( $member );
224 4
				if (method_exists ( $instance, $memberAccessor )) {
225 4
					$memberInstance = $instance->$memberAccessor ();
226 4
					if (isset ( $memberInstance ) && is_object ( $memberInstance )) {
227 4
						$keyValues = self::getKeyFieldsAndValues ( $memberInstance );
228 4
						if (sizeof ( $keyValues ) > 0) {
229 4
							$fkName = self::getJoinColumnName ( $class, $member );
230 4
							$ret [$fkName] = current ( $keyValues );
231
						}
232
					}
233
				}
234
			}
235
		}
236 13
		return $ret;
237
	}
238
239 4
	public static function getJoinColumnName($class, $member) {
240 4
		$annot = self::getAnnotationInfoMember ( $class, "#joinColumn", $member );
241 4
		if ($annot !== false) {
242 4
			$fkName = $annot ["name"];
243
		} else {
244
			$fkName = "id" . ucfirst ( self::getTableName ( ucfirst ( $member ) ) );
245
		}
246 4
		return $fkName;
247
	}
248
}
249
250