Merge pull request #10261 from colinux/ignore-search-terms-2

Tech (perf): ignore les `search_terms` colonnes pour ne plus les select à chaque query et debounce l'indexation
This commit is contained in:
Colin Darie 2024-05-21 07:07:10 +00:00 committed by GitHub
commit c2b1d7aaaf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 336 additions and 175 deletions

View file

@ -280,6 +280,7 @@ module Instructeurs
end
dossier.save(context: :champs_private_value)
dossier.index_search_terms_later
respond_to do |format|
format.turbo_stream do

View file

@ -303,6 +303,8 @@ module Users
@dossier = dossier_with_champs(pj_template: false)
@errors = update_dossier_and_compute_errors
@dossier.index_search_terms_later if @errors.empty?
respond_to do |format|
format.turbo_stream do
@to_show, @to_hide, @to_update = champs_to_turbo_update(champs_public_attributes_params, dossier.champs.filter(&:public?))

View file

@ -0,0 +1,7 @@
class DossierIndexSearchTermsJob < ApplicationJob
discard_on ActiveRecord::RecordNotFound
def perform(dossier)
dossier.index_search_terms
end
end

View file

@ -1,8 +0,0 @@
class DossierUpdateSearchTermsJob < ApplicationJob
discard_on ActiveRecord::RecordNotFound
def perform(dossier)
dossier.update_search_terms
dossier.save!(touch: false)
end
end

View file

@ -71,7 +71,7 @@ module DossierCloneConcern
touch(:last_champ_updated_at)
end
reload
update_search_terms_later
index_search_terms_later
editing_fork.destroy_editing_fork!
end
@ -120,6 +120,7 @@ module DossierCloneConcern
end
end
cloned_dossier.index_search_terms_later if !fork
cloned_dossier.reload
end

View file

@ -1,23 +1,40 @@
# frozen_string_literal: true
module DossierSearchableConcern
extend ActiveSupport::Concern
included do
before_save :update_search_terms
after_commit :index_search_terms_later, if: -> { previously_new_record? || user_previously_changed? || mandataire_first_name_previously_changed? || mandataire_last_name_previously_changed? }
def update_search_terms
self.search_terms = [
SEARCH_TERMS_DEBOUNCE = 30.seconds
kredis_flag :debounce_index_search_terms_flag
def index_search_terms
DossierPreloader.load_one(self)
search_terms = [
user&.email,
*champs_public.flat_map(&:search_terms),
*etablissement&.search_terms,
individual&.nom,
individual&.prenom
individual&.prenom,
mandataire_first_name,
mandataire_last_name
].compact_blank.join(' ')
self.private_search_terms = champs_private.flat_map(&:search_terms).compact_blank.join(' ')
private_search_terms = champs_private.flat_map(&:search_terms).compact_blank.join(' ')
sql = "UPDATE dossiers SET search_terms = :search_terms, private_search_terms = :private_search_terms WHERE id = :id"
sanitized_sql = self.class.sanitize_sql_array([sql, search_terms:, private_search_terms:, id:])
self.class.connection.execute(sanitized_sql)
end
def update_search_terms_later
DossierUpdateSearchTermsJob.perform_later(self)
def index_search_terms_later
return if debounce_index_search_terms_flag.marked?
debounce_index_search_terms_flag.mark(expires_in: SEARCH_TERMS_DEBOUNCE)
DossierIndexSearchTermsJob.set(wait: SEARCH_TERMS_DEBOUNCE).perform_later(self)
end
end
end

View file

@ -13,6 +13,8 @@ module DossierStateConcern
MailTemplatePresenterService.create_commentaire_for_state(self, Dossier.states.fetch(:en_construction))
procedure.compute_dossiers_count
index_search_terms_later
end
def after_commit_passer_en_construction

View file

@ -1,5 +1,5 @@
class Dossier < ApplicationRecord
self.ignored_columns += [:re_instructed_at]
self.ignored_columns += [:re_instructed_at, :search_terms, :private_search_terms]
include DossierCloneConcern
include DossierCorrectableConcern

View file

@ -17,6 +17,8 @@ class Etablissement < ApplicationRecord
fermé: "fermé"
}, _prefix: true
after_commit -> { dossier&.index_search_terms_later }
def entreprise_raison_sociale
read_attribute(:entreprise_raison_sociale).presence || raison_sociale_for_ei
end

View file

@ -17,6 +17,8 @@ class Individual < ApplicationRecord
validates :email, strict_email: true, presence: true, if: -> { dossier.for_tiers? && self.email? }, on: :update
after_commit -> { dossier.index_search_terms_later }, if: -> { nom_previously_changed? || prenom_previously_changed? }
GENDER_MALE = "M."
GENDER_FEMALE = 'Mme'