Example #1
0
 /**
  * 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);
 }