Skip to content

Commit 70ff641

Browse files
committed
Implemented sparse fieldsets PR feedback and improved handling of aggregated data
1 parent cd61bff commit 70ff641

File tree

3 files changed

+41
-44
lines changed

3 files changed

+41
-44
lines changed

src/inc/apiv2/common/AbstractBaseAPI.class.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ protected function obj2Array(object $obj): array {
551551
* @throws NotFoundExceptionInterface
552552
* @throws ContainerExceptionInterface
553553
*/
554-
protected function obj2Resource(object $obj, array $expandResult = [], array $sparseFieldsets = null): array {
554+
protected function obj2Resource(object $obj, array $expandResult = [], array $sparseFieldsets = null, array $aggregateFieldsets = null): array {
555555
// Convert values to JSON supported types
556556
$features = $obj->getFeatures();
557557
$kv = $obj->getKeyValueDict();
@@ -571,12 +571,8 @@ protected function obj2Resource(object $obj, array $expandResult = [], array $sp
571571
}
572572

573573
// If sparse fieldsets (https://jsonapi.org/format/#fetching-sparse-fieldsets) is used, return only the requested data
574-
if (is_array($sparseFieldsets)) {
575-
if (array_key_exists($this->getObjectTypeName($obj), $sparseFieldsets)) {
576-
if (!in_array($feature['alias'], $sparseFieldsets[$this->getObjectTypeName($obj)])) {
577-
continue;
578-
}
579-
}
574+
if (is_array($sparseFieldsets) && array_key_exists($this->getObjectTypeName($obj), $sparseFieldsets) && !in_array($feature['alias'], $sparseFieldsets[$this->getObjectTypeName($obj)])) {
575+
continue;
580576
}
581577

582578
// Hide the primaryKey from the attributes since this is used as indentifier (id) in response
@@ -590,8 +586,8 @@ protected function obj2Resource(object $obj, array $expandResult = [], array $sp
590586

591587
$attributes[$feature['alias']] = $apiClass::db2json($feature, $kv[$name]);
592588
}
593-
594-
$aggregatedData = $apiClass::aggregateData($obj, $sparseFieldsets);
589+
590+
$aggregatedData = $apiClass::aggregateData($obj, $aggregateFieldsets);
595591
$attributes = array_merge($attributes, $aggregatedData);
596592

597593
/* Build JSON::API relationship resource */
@@ -1429,23 +1425,23 @@ protected static function getOneResource(object $apiClass, object $object, Reque
14291425
// Convert objects to data resources
14301426
foreach ($objects as $object) {
14311427
// Create object
1432-
$newObject = $apiClass->obj2Resource($object, $expandResult, $request->getQueryParams()['fields'] ?? null);
1428+
$newObject = $apiClass->obj2Resource($object, $expandResult, $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null);
14331429

14341430
// For compound document, included resources
14351431
foreach ($expands as $expand) {
14361432
if (array_key_exists($object->getId(), $expandResult[$expand])) {
14371433
$expandResultObject = $expandResult[$expand][$object->getId()];
14381434
if (is_array($expandResultObject)) {
14391435
foreach ($expandResultObject as $expandObject) {
1440-
$includedResources[] = $apiClass->obj2Resource($expandObject, [], $request->getQueryParams()['fields'] ?? null);
1436+
$includedResources[] = $apiClass->obj2Resource($expandObject, [], $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null);
14411437
}
14421438
}
14431439
else {
14441440
if ($expandResultObject === null) {
14451441
// to-only relation which is nullable
14461442
continue;
14471443
}
1448-
$includedResources[] = $apiClass->obj2Resource($expandResultObject, [], $request->getQueryParams()['fields'] ?? null);
1444+
$includedResources[] = $apiClass->obj2Resource($expandResultObject, [], $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null);
14491445
}
14501446
}
14511447
}

src/inc/apiv2/common/AbstractModelAPI.class.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -747,22 +747,22 @@ public static function getManyResources(object $apiClass, Request $request, Resp
747747
// Convert objects to data resources
748748
foreach ($objects as $object) {
749749
// Create object
750-
$newObject = $apiClass->obj2Resource($object, $expandResult, $request->getQueryParams()['fields'] ?? null);
750+
$newObject = $apiClass->obj2Resource($object, $expandResult, $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null);
751751

752752
// For compound document, included resources
753753
foreach ($expands as $expand) {
754754
if (array_key_exists($object->getId(), $expandResult[$expand])) {
755755
$expandResultObject = $expandResult[$expand][$object->getId()];
756756
if (is_array($expandResultObject)) {
757757
foreach ($expandResultObject as $expandObject) {
758-
$includedResources = self::addToRelatedResources($includedResources, $apiClass->obj2Resource($expandObject, [], $request->getQueryParams()['fields'] ?? null));
758+
$includedResources = self::addToRelatedResources($includedResources, $apiClass->obj2Resource($expandObject, [], $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null));
759759
}
760760
} else {
761761
if ($expandResultObject === null) {
762762
// to-only relation which is nullable
763763
continue;
764764
}
765-
$includedResources = self::addToRelatedResources($includedResources, $apiClass->obj2Resource($expandResultObject, [], $request->getQueryParams()['fields'] ?? null));
765+
$includedResources = self::addToRelatedResources($includedResources, $apiClass->obj2Resource($expandResultObject, [], $request->getQueryParams()['fields'] ?? null, $request->getQueryParams()['aggregate'] ?? null));
766766
}
767767
}
768768
}

src/inc/apiv2/model/tasks.routes.php

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -160,45 +160,46 @@ protected function createObject(array $data): int {
160160
return $task->getId();
161161
}
162162

163-
//TODO make aggregate data queryable
164-
static function aggregateData(object $object, array $sparseFieldsets = null): array {
163+
static function aggregateData(object $object, array $aggregateFieldsets = null): array {
165164
$aggregatedData = [];
166165
$keyspace = $object->getKeyspace();
167166
$keyspaceProgress = $object->getKeyspaceProgress();
168167

169-
if(is_array($sparseFieldsets) && array_key_exists('task', $sparseFieldsets) && in_array("dispatched", $sparseFieldsets['task']) ) {
170-
$aggregatedData["dispatched"] = Util::showperc($keyspaceProgress, $keyspace);
171-
}
168+
if(is_null($aggregateFieldsets) || (is_array($aggregateFieldsets) && array_key_exists('task', $aggregateFieldsets))) {
169+
if(is_null($aggregateFieldsets) || in_array("dispatched", $aggregateFieldsets['task'])) {
170+
$aggregatedData["dispatched"] = Util::showperc($keyspaceProgress, $keyspace);
171+
}
172172

173-
if(is_array($sparseFieldsets) && array_key_exists('task', $sparseFieldsets) && in_array("searched", $sparseFieldsets['task']) ) {
174-
$aggregatedData["searched"] = Util::showperc(TaskUtils::getTaskProgress($object), $keyspace);
175-
}
173+
if(is_null($aggregateFieldsets) || in_array("searched", $aggregateFieldsets['task'])) {
174+
$aggregatedData["searched"] = Util::showperc(TaskUtils::getTaskProgress($object), $keyspace);
175+
}
176176

177-
if(is_array($sparseFieldsets) && array_key_exists('task', $sparseFieldsets) && in_array("activeAgents", $sparseFieldsets['task']) ) {
178-
$qF = new QueryFilter(Chunk::TASK_ID, $object->getId(), "=");
179-
$chunks = Factory::getChunkFactory()->filter([Factory::FILTER => $qF]);
180-
181-
$activeAgents = [];
182-
foreach ($chunks as $chunk) {
183-
if (time() - max($chunk->getSolveTime(), $chunk->getDispatchTime()) < SConfig::getInstance()->getVal(DConfig::CHUNK_TIMEOUT) && $chunk->getProgress() < 10000) {
184-
$activeAgents[$chunk->getAgentId()] = true;
177+
if(is_null($aggregateFieldsets) || in_array("activeAgents", $aggregateFieldsets['task'])) {
178+
$qF = new QueryFilter(Chunk::TASK_ID, $object->getId(), "=");
179+
$chunks = Factory::getChunkFactory()->filter([Factory::FILTER => $qF]);
180+
181+
$activeAgents = [];
182+
foreach ($chunks as $chunk) {
183+
if (time() - max($chunk->getSolveTime(), $chunk->getDispatchTime()) < SConfig::getInstance()->getVal(DConfig::CHUNK_TIMEOUT) && $chunk->getProgress() < 10000) {
184+
$activeAgents[$chunk->getAgentId()] = true;
185+
}
185186
}
187+
188+
$aggregatedData["activeAgents"] = array_keys($activeAgents);
186189
}
187-
188-
$aggregatedData["activeAgents"] = array_keys($activeAgents);
189-
}
190190

191-
if(is_array($sparseFieldsets) && array_key_exists('task', $sparseFieldsets) && in_array("searched", $sparseFieldsets['task']) ) {
192-
//status 1 is running, 2 is idle and 3 is completed
193-
$status = 2;
194-
if ($keyspaceProgress >= $keyspace && $keyspaceProgress > 0) {
195-
$status = 3;
196-
}
197-
elseif (count($activeAgents) > 0) {
198-
$status = 1;
191+
if(is_null($aggregateFieldsets) || in_array("status", $aggregateFieldsets['task'])) {
192+
//status 1 is running, 2 is idle and 3 is completed
193+
$status = 2;
194+
if ($keyspaceProgress >= $keyspace && $keyspaceProgress > 0) {
195+
$status = 3;
196+
}
197+
elseif (count($activeAgents) > 0) {
198+
$status = 1;
199+
}
200+
201+
$aggregatedData["status"] = $status;
199202
}
200-
201-
$aggregatedData["status"] = $status;
202203
}
203204

204205
return $aggregatedData;

0 commit comments

Comments
 (0)