ILIAS  release_8 Revision v8.24
ilExPeerReview Class Reference

Exercise peer review. More...

+ Collaboration diagram for ilExPeerReview:

Public Member Functions

 __construct (ilExAssignment $a_assignment)
 
 hasPeerReviewGroups ()
 
 initPeerReviews ()
 
 resetPeerReviews ()
 
 validatePeerReviewGroups ()
 
 getPeerReviewValues (int $a_giver_id, int $a_peer_id)
 
 getPeerReviewsByGiver (int $a_user_id)
 
 getPeerMaskedId (int $a_giver_id, int $a_peer_id)
 
 getPeerReviewsByPeerId (int $a_user_id, bool $a_only_valid=false)
 
 getAllPeerReviews (bool $a_only_valid=true)
 
 hasPeerReviewAccess (int $a_peer_id)
 
 updatePeerReviewTimestamp (int $a_peer_id)
 
 updatePeerReview (int $a_peer_id, array $a_values)
 
 countGivenFeedback (bool $a_validate=true, int $a_user_id=null)
 
 getNumberOfMissingFeedbacksForReceived ()
 
 isFeedbackValidForPassed (int $a_user_id)
 

Static Public Member Functions

static lookupGiversWithPendingFeedback (int $a_ass_id)
 

Protected Member Functions

 getValidPeerReviewUsers ()
 
 validatePeerReview (array $a_data)
 
 getMaxPossibleFeedbacks ()
 

Protected Attributes

ilDBInterface $db
 
ilObjUser $user
 
 ilExAssignment$assignment
 
int $assignment_id
 
ilLogger $log
 

Detailed Description

Exercise peer review.

Author
Jörg Lützenkirchen luetz.nosp@m.enki.nosp@m.rchen.nosp@m.@lei.nosp@m.fos.c.nosp@m.om
Alexander Killing killi.nosp@m.ng@l.nosp@m.eifos.nosp@m..de

Definition at line 27 of file class.ilExPeerReview.php.

Constructor & Destructor Documentation

◆ __construct()

ilExPeerReview::__construct ( ilExAssignment  $a_assignment)

Definition at line 35 of file class.ilExPeerReview.php.

37 {
38 global $DIC;
39
40 $this->db = $DIC->database();
41 $this->user = $DIC->user();
42 $this->assignment = $a_assignment;
43 $this->assignment_id = $a_assignment->getId();
44 $this->log = ilLoggerFactory::getLogger("exc");
45 }
static getLogger(string $a_component_id)
Get component logger.
global $DIC
Definition: feed.php:28

References $DIC, ilExAssignment\getId(), ilLoggerFactory\getLogger(), and ILIAS\Repository\user().

+ Here is the call graph for this function:

Member Function Documentation

◆ countGivenFeedback()

ilExPeerReview::countGivenFeedback ( bool  $a_validate = true,
int  $a_user_id = null 
)

Definition at line 387 of file class.ilExPeerReview.php.

390 : int {
393
394 if (!$a_user_id) {
395 $a_user_id = $ilUser->getId();
396 }
397
398 $cnt = 0;
399
400 $set = $ilDB->query("SELECT *" .
401 " FROM exc_assignment_peer" .
402 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer") .
403 " AND giver_id = " . $ilDB->quote($a_user_id, "integer"));
404 while ($row = $ilDB->fetchAssoc($set)) {
405 if (!$a_validate ||
406 $this->validatePeerReview($row)) {
407 $cnt++;
408 }
409 }
410
411 return $cnt;
412 }
validatePeerReview(array $a_data)
$ilUser
Definition: imgupload.php:34

References $ilUser.

◆ getAllPeerReviews()

ilExPeerReview::getAllPeerReviews ( bool  $a_only_valid = true)

Definition at line 312 of file class.ilExPeerReview.php.

314 : array {
316
317 $res = array();
318
319 $set = $ilDB->query("SELECT *" .
320 " FROM exc_assignment_peer" .
321 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer") .
322 " ORDER BY peer_id");
323 while ($row = $ilDB->fetchAssoc($set)) {
324 $valid = $this->validatePeerReview($row);
325 if (!$a_only_valid ||
326 $valid) {
327 $res[$row["peer_id"]][$row["giver_id"]] = $valid;
328 }
329 }
330
331 return $res;
332 }
$valid
$res
Definition: ltiservices.php:69

