Reorganize auto merge related information into the dedicated table - `auto_merges`
# Problem Today, `auto_merge_strategy` (The strategy to merge a merge request automatically e.g. MWPS, etc) is persisted in `merge_requests.merge_params` column. This is a `text` type column in database and it's casted as Hash in rails. We also use `merge_requests.merge_user` for the user who triggered the auto merge and `merge_requests.merge_when_pipeline_succeeds` (The internal alias is `auto_merge_enabled`) for the flag if the merge request is to be marked to be auto merged. The problem is that when we search merge requests with a specific auto merge strategy, it requires to filter with `merge_params` column (e.g. `(merge_params SIMILAR TO '%(auto\_merge\_strategy: merge\_when\_pipeline\_succeeds)%')`). This is not performant process if the query processes the regexp search to many rows. Thus, we'd need something better architecture. # Proposal I'd propose to have the following architecture at the second iteration. **Introduce a new table to manage all auto merged merge requests** ``` create_table "auto_merges", force: :cascade do |t| t.integer "merge_request_id", null: false t.integer "user_id", null: false t.integer "strategy", null: false, limit: 2 t.integer "pipeline_id" t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "target_project_id", null: false t.text "target_branch", null: false t.index ["merge_request_id"], name: "index_merge_trains_on_merge_request_id", unique: true t.index ["pipeline_id"], name: "index_merge_trains_on_pipeline_id" t.index ["target_project_id"], name: "index_merge_trains_on_target_project_id" t.index ["user_id"], name: "index_merge_trains_on_user_id" end ``` This is basically the same table architecture with `merge_trains` today. We can reuse/extend the existing architecture for more general purpose. ``` class AutoMerge < ApplicationRecord belongs_to :target_project, class_name: "Project" belongs_to :merge_request belongs_to :user enum strategy: { merge_when_pipeline_succeeds: 0, merge_train: 1 add_to_merge_train_when_pipeline_succeeds: 2 } ## ... end ``` With that, we can - Migrate all `merge_requests.merge_params` and `merge_requests.merge_user` to the `auto_merges` table. - Migrate all `merge_trains` rows to the `auto_merges` table. - Deprecate/Remove column `merge_requests.merge_when_pipeline_succeeds` (boolean) - Deprecate/Remove column `merge_requests.merge_user` - Deprecate/Remove table `merge_trains`
issue