public static function pickReadyJobsForWorkers(MongoCollection $collection, $worksOn, $workers) { $jobs = Onebip\array_pluck(iterator_to_array($collection->find(Worker::canWorkOnAnyJobs($worksOn) ? ['scheduled_at' => ['$lt' => T\MongoDate::now()], 'locked' => false] : ['scheduled_at' => ['$lt' => T\MongoDate::now()], 'locked' => false, 'group' => $worksOn], ['_id' => 1])->sort(['scheduled_at' => 1])->limit(count($workers))), '_id'); if (count($jobs) > 0) { return [$worksOn, $workers, $jobs]; } }
public static function tryToAssignJobsToWorkers(MongoCollection $collection, $jobs, $workers) { $assignment = array_combine(Onebip\array_map($workers, function ($id) { return (string) $id; }), $jobs); $result = $collection->update($where = ['_id' => ['$in' => array_values($workers)]], $update = ['$set' => ['available' => false, 'assigned_to' => $assignment, 'assigned_since' => T\MongoDate::now()]], ['multiple' => true]); return [$assignment, $result['n']]; }