Referenced by resetPeerReviews(), and validatePeerReviewGroups().

+ Here is the caller graph for this function:

◆ getMaxPossibleFeedbacks()

ilExPeerReview::getMaxPossibleFeedbacks ( )
protected

Definition at line 414 of file class.ilExPeerReview.php.

414 : int
415 {
417
418 // check if number of returned assignments is lower than assignment peer min
419 $set = $ilDB->query("SELECT COUNT(DISTINCT(user_id)) cnt" .
420 " FROM exc_returned" .
421 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer"));
422 $cnt = $ilDB->fetchAssoc($set);
423 $cnt = (int) $cnt["cnt"];
424 return $cnt - 1;
425 }

References $ilDB, and ILIAS\Repository\int().

+ Here is the call graph for this function:

◆ getNumberOfMissingFeedbacksForReceived()

ilExPeerReview::getNumberOfMissingFeedbacksForReceived ( )

Definition at line 427 of file class.ilExPeerReview.php.

427 : int
428 {
429 $max = $this->getMaxPossibleFeedbacks();
430
431 // #16160 - forever alone
432 if ($max === 0) {
433 return 0;
434 }
435
436 // are all required or just 1?
437 if (!$this->assignment->getPeerReviewSimpleUnlock()) {
438 $needed = $this->assignment->getPeerReviewMin();
439 } else {
440 $needed = 1;
441 }
442 // there could be less participants than stated in the min required setting
443 $min = min($max, $needed);
444 return max(0, $min - $this->countGivenFeedback());
445 }
countGivenFeedback(bool $a_validate=true, int $a_user_id=null)

◆ getPeerMaskedId()

ilExPeerReview::getPeerMaskedId ( int  $a_giver_id,
int  $a_peer_id 
)

Definition at line 236 of file class.ilExPeerReview.php.

239 : int {
240 foreach ($this->getPeerReviewsByGiver($a_giver_id) as $peer) {
241 if ($peer["peer_id"] == $a_peer_id) {
242 return (int) $peer["seq"];
243 }
244 }
245 return 0;
246 }
getPeerReviewsByGiver(int $a_user_id)

◆ getPeerReviewsByGiver()

ilExPeerReview::getPeerReviewsByGiver ( int  $a_user_id)

Definition at line 214 of file class.ilExPeerReview.php.

214 : array
215 {
217
218 $res = array();
219
220 if ($this->initPeerReviews()) {
221 $idx = 0;
222 $set = $ilDB->query("SELECT *" .
223 " FROM exc_assignment_peer" .
224 " WHERE giver_id = " . $ilDB->quote($a_user_id, "integer") .
225 " AND ass_id = " . $ilDB->quote($this->assignment_id, "integer") .
226 " ORDER BY peer_id");
227 while ($row = $ilDB->fetchAssoc($set)) {
228 $row["seq"] = ++$idx;
229 $res[] = $row;
230 }
231 }
232
233 return $res;
234 }

References $ilDB, and $res.

◆ getPeerReviewsByPeerId()

ilExPeerReview::getPeerReviewsByPeerId ( int  $a_user_id,
bool  $a_only_valid = false 
)

Definition at line 285 of file class.ilExPeerReview.php.

288 : array {
290
291 $res = array();
292
293 $idx = 0;
294 $set = $ilDB->query("SELECT *" .
295 " FROM exc_assignment_peer" .
296 " WHERE peer_id = " . $ilDB->quote($a_user_id, "integer") .
297 " AND ass_id = " . $ilDB->quote($this->assignment_id, "integer") .
298 " ORDER BY peer_id");
299 while ($row = $ilDB->fetchAssoc($set)) {
300 if (!$a_only_valid ||
301 $this->validatePeerReview($row)) {
302 // this would be correct but rather senseless
303 // $row["seq"] = $this->getPeerMaskedId($row["giver_id"], $a_user_id);
304 $row["seq"] = ++$idx;
305 $res[] = $row;
306 }
307 }
308
309 return $res;
310 }

◆ getPeerReviewValues()

ilExPeerReview::getPeerReviewValues ( int  $a_giver_id,
int  $a_peer_id 
)

Definition at line 189 of file class.ilExPeerReview.php.

192 : array {
193 $peer = null;
194 foreach ($this->getPeerReviewsByGiver($a_giver_id) as $item) {
195 if ($item["peer_id"] == $a_peer_id) {
196 $peer = $item;
197 }
198 }
199 if (!$peer) {
200 return [];
201 }
202 $data = $peer["pcomment"];
203 if ($data) {
204 $items = unserialize($data, ['allowed_classes' => false]);
205 if (!is_array($items)) {
206 // v1 - pcomment == text
207 $items = array("text" => $data);
208 }
209 return $items;
210 }
211 return [];
212 }

◆ getValidPeerReviewUsers()

ilExPeerReview::getValidPeerReviewUsers ( )
protected
Returns
int[]

Definition at line 61 of file class.ilExPeerReview.php.

61 : array
62 {
64
65 $user_ids = array();
66
67 // returned / assigned ?!
68 $set = $ilDB->query("SELECT DISTINCT(user_id)" .
69 " FROM exc_returned" .
70 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer") .
71 " AND (filename IS NOT NULL OR atext IS NOT NULL)");
72 while ($row = $ilDB->fetchAssoc($set)) {
73 $user_ids[] = (int) $row["user_id"];
74 }
75
76 return $user_ids;
77 }

References $db, $ilDB, and ILIAS\Repository\int().

Referenced by initPeerReviews(), and validatePeerReviewGroups().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hasPeerReviewAccess()

ilExPeerReview::hasPeerReviewAccess ( int  $a_peer_id)

Definition at line 334 of file class.ilExPeerReview.php.

336 : bool {
339
340 $set = $ilDB->query("SELECT ass_id" .
341 " FROM exc_assignment_peer" .
342 " WHERE giver_id = " . $ilDB->quote($ilUser->getId(), "integer") .
343 " AND peer_id = " . $ilDB->quote($a_peer_id, "integer") .
344 " AND ass_id = " . $ilDB->quote($this->assignment_id, "integer"));
345 $row = $ilDB->fetchAssoc($set);
346 return ((int) ($row["ass_id"] ?? 0) > 0);
347 }

◆ hasPeerReviewGroups()

ilExPeerReview::hasPeerReviewGroups ( )

Definition at line 47 of file class.ilExPeerReview.php.

47 : bool
48 {
50
51 $set = $ilDB->query("SELECT count(*) cnt" .
52 " FROM exc_assignment_peer" .
53 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer"));
54 $cnt = $ilDB->fetchAssoc($set);
55 return (bool) $cnt["cnt"];
56 }

References $db, and $ilDB.

Referenced by initPeerReviews(), resetPeerReviews(), and validatePeerReviewGroups().

+ Here is the caller graph for this function:

◆ initPeerReviews()

ilExPeerReview::initPeerReviews ( )

Definition at line 79 of file class.ilExPeerReview.php.

79 : bool
80 {
82
83 // see #22246
84 if (!$this->assignment->afterDeadlineStrict()) {
85 return false;
86 }
87
88 if (!$this->hasPeerReviewGroups()) {
89 $user_ids = $this->getValidPeerReviewUsers();
90
91 $distribution = new ExcPeerReviewDistribution($user_ids, $this->assignment->getPeerReviewMin());
92
93 foreach ($user_ids as $rater_id) {
94 foreach ($distribution->getPeersOfRater($rater_id) as $peer_id) {
95 $ilDB->manipulate("INSERT INTO exc_assignment_peer" .
96 " (ass_id, giver_id, peer_id)" .
97 " VALUES (" . $ilDB->quote($this->assignment_id, "integer") .
98 ", " . $ilDB->quote($rater_id, "integer") .
99 ", " . $ilDB->quote($peer_id, "integer") . ")");
100 }
101 }
102 }
103 return true;
104 }
Calculates peer review distribution (rater to peer assignments)

References $db, $ilDB, getValidPeerReviewUsers(), and hasPeerReviewGroups().

+ Here is the call graph for this function:

◆ isFeedbackValidForPassed()

ilExPeerReview::isFeedbackValidForPassed ( int  $a_user_id)

Definition at line 447 of file class.ilExPeerReview.php.

447 : bool
448 {
449 // peer feedback is not required for passing
450 if ($this->assignment->getPeerReviewValid() == ilExAssignment::PEER_REVIEW_VALID_NONE) {
451 return true;
452 }
453
454 // #16227 - no processing before reaching the peer review period
455 if (!$this->assignment->afterDeadlineStrict()) {
456 return false;
457 }
458
459 // forever alone - should be valid
460 $max = $this->getMaxPossibleFeedbacks();
461 if ($max === 0) {
462 return true;
463 }
464
465 $no_of_feedbacks = $this->countGivenFeedback(true, $a_user_id);
466
467 switch ($this->assignment->getPeerReviewValid()) {
469 return (bool) $no_of_feedbacks;
470
472 // there could be less participants than stated in the min required setting
473 $min = min($max, $this->assignment->getPeerReviewMin());
474
475 return (($min - $no_of_feedbacks) < 1);
476 }
477 return false;
478 }

References ilExAssignment\PEER_REVIEW_VALID_ALL, ilExAssignment\PEER_REVIEW_VALID_NONE, and ilExAssignment\PEER_REVIEW_VALID_ONE.

◆ lookupGiversWithPendingFeedback()

static ilExPeerReview::lookupGiversWithPendingFeedback ( int  $a_ass_id)
static

Definition at line 480 of file class.ilExPeerReview.php.

480 : array
481 {
482 global $DIC;
483
484 $ilDB = $DIC->database();
485 $user_ids = array();
486
487 $set = $ilDB->query(
488 "SELECT DISTINCT(giver_id) FROM exc_assignment_peer " .
489 " WHERE ass_id = " . $ilDB->quote($a_ass_id, "integer") .
490 " AND tstamp is NULL"
491 );
492
493 while ($row = $ilDB->fetchAssoc($set)) {
494 $user_ids[] = $row["giver_id"];
495 }
496
497 return $user_ids;
498 }

References $DIC, and $ilDB.

Referenced by ilExAssignmentReminder\parsePeerReminders().

+ Here is the caller graph for this function:

◆ resetPeerReviews()

ilExPeerReview::resetPeerReviews ( )
Returns
int[]|string[]

Definition at line 109 of file class.ilExPeerReview.php.

109 : array
110 {
112
113 $all = array();
114
115 if ($this->hasPeerReviewGroups()) {
116 foreach ($this->getAllPeerReviews(false) as $peer_id => $reviews) {
117 foreach (array_keys($reviews) as $giver_id) {
118 $all[] = $giver_id;
119
120 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
121 $crit->setPeerReviewContext($this->assignment, $giver_id, $peer_id);
122 $crit->resetReview();
123 }
124 }
125 }
126
127 // peer groups
128 $ilDB->manipulate("DELETE FROM exc_assignment_peer" .
129 " WHERE ass_id = " . $ilDB->quote($this->assignment_id, "integer"));
130 }
131
132 return $all;
133 }
getAllPeerReviews(bool $a_only_valid=true)

References $db, $ilDB, getAllPeerReviews(), and hasPeerReviewGroups().

+ Here is the call graph for this function:

◆ updatePeerReview()

ilExPeerReview::updatePeerReview ( int  $a_peer_id,
array  $a_values 
)

Definition at line 362 of file class.ilExPeerReview.php.

365 : void {
368
369 $data = [
370 "pcomment" => serialize($a_values),
371 "peer_id" => $a_peer_id,
372 "giver_id" => $ilUser->getId()
373 ];
375
376 $sql = "UPDATE exc_assignment_peer" .
377 " SET tstamp = " . $ilDB->quote(ilUtil::now(), "timestamp") .
378 ",pcomment = " . $ilDB->quote(serialize($a_values), "text") .
379 ",is_valid = " . $ilDB->quote((int) $valid, "integer") .
380 " WHERE giver_id = " . $ilDB->quote($ilUser->getId(), "integer") .
381 " AND peer_id = " . $ilDB->quote($a_peer_id, "integer") .
382 " AND ass_id = " . $ilDB->quote($this->assignment_id, "integer");
383
384 $ilDB->manipulate($sql);
385 }
static now()
Return current timestamp in Y-m-d H:i:s format.

◆ updatePeerReviewTimestamp()

ilExPeerReview::updatePeerReviewTimestamp ( int  $a_peer_id)

Definition at line 349 of file class.ilExPeerReview.php.

351 : void {
354
355 $ilDB->manipulate("UPDATE exc_assignment_peer" .
356 " SET tstamp = " . $ilDB->quote(ilUtil::now(), "timestamp") .
357 " WHERE giver_id = " . $ilDB->quote($ilUser->getId(), "integer") .
358 " AND peer_id = " . $ilDB->quote($a_peer_id, "integer") .
359 " AND ass_id = " . $ilDB->quote($this->assignment_id, "integer"));
360 }

◆ validatePeerReview()

ilExPeerReview::validatePeerReview ( array  $a_data)
protected

Definition at line 248 of file class.ilExPeerReview.php.

248 : bool
249 {
250 $all_empty = true;
251 // see getPeerReviewValues()
252 $values = null;
253 $data = $a_data["pcomment"];
254 if ($data) {
255 try {
256 $values = unserialize($data, ['allowed_classes' => false]);
257 } catch (Exception $e) {
258 }
259 if (!is_array($values)) {
260 // v1 - pcomment == text
261 $values = array("text" => $data);
262 }
263 }
264
265 foreach ($this->assignment->getPeerReviewCriteriaCatalogueItems() as $crit) {
266 $crit_id = $crit->getId()
267 ? $crit->getId()
268 : $crit->getType();
269 $crit->setPeerReviewContext(
270 $this->assignment,
271 $a_data["giver_id"],
272 $a_data["peer_id"]
273 );
274 if (!$crit->validate($values[$crit_id] ?? null)) {
275 return false;
276 }
277 if ($crit->hasValue($values[$crit_id] ?? null)) {
278 $all_empty = false;
279 }
280 }
281
282 return !$all_empty;
283 }

References $data, and Vendor\Package\$e.

◆ validatePeerReviewGroups()

ilExPeerReview::validatePeerReviewGroups ( )

Definition at line 135 of file class.ilExPeerReview.php.

135 : ?array
136 {
137 if ($this->hasPeerReviewGroups()) {
138 $all_exc = ilExerciseMembers::_getMembers($this->assignment->getExerciseId());
139 $all_valid = $this->getValidPeerReviewUsers(); // only returned
140
141 $peer_ids = $invalid_peer_ids = $invalid_giver_ids = $all_reviews = array();
142 foreach ($this->getAllPeerReviews(false) as $peer_id => $reviews) {
143 $peer_ids[] = $peer_id;
144
145 if (!in_array($peer_id, $all_valid) ||
146 !in_array($peer_id, $all_exc)) {
147 $invalid_peer_ids[] = $peer_id;
148 }
149 foreach ($reviews as $giver_id => $valid) {
150 if (!in_array($giver_id, $all_valid) ||
151 !in_array($peer_id, $all_exc)) {
152 $invalid_giver_ids[] = $giver_id;
153 } else {
154 $all_reviews[$peer_id][$giver_id] = $valid;
155 }
156 }
157 }
158 $invalid_giver_ids = array_unique($invalid_giver_ids);
159
160 $missing_user_ids = array();
161 foreach ($all_valid as $user_id) {
162 // a missing peer is also a missing giver
163 if (!in_array($user_id, $peer_ids)) {
164 $missing_user_ids[] = $user_id;
165 }
166 }
167
168 $not_returned_ids = array();
169 foreach ($all_exc as $user_id) {
170 if (!in_array($user_id, $all_valid)) {
171 $not_returned_ids[] = $user_id;
172 }
173 }
174
175 return array(
176 "invalid" => (count($missing_user_ids) ||
177 count($invalid_peer_ids) ||
178 count($invalid_giver_ids)),
179 "missing_user_ids" => $missing_user_ids,
180 "not_returned_ids" => $not_returned_ids,
181 "invalid_peer_ids" => $invalid_peer_ids,
182 "invalid_giver_ids" => $invalid_giver_ids,
183 "reviews" => $all_reviews);
184 }
185
186 return null;
187 }
static _getMembers(int $a_obj_id)

References $valid, ilExerciseMembers\_getMembers(), getAllPeerReviews(), getValidPeerReviewUsers(), and hasPeerReviewGroups().

+ Here is the call graph for this function:

Field Documentation

◆ $assignment_id

int ilExPeerReview::$assignment_id
protected

Definition at line 32 of file class.ilExPeerReview.php.

◆ $db

ilDBInterface ilExPeerReview::$db
protected

◆ $log

ilLogger ilExPeerReview::$log
protected

Definition at line 33 of file class.ilExPeerReview.php.

◆ $user

ilObjUser ilExPeerReview::$user
protected

Definition at line 30 of file class.ilExPeerReview.php.

◆ ilExAssignment$assignment

ilExPeerReview::ilExAssignment$assignment
protected

Definition at line 31 of file class.ilExPeerReview.php.


The documentation for this class was generated from the following file: