Skip to content

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 and build

Why?

The frontend application has been shaping/re-ordering fetched milestones on the client side in this fashion:

  1. Current milestones (due date > current date) are displayed on the top
  2. Milestones without due dates are next
  3. 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

Availability and Testing

Edited by euko

Merge request reports