Read implementation
<?php
use ForestAdmin\AgentPHP\DatasourceToolkit\Collection;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Caller;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Aggregation;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Filters\Filter;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\Projection\Projection;
/**
* This collection will have terrible performance, but is perfect to test that the
* structure declaration is well done.
*/
class MyCollection extends Collection
{
// [... Declare structure and capabilities]
// $this->client = new \GuzzleHttp\Client([...]);
public function list(Caller $caller, Filter $filter, Projection $projection): array
{
// Fetch all records on all requests (this is _very_ inefficient)
try {
$response = $this->client->get('https://my-api/my-collection');
$result = json_decode($response->getBody()->getContents(), true)['items'] ?? [];
if ($filter->getConditionTree()) {
$result = $filter->getConditionTree()->apply($response, $this, $caller->getTimezone());
}
if ($filter->getSort()) {
$result = $filter->getSort()->apply($result);
}
if ($filter->getPage()) {
$result = $filter->getPage()->apply($result);
}
if ($filter->getSegment()) {
throw new \RuntimeException('This collection does not implements native segments');
}
if ($filter->getSearch()) {
throw new \RuntimeException('This collection is not natively searchable');
}
return $projection->apply($result);
} catch (\Exception $e) {
throw new \RuntimeException('Failed to fetch or process items: ' . $e->getMessage());
}
}
public function aggregate(Caller $caller, Filter $filter, Aggregation $aggregation, ?int $limit = null)
{
// Fetch all records which should be aggregated
$records = $this->list($caller, $filter, $aggregation->getProjection());
return $aggregation->apply($records, $caller->getTimezone(), $limit);
}Tips
Count queries
Last updated