Skip to content

Commit 9ab843e

Browse files
author
Bertrand Dunogier
committed
Implemented sort clauses on type collections. Limited to metadata sort clauses.
``` { content { items(sortBy: [_datePublished, _desc, _name]) { } } } ```
1 parent dc4842f commit 9ab843e

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

DomainContent/SchemaWorker/ContentType/AddDomainContentToDomainGroup.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public function work(array &$schema, array $args)
3737
'type' => "ContentSearchQuery",
3838
'description' => "A Content query used to filter results"
3939
],
40+
'sortBy' => [
41+
'type' => '[SortByOptions]',
42+
'description' => "A sort clause, or array of clauses. Add _desc after a clause to reverse it"
43+
],
4044
],
4145
];
4246

GraphQL/InputMapper/SearchQueryMapper.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,37 @@ public function mapInputToQuery(array $inputArray)
5151
$criteria = array_merge($criteria, $this->mapDateMetadata($inputArray, 'Modified'));
5252
$criteria = array_merge($criteria, $this->mapDateMetadata($inputArray, 'Created'));
5353

54+
if (isset($inputArray['sortBy'])) {
55+
$query->sortClauses = array_map(
56+
function ($sortClauseClass) {
57+
/** @var Query\SortClause $lastSortClause */
58+
static $lastSortClause;
59+
60+
if ($sortClauseClass === Query::SORT_DESC) {
61+
if (!$lastSortClause instanceof Query\SortClause) {
62+
return null;
63+
}
64+
65+
$lastSortClause->direction = $sortClauseClass;
66+
return null;
67+
}
68+
69+
if (!class_exists($sortClauseClass)) {
70+
return null;
71+
}
72+
73+
if (!in_array(Query\SortClause::class, class_parents($sortClauseClass))) {
74+
return null;
75+
}
76+
77+
return $lastSortClause = new $sortClauseClass;
78+
},
79+
$inputArray['sortBy']
80+
);
81+
// remove null entries left out because of sort direction
82+
$query->sortClauses = array_filter($query->sortClauses);
83+
}
84+
5485
if (count($criteria) === 0) {
5586
return $query;
5687
}

GraphQL/Resolver/DomainContentResolver.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ private function findContentItemsByTypeIdentifier($contentTypeIdentifier, Argume
9595
{
9696
$queryArg = $args['query'];
9797
$queryArg['ContentTypeIdentifier'] = $contentTypeIdentifier;
98+
if (isset($args['sortBy'])) {
99+
$queryArg['sortBy'] = $args['sortBy'];
100+
}
98101
$args['query'] = $queryArg;
99102

100103
$query = $this->queryMapper->mapInputToQuery($args['query']);

Resources/config/graphql/Search.types.yml

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,30 @@ DateCriterionOperator:
8181
config:
8282
values:
8383
before: {}
84-
after: {}
84+
after: {}
85+
86+
SortByOptions:
87+
type: enum
88+
config:
89+
values:
90+
_contentId:
91+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\ContentId'
92+
description: "Sort by content id"
93+
_name:
94+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\ContentName'
95+
description: "Sort by content name"
96+
_dateModified:
97+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\DateModified'
98+
description: "Sort by last modification date"
99+
_datePublished:
100+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\DatePublished'
101+
description: "Sort by initial publication date"
102+
_sectionIdentifier:
103+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\SectionIdentifier'
104+
description: "Sort by content section identifier"
105+
_sectionName:
106+
value: '\eZ\Publish\API\Repository\Values\Content\Query\SortClause\SectionName'
107+
description: "Sort by section name"
108+
_desc:
109+
value: 'descending'
110+
description: "Reverse the previous sorting option"

0 commit comments

Comments
 (0)