ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
Collections.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
30 
38 {
39  private array $cache = [];
40  private array $rid_cache = [];
41  private ResourceBuilder $resource_builder;
43  private RepositoryPreloader $preloader;
44 
48  public function __construct(
49  ResourceBuilder $resource_builder,
50  CollectionBuilder $collection_builder,
51  RepositoryPreloader $preloader,
52  private Subject $events
53  ) {
54  $this->resource_builder = $resource_builder;
55  $this->collection_builder = $collection_builder;
56  $this->preloader = $preloader;
57  }
58 
63  public function id(
64  ?string $collection_identification = null,
65  ?int $owner = null
66  ): ResourceCollectionIdentification {
67  if ($collection_identification === null
68  || $collection_identification === ''
69  || !$this->collection_builder->has(new ResourceCollectionIdentification($collection_identification))
70  ) {
71  $collection = $this->collection_builder->new($owner);
72  $identification = $collection->getIdentification();
73  $this->cache[$identification->serialize()] = $collection;
74 
75  return $identification;
76  }
77 
78  return new ResourceCollectionIdentification($collection_identification);
79  }
80 
81  public function exists(string $collection_identification): bool
82  {
83  return $this->collection_builder->has(new ResourceCollectionIdentification($collection_identification));
84  }
85 
86  public function idOrNull(
87  ?string $collection_identification = null,
88  ?int $owner = null
89  ): ?ResourceCollectionIdentification {
90  if ($this->exists($collection_identification)) {
91  return $this->id($collection_identification, $owner);
92  }
93  return null;
94  }
95 
96  public function get(
97  ResourceCollectionIdentification $identification,
98  ?int $owner = null
100  $rcid = $identification->serialize();
101 
102  $collection = $this->cache[$rcid] ?? $this->collection_builder->get(
103  $identification,
104  $owner
105  );
106 
107  $preload = [];
108 
109  $rids = isset($this->cache[$rcid])
110  ? $this->cache[$rcid]->getResourceIdentifications()
111  : $this->rid_cache[$rcid]
112  ?? iterator_to_array($this->collection_builder->getResourceIds($identification));
113 
114  $this->rid_cache[$rcid] = []; // reset cache for identification, rebuild it now
115  $collection->clear();
116 
117  foreach ($rids as $resource_identification) {
118  if ($this->resource_builder->has($resource_identification)) {
119  $collection->add($resource_identification);
120  $preload[] = $resource_identification;
121  }
122  $this->rid_cache[$rcid][] = $resource_identification;
123  }
124  $this->preloader->preload($preload);
125 
126  return $this->cache[$rcid] = $collection;
127  }
128 
129  public function store(ResourceCollection $collection): bool
130  {
131  $this->cache[$collection->getIdentification()->serialize()] = $collection;
132 
133  return $this->collection_builder->store($collection);
134  }
135 
136  public function clone(ResourceCollectionIdentification $source_collection_id): ResourceCollectionIdentification
137  {
138  $target_collection_id = $this->id();
139  $target_collection = $this->get($target_collection_id);
140  $source_collection = $this->get($source_collection_id);
141 
142  foreach ($source_collection->getResourceIdentifications() as $identification) {
143  $resource = $this->resource_builder->get($identification);
144  $cloned_resource = $this->resource_builder->clone($resource);
145  $target_collection->add($cloned_resource->getIdentification());
146  }
147  $this->store($target_collection);
148 
149  return $target_collection_id;
150  }
151 
152  public function remove(
153  ResourceCollectionIdentification $collection_id,
154  ResourceStakeholder $stakeholder,
155  bool $delete_resources_as_well = false
156  ): bool {
157  $collection = $this->get($collection_id);
158  if ($delete_resources_as_well) {
159  foreach ($collection->getResourceIdentifications() as $resource_identification) {
160  $resource = $this->resource_builder->get($resource_identification);
161  $this->resource_builder->remove($resource, $stakeholder);
162  }
163  }
164  unset($this->cache[$collection_id->serialize()]);
165 
166  return $this->collection_builder->delete($collection_id);
167  }
168 
172  public function rangeAsArray(ResourceCollection $collection, int $from, int $amout): array
173  {
174  $return = [];
175  foreach ($collection->getResourceIdentifications() as $position => $identification) {
176  if ($position >= $from && $position < $from + $amout) {
177  $return[] = $identification;
178  }
179  }
180  return $return;
181  }
182 
186  public function rangeAsGenerator(ResourceCollection $collection, int $from, int $to): \Generator
187  {
188  foreach ($collection->getResourceIdentifications() as $position => $identification) {
189  if ($position >= $from && $position <= $to) {
190  yield $identification;
191  }
192  }
193  }
194 
195  public function sort(ResourceCollection $collection): Sorter
196  {
197  return new Sorter(
198  $this->resource_builder,
199  $this->collection_builder,
200  $collection
201  );
202  }
203 }
clone(ResourceCollectionIdentification $source_collection_id)
rangeAsGenerator(ResourceCollection $collection, int $from, int $to)
__construct(ResourceBuilder $resource_builder, CollectionBuilder $collection_builder, RepositoryPreloader $preloader, private Subject $events)
Consumers constructor.
Definition: Collections.php:48
idOrNull(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:86
rangeAsArray(ResourceCollection $collection, int $from, int $amout)
id(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:63