44 if (!isset(self::$instance)) {
53 $this->valueHashToValueContainerId = new \SplObjectStorage();
54 $this->bucketHashToObserverContainerId = new \SplObjectStorage();
55 $this->taskHashToTaskContainerId = new \SplObjectStorage();
60 $atom = $this->db->buildAtomQuery();
62 $atom->addTableLock(
'il_bt_bucket');
63 $atom->addTableLock(
'il_bt_task');
64 $atom->addTableLock(
'il_bt_value');
65 $atom->addTableLock(
'il_bt_value_to_task');
67 $this->db->manipulateF(
68 "DELETE FROM il_bt_bucket WHERE user_id = %s AND (state = %s OR state = %s) AND last_heartbeat < %s AND last_heartbeat > 0",
69 [
'integer',
'integer',
'integer',
'integer'],
74 time() - 1 * 60 * 24 * 30
79 $this->db->manipulateF(
80 "DELETE FROM il_bt_bucket WHERE state = %s AND last_heartbeat < %s AND last_heartbeat > 0",
81 [
'integer',
'integer'],
86 $this->db->manipulateF(
87 "DELETE FROM il_bt_bucket WHERE state != %s AND last_heartbeat < %s AND last_heartbeat > 0",
88 [
'integer',
'integer'],
93 $this->db->manipulate(
94 "DELETE il_bt_task FROM il_bt_task LEFT JOIN il_bt_bucket ON il_bt_bucket.id = il_bt_task.bucket_id WHERE il_bt_bucket.id IS NULL;"
98 $this->db->manipulate(
99 "DELETE il_bt_value_to_task FROM il_bt_value_to_task LEFT JOIN il_bt_bucket ON il_bt_bucket.id = il_bt_value_to_task.bucket_id WHERE il_bt_bucket.id IS NULL;"
103 $this->db->manipulate(
104 "DELETE il_bt_value_to_task FROM il_bt_value_to_task LEFT JOIN il_bt_task ON il_bt_task.id = il_bt_value_to_task.task_id WHERE il_bt_task.id IS NULL;"
108 $this->db->manipulate(
109 "DELETE il_bt_value FROM il_bt_value LEFT JOIN il_bt_value_to_task ON il_bt_value_to_task.value_id = il_bt_value.id WHERE il_bt_value_to_task.id IS NULL;"
117 $this->connector =
$c;
139 $bucketContainer->setUserId($bucket->
getUserId());
140 $bucketContainer->setState($bucket->
getState());
141 $bucketContainer->setTotalNumberoftasks(count($bucket->
getTask()->unfoldTask()));
143 $bucketContainer->setTitle($bucket->
getTitle());
150 $bucketContainer->update();
158 if ((
new \Random\Randomizer())->getInt(0, 100) === 1) {
163 ->orderBy($order_by, $order_direction)
164 ->getArray(
null,
'id');
177 $bucketMeta->setUserId($bucketContainer->
getUserId());
178 $bucketMeta->setState($bucketContainer->
getState());
179 $bucketMeta->setTitle($bucketContainer->
getTitle());
181 $bucketMeta->setOverallPercentage($bucketContainer->
getPercentage());
205 if ($this->bucketHashToObserverContainerId->offsetExists($bucket)) {
206 $bucketContainer =
new BucketContainer($this->bucketHashToObserverContainerId[$bucket], $this->connector);
212 $bucketContainer->setUserId($bucket->
getUserId());
213 $bucketContainer->setState($bucket->
getState());
214 $bucketContainer->setTitle($bucket->
getTitle());
216 $bucketContainer->setTotalNumberoftasks(count($bucket->
getTask()->unfoldTask()));
220 if (!$bucketContainer->getId()) {
221 $bucketContainer->create();
233 $bucketContainer->save();
234 $this->bucketHashToObserverContainerId[$bucket] = $bucketContainer->getId();
246 if ($this->taskHashToTaskContainerId->offsetExists($task)) {
247 $taskContainer =
new TaskContainer($this->taskHashToTaskContainerId[$task]);
253 $taskContainer->setType($task->
getType());
254 $taskContainer->setBucketId($bucketId);
255 $reflection = new \ReflectionClass($task::class);
256 $taskContainer->setClassName($task::class);
259 foreach ($task->
getInput() as $k => $input) {
262 $this->saveValueToTask($task, $taskContainer, $bucketId);
265 $taskContainer->save();
266 $this->taskHashToTaskContainerId[$task] = $taskContainer->getId();
275 protected function saveValueToTask(
Task $task,
TaskContainer $taskContainer,
int $bucketId): void
278 if ($taskContainer->
getId() !== 0) {
281 foreach ($olds as $old) {
286 $taskContainer->
save();
290 foreach ($task->
getInput() as $k => $inputValue) {
291 $v =
new ValueToTaskContainer(0, $this->connector);
292 $v->setTaskId($taskContainer->
getId());
294 $v->setBucketId($bucketId);
309 if ($this->valueHashToValueContainerId->offsetExists($value)) {
310 $valueContainer =
new ValueContainer($this->valueHashToValueContainerId[$value], $this->connector);
314 $valueContainer->setClassName($value::class);
319 $valueContainer->setType($value->
getType());
321 $valueContainer->setBucketId($bucketId);
322 $valueContainer->setPosition($position);
323 $valueContainer->setHash($value->
getHash());
324 $valueContainer->setSerialized($value->serialize());
333 $valueContainer->save();
334 $this->valueHashToValueContainerId[$value] = $valueContainer->getId();
342 if (!$this->bucketHashToObserverContainerId->offsetExists($bucket)) {
344 . print_r($bucket,
true));
347 return (
int) $this->bucketHashToObserverContainerId[$bucket];
356 if (!$this->taskHashToTaskContainerId->offsetExists($task)) {
358 . print_r($task,
true));
361 return (
int) $this->taskHashToTaskContainerId[$task];
369 if (!$this->valueHashToValueContainerId->offsetExists($value)) {
371 . print_r($value,
true));
374 return (
int) $this->valueHashToValueContainerId[$value];
382 if (isset(self::$buckets[$bucket_container_id])) {
383 return self::$buckets[$bucket_container_id];
386 $bucketContainer = BucketContainer::find($bucket_container_id);
387 if (!$bucketContainer) {
388 throw new BucketNotFoundException(
"The requested bucket with container id $bucket_container_id could not be found in the database.");
390 $bucket =
new BasicBucket();
392 $bucket->setUserId($bucketContainer->getUserId());
393 $bucket->setState($bucketContainer->getState());
394 $bucket->setTitle($bucketContainer->getTitle());
395 $bucket->setDescription($bucketContainer->getDescription());
396 $bucket->setOverallPercentage($bucketContainer->getPercentage());
397 $bucket->setLastHeartbeat($bucketContainer->getLastHeartbeat());
398 $bucket->setTask($this->loadTask($bucketContainer->getRootTaskid(), $bucket, $bucketContainer));
400 $this->bucketHashToObserverContainerId[$bucket] = $bucket_container_id;
413 private function loadTask(
int $taskContainerId,
Bucket $bucket, BucketContainer $bucketContainer):
Task
416 $factory =
$DIC->backgroundTasks()->taskFactory();
418 $taskContainer = TaskContainer::find($taskContainerId);
419 if (!$taskContainer instanceof TaskContainer) {
420 throw new SerializationException(
421 "The requested task with container id $taskContainerId could not be found in the database."
426 $task = $factory->createTask($taskContainer->
getClassName());
431 ->orderBy(
'position')
435 foreach ($valueToTasks as $valueToTask) {
436 $inputs[] = $this->loadValue($valueToTask->getValueId(), $bucket, $bucketContainer);
440 if ($taskContainerId === $bucketContainer->getCurrentTaskid()) {
444 $this->taskHashToTaskContainerId[$task] = $taskContainerId;
449 private function loadValue($valueContainerId, Bucket $bucket, BucketContainer $bucketContainer): Value
452 $registry =
$DIC->backgroundTasks()->registry();
453 $factory =
$DIC->backgroundTasks()->injector();
456 $valueContainer = ValueContainer::find($valueContainerId);
457 if (!$valueContainer instanceof ValueContainer) {
458 throw new SerializationException(
459 "The requested value with container id $valueContainerId could not be found in the database."
465 $value = $registry->isRegistered($valueContainer->getClassName())
466 ? $registry->newValue($valueContainer->getClassName())
467 : $factory->createInstance($valueContainer->getClassName());
469 $value->unserialize($valueContainer->getSerialized());
470 if ($valueContainer->getHasParenttask() !== 0) {
471 $value->setParentTask($this->loadTask($valueContainer->getParentTaskid(), $bucket, $bucketContainer));
474 $this->valueHashToValueContainerId[$value] = $valueContainerId;
482 array_map(
function (BucketContainer $item):
void {
488 array_map(
function (TaskContainer $item):
void {
494 array_map(
function (ValueContainer $item):
void {
500 array_map(
function (ValueToTaskContainer $item):
void {
512 $this->bucketHashToObserverContainerId->detach($bucket);
521 foreach ($bucket_container_ids as $bucket_id) {
524 }
catch (\Throwable) {
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
static where($where, $operator=null)
__construct(protected \ilDBInterface $db)
static BasicPersistence $instance
saveBucketAndItsTasks(Bucket $bucket)
Fully updates or creates an Observer and all its tasks into the database.
saveValue(Value $value, int $bucketId, int $position)
getBucketIdsOfUser(int $user_id, string $order_by="id", string $order_direction="ASC")
int[] Returns an array of bucket ids for the given user Id.
updateBucket(Bucket $bucket)
Updates only the bucket! Use this if e.g.
setConnector(\arConnector $c)
deleteBucket(Bucket $bucket)
Delete the bucket and all its stuff.
loadBuckets(array $bucket_container_ids)
getValueContainerId(Value $value)
SplObjectStorage $valueHashToValueContainerId
static instance(\ilDBInterface $db)
SplObjectStorage $taskHashToTaskContainerId
getTaskContainerId(Task $task)
saveTask(Task $task, int $bucketId)
saveObserver(Bucket $bucket)
getBucketMetaOfUser(int $user_id)
SplObjectStorage $bucketHashToObserverContainerId
getBucketIdsByState(int $state)
int[] Returns a list of bucket ids for the given Observer State
getBucketContainerId(Bucket $bucket)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setCurrentTask(Task $task)
getLastHeartbeat()
When was the last time that something happened on this bucket?
loadBucket(int $bucket_container_id)
deleteBucketById(int $bucket_id)
Deletes the Observer AND all its tasks and values.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.