/** * Fetch items from one or several queues. The amount of returned items may vary if not enough * items are available from the queues. * @param string|array $queues Which queues to fetch from * @param integer $amount How many items should (at most) be returned * @param integer $before Unix timestamp to limit the search * @param integer $after Unix timstamp that must have been passed * @param bool $last_edited A boolean flag to trigger search for last edited (true) or last created (false) * @param integer $offset An offset to the items that should be returned, i.e. start counting * @param const $aLEVEL The access-filter that should be used * @param User $u The user to try the permissions against * @return array Array of objects from the specified queues */ function retrieve($queues, $amount, $before = false, $after = false, $last_edited = false, $offset = 0, $pinned = 'any', $aLEVEL = ANYTHING, $u = false) { if (!$queues) { return array(); } global $DB, $Controller; if (!$before) { $before = time(); } if (!$after) { $after = 0; } if (!is_numeric($offset)) { $offset = 0; } if (is_string($queues)) { $queues = explode(',', $queues); } $queues = array_map('trim', $queues); $enough = false; $retrieved = 0; $dboffset = 0; $new = 0; $items = array(); $itemsIDS = array(); do { $cond = array('flow.queue~' => $queues, 'flow.' . ($last_edited ? 'modified' : 'created') . '>=' => $after, 'flow.' . ($last_edited ? 'modified' : 'created') . '<=' => $before, 'metadata.field' => 'Activated', 'metadata.value' => '1'); if ($pinned != 'any') { $cond['metadata.field'] = 'LockedPos'; $cond['metadata.value'] = (bool) $pinned; } if ($itemsIDS) { $cond['flow.id!'] = $itemsIDS; } //FIXME: Fix database and remove GROUP BY $newIDS = $DB->{'flow,metadata'}->asList($cond, 'flow.id', $dboffset . ',' . ceil($amount * 1.5 + $offset), true, ($last_edited ? 'modified' : 'created') . ' DESC', 'flow.id,flow.queue'); if (!$newIDS) { break; } $newItems = $Controller->get($newIDS, $aLEVEL, $u); $newItems = arrayKeySort($newItems, $newIDS); $newIDS = array_keys($newItems); $itemsIDS = array_merge($itemsIDS, $newIDS); $items = array_merge($items, $newItems); $retrieved = count($items); $new = $DB->numRows(); $dboffset += $new; } while ($newItems && $retrieved < $amount + $offset); return array_slice($items, $offset, $amount, true); }
/** * retrieve a set (array) of objects * @param array|integer $set The id's of the objects that are requested * @param integer $aLevel The accesslevel which all objects will be tried against. * @param User $u The user which the accesslevel will be tried for * @param bool $keep Set to false to disable caching * @return array Array of objects */ function get($set, $aLevel = ANYTHING, $u = false, $keep = true, $class = false) { if (is_string($aLevel) && $aLevel !== OVERRIDE) { $class = $aLevel; $aLevel = ANYTHING; } if ($set == false) { return array(); } $objects = array(); if (!is_array($set)) { return $this->retrieve($set, $aLevel, $u, $keep); } $set = flatten($set); $loadedObjects = array_keys($this->OBJECTS); $avail = array_intersect($set, $loadedObjects); $fetch = array_diff($set, $loadedObjects); $result = array(); if ($avail) { $result = $this->filter($this->OBJECTS, $aLevel, $u, $class); } if ($fetch) { $fetch = $this->fetch($fetch, $aLevel, $u, $keep, $class); } if ($fetch) { $result += $fetch; } return arrayKeySort($result, $set); }