Allow sorting for listing milestones via GraphQL and expose expired attr [RUN ALL RSPEC] [RUN AS-IF-FOSS]
What does this MR do?
Resolves #333354 (closed)
- Adds a new custom sort method on the Milestone model (
sort_with_expired_last
) and updates the Milestone finder to use the method. - (API change) Allow querying milestones with sort options.
-
(API change) Exposes
expired
field on Milestone GraphQL type. - Refactors milestone related specs to run faster by using
let_it_be
andbuild
Why?
The frontend application has been shaping/re-ordering fetched milestones on the client side in this fashion:
- Current milestones (due date > current date) are displayed on the top
- Milestones without due dates are next
- Expired milestones (due date <= current date) are displayed in the bottom
Milestones are then sorted by due date (asc) in each layer. This MR adds a backend support for this custom order.
More context available in this discussion thread #333354 (comment 598786176).
Sample GraphQL Queries
{
group(fullPath: "gitlab-org") {
milestones(sort: CREATED_ASC) {
nodes {
title
dueDate
expired
}
}
}
}
{
group(fullPath: "gitlab-org") {
milestones(sort: EXPIRED_LAST_DUE_DATE_ASC) {
nodes {
title
dueDate
expired
}
}
}
}
Database Review
SELECT "milestones".*
FROM ((SELECT "milestones".* FROM "milestones" WHERE 1 = 0)
UNION ALL (SELECT "milestones".* FROM "milestones" WHERE "milestones"."group_id" = 9970)) milestones
WHERE
("milestones"."state" IN ('active'))
ORDER BY
(CASE WHEN due_date IS NULL THEN 1 WHEN due_date > now() THEN 0 ELSE 2 END) ASC,
"milestones"."due_date" ASC,
"milestones"."id" DESC
Query Plan: https://explain.depesz.com/s/ioHB
Does this MR meet the acceptance criteria?
Conformity
-
I have included changelog trailers, or none are needed. (Does this MR need a changelog?) -
I have added/updated documentation, or it's not needed. (Is documentation required?) -
I have properly separated EE content from FOSS, or this MR is FOSS only. (Where should EE code go?) -
I have added information for database reviewers in the MR description, or it's not needed. (Does this MR have database related changes?) -
I have self-reviewed this MR per code review guidelines. -
This MR does not harm performance, or I have asked a reviewer to help assess the performance impact. (Merge request performance guidelines) -
I have followed the style guides. - [-] This change is backwards compatible across updates, or this does not apply.
Availability and Testing
-
I have added/updated tests following the Testing Guide, or it's not needed. (Consider all test levels. See the Test Planning Process.) - [-] I have tested this MR in all supported browsers, or it's not needed.
- [-] I have informed the Infrastructure department of a default or new setting change per definition of done, or it's not needed.
Edited by euko