Wrap current iterations at a group level into an iteration cadence
What does this MR do?
- adds the
IterationCadence
model and respective migration- association with
Iteration
- association with
- adds migration to wrap iterations under the iteration cadences
- for every group that contains an iteration create an iteration cadence record. Set
iteration_cadence_id
to all iterations accordingly
- for every group that contains an iteration create an iteration cadence record. Set
Assigning iterations to a default iteration cadence
- new iteration cadence is created if none exists for the iteration group
- when creating, iteration cadence
start_date
is set to the iteration start date -
last_run_date
isnil
Migrations
Note: Iteration
model -> sprints
table
Running migrations
Migrations up
== 20201228110136 CreateIterationsCadence: migrating ==========================
-- create_table(:iterations_cadences, {})
-- quote_column_name(:title)
-> 0.0000s
-> 0.0162s
-- quote_table_name("check_fedff82d3b")
-> 0.0000s
-- quote_table_name(:iterations_cadences)
-> 0.0000s
-- execute("ALTER TABLE \"iterations_cadences\"\nADD CONSTRAINT \"check_fedff82d3b\" CHECK (char_length(\"title\") <= 255)\n")
-> 0.0013s
== 20201228110136 CreateIterationsCadence: migrated (0.0253s) =================
== 20201228110238 AddIterationsCadenceToSprints: migrating ====================
-- column_exists?(:sprints, :iterations_cadence_id)
-> 0.0020s
-- add_column(:sprints, :iterations_cadence_id, :integer)
-> 0.0016s
-- transaction_open?()
-> 0.0000s
-- index_exists?(:sprints, :iterations_cadence_id, {:name=>"index_sprints_iterations_cadence_id", :algorithm=>:concurrently})
-> 0.0068s
-- execute("SET statement_timeout TO 0")
-> 0.0006s
-- add_index(:sprints, :iterations_cadence_id, {:name=>"index_sprints_iterations_cadence_id", :algorithm=>:concurrently})
-> 0.0037s
-- execute("RESET ALL")
-> 0.0006s
-- transaction_open?()
-> 0.0000s
-- foreign_keys(:sprints)
-> 0.0041s
-- execute("ALTER TABLE sprints\nADD CONSTRAINT fk_365d1db505\nFOREIGN KEY (iterations_cadence_id)\nREFERENCES iterations_cadences (id)\nON DELETE CASCADE\nNOT VALID;\n")
-> 0.0014s
-- execute("ALTER TABLE sprints VALIDATE CONSTRAINT fk_365d1db505;")
-> 0.0024s
== 20201228110238 AddIterationsCadenceToSprints: migrated (0.0294s) ===========
== 20201231133921 ScheduleSetDefaultIterationCadences: migrating ==============
== 20201231133921 ScheduleSetDefaultIterationCadences: migrated (0.0380s) =====
Migrations down
== 20201231133921 ScheduleSetDefaultIterationCadences: reverting ==============
== 20201231133921 ScheduleSetDefaultIterationCadences: reverted (0.0000s) =====
== 20201228110238 AddIterationsCadenceToSprints: reverting ====================
-- column_exists?(:sprints, :iterations_cadence_id)
-> 0.0015s
-- remove_column(:sprints, :iterations_cadence_id)
-> 0.0022s
== 20201228110238 AddIterationsCadenceToSprints: reverted (0.0038s) ===========
== 20201228110136 CreateIterationsCadence: reverting ==========================
-- table_exists?(:iterations_cadences)
-> 0.0006s
-- drop_table(:iterations_cadences)
-> 0.0037s
== 20201228110136 CreateIterationsCadence: reverted (0.0045s) =================
Queries
Counts
gitlabhq_production=> SELECT COUNT(*) FROM sprints;
count
-------
4041
(1 row)
gitlabhq_production=> SELECT COUNT(DISTINCT sprints.group_id) FROM sprints;
count
-------
1724
(1 row)
Scheduling the migration
SELECT DISTINCT "sprints"."group_id" FROM "sprints"
https://explain.depesz.com/s/llU6
Creating Iteration cadences (dev example)
INSERT INTO "iteration_cadences" ("group_id", "duration", "iterations_in_advance", "is_active", "automatic", "title", "start_date", "last_run_date", "created_at", "updated_at")
VALUES (26, NULL, NULL, TRUE, FALSE, 'Default Iteration Cadence', '2021-02-19', '2021-02-19', '2021-01-25 12:31:20.503342', '2021-01-25 12:31:20.503344'), (27, NULL, NULL, TRUE, FALSE, 'Default Iteration Cadence', '2020-12-30', '2020-12-30', '2021-01-25 12:31:20.516903', '2021-01-25 12:31:20.516904')
Assigning iterations to the cadences (dev example)
- for each affected group
Iteration Exists? (0.2ms) SELECT 1 AS one FROM "sprints" WHERE "sprints"."group_id" = 27 LIMIT 1
Iterations::IterationCadence Load (0.2ms) SELECT "iteration_cadences".* FROM "iteration_cadences" WHERE "iteration_cadences"."group_id" = 27 LIMIT 1
Iteration Update All (0.6ms) UPDATE "sprints" SET "iteration_cadence_id" = 2 WHERE "sprints"."group_id" = 27
Does this MR meet the acceptance criteria?
Conformity
- [-] Changelog entry
- [-] Documentation (if required)
-
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides - [-] Separation of EE specific content
Availability and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process.
Follow-up tasks
Related to #293921 (closed)