Merge pull request #9696 from colinux/procedure-visible-by-user-faster

Perf: accélération du chargement des dossiers visibles
This commit is contained in:
mfo 2023-11-14 08:22:31 +00:00 committed by GitHub
commit 7fca13d02c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 18 additions and 7 deletions

View file

@ -223,7 +223,7 @@ class Dossier < ApplicationRecord
scope :prefilled, -> { where(prefilled: true) } scope :prefilled, -> { where(prefilled: true) }
scope :hidden_by_user, -> { where.not(hidden_by_user_at: nil) } scope :hidden_by_user, -> { where.not(hidden_by_user_at: nil) }
scope :hidden_by_administration, -> { where.not(hidden_by_administration_at: nil) } scope :hidden_by_administration, -> { where.not(hidden_by_administration_at: nil) }
scope :visible_by_user, -> { where(for_procedure_preview: false).or(where(for_procedure_preview: nil)).where(hidden_by_user_at: nil, editing_fork_origin_id: nil) } scope :visible_by_user, -> { where(for_procedure_preview: false).where(hidden_by_user_at: nil, editing_fork_origin_id: nil) }
scope :visible_by_administration, -> { scope :visible_by_administration, -> {
state_not_brouillon state_not_brouillon
.where(hidden_by_administration_at: nil) .where(hidden_by_administration_at: nil)

View file

@ -709,7 +709,7 @@ class Procedure < ApplicationRecord
close! close!
end end
dossiers.visible_by_administration.each do |dossier| dossiers.visible_by_administration.find_each do |dossier|
dossier.hide_and_keep_track!(author, :procedure_removed) dossier.hide_and_keep_track!(author, :procedure_removed)
end end

View file

@ -32,7 +32,7 @@ class Stat < ApplicationRecord
COUNT(*) FILTER ( WHERE state != 'brouillon' ) AS "not_brouillon", COUNT(*) FILTER ( WHERE state != 'brouillon' ) AS "not_brouillon",
COUNT(*) FILTER ( WHERE state != 'brouillon' and depose_at BETWEEN :one_month_ago AND :now ) AS "dossiers_depose_avant_30_jours", COUNT(*) FILTER ( WHERE state != 'brouillon' and depose_at BETWEEN :one_month_ago AND :now ) AS "dossiers_depose_avant_30_jours",
COUNT(*) FILTER ( WHERE state != 'brouillon' and depose_at BETWEEN :two_months_ago AND :one_month_ago ) AS "dossiers_deposes_entre_60_et_30_jours", COUNT(*) FILTER ( WHERE state != 'brouillon' and depose_at BETWEEN :two_months_ago AND :one_month_ago ) AS "dossiers_deposes_entre_60_et_30_jours",
COUNT(*) FILTER ( WHERE state = 'brouillon' AND editing_fork_origin_id IS NULL AND (for_procedure_preview IS NULL OR for_procedure_preview = false)) AS "brouillon", COUNT(*) FILTER ( WHERE state = 'brouillon' AND editing_fork_origin_id IS NULL AND for_procedure_preview = false) AS "brouillon",
COUNT(*) FILTER ( WHERE state = 'en_construction' ) AS "en_construction", COUNT(*) FILTER ( WHERE state = 'en_construction' ) AS "en_construction",
COUNT(*) FILTER ( WHERE state = 'en_instruction' ) AS "en_instruction", COUNT(*) FILTER ( WHERE state = 'en_instruction' ) AS "en_instruction",
COUNT(*) FILTER ( WHERE state in ('accepte', 'refuse', 'sans_suite') ) AS "termines" COUNT(*) FILTER ( WHERE state in ('accepte', 'refuse', 'sans_suite') ) AS "termines"

View file

@ -0,0 +1,5 @@
class AlterDossiersForProcedurePreviewNotNullable < ActiveRecord::Migration[7.0]
def change
add_check_constraint :dossiers, "for_procedure_preview IS NOT NULL", name: "dossiers_for_procedure_preview_null", validate: false
end
end

View file

@ -0,0 +1,7 @@
class ValidateAlterDossiersForProcedurePreviewNotNullable < ActiveRecord::Migration[7.0]
def change
validate_check_constraint :dossiers, name: "dossiers_for_procedure_preview_null"
change_column_null :dossiers, :for_procedure_preview, false, false
remove_check_constraint :dossiers, name: "dossiers_for_procedure_preview_null"
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_11_07_150217) do ActiveRecord::Schema[7.0].define(version: 2023_11_10_135533) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto" enable_extension "pgcrypto"
enable_extension "plpgsql" enable_extension "plpgsql"
@ -402,7 +402,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_11_07_150217) do
t.datetime "en_construction_at", precision: 6 t.datetime "en_construction_at", precision: 6
t.datetime "en_construction_close_to_expiration_notice_sent_at", precision: 6 t.datetime "en_construction_close_to_expiration_notice_sent_at", precision: 6
t.datetime "en_instruction_at", precision: 6 t.datetime "en_instruction_at", precision: 6
t.boolean "for_procedure_preview", default: false t.boolean "for_procedure_preview", default: false, null: false
t.boolean "forced_groupe_instructeur", default: false, null: false t.boolean "forced_groupe_instructeur", default: false, null: false
t.bigint "groupe_instructeur_id" t.bigint "groupe_instructeur_id"
t.datetime "groupe_instructeur_updated_at", precision: 6 t.datetime "groupe_instructeur_updated_at", precision: 6

View file

@ -27,7 +27,6 @@ describe Stat, type: :model do
create_list(:dossier, 2, :en_construction, depose_at: 10.days.ago, procedure:) create_list(:dossier, 2, :en_construction, depose_at: 10.days.ago, procedure:)
create_list(:dossier, 3, :en_construction, depose_at: 40.days.ago, procedure:) create_list(:dossier, 3, :en_construction, depose_at: 40.days.ago, procedure:)
create_list(:dossier, 3, :brouillon, procedure:, for_procedure_preview: nil)
create_list(:dossier, 1, :brouillon, procedure:, for_procedure_preview: false) create_list(:dossier, 1, :brouillon, procedure:, for_procedure_preview: false)
create_list(:dossier, 6, :en_instruction, procedure:) create_list(:dossier, 6, :en_instruction, procedure:)
@ -48,7 +47,7 @@ describe Stat, type: :model do
expect(stats["not_brouillon"]).to eq(18) expect(stats["not_brouillon"]).to eq(18)
expect(stats["dossiers_depose_avant_30_jours"]).to eq(2) expect(stats["dossiers_depose_avant_30_jours"]).to eq(2)
expect(stats["dossiers_deposes_entre_60_et_30_jours"]).to eq(3) expect(stats["dossiers_deposes_entre_60_et_30_jours"]).to eq(3)
expect(stats["brouillon"]).to eq(4) expect(stats["brouillon"]).to eq(1)
expect(stats["en_construction"]).to eq(5) expect(stats["en_construction"]).to eq(5)
expect(stats["en_instruction"]).to eq(6) expect(stats["en_instruction"]).to eq(6)
expect(stats["termines"]).to eq(7) expect(stats["termines"]).to eq(7)