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:
commit
c2b1d7aaaf
25 changed files with 336 additions and 175 deletions
|
@ -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
|
||||
|
|
|
@ -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?))
|
||||
|
|
7
app/jobs/dossier_index_search_terms_job.rb
Normal file
7
app/jobs/dossier_index_search_terms_job.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class DossierIndexSearchTermsJob < ApplicationJob
|
||||
discard_on ActiveRecord::RecordNotFound
|
||||
|
||||
def perform(dossier)
|
||||
dossier.index_search_terms
|
||||
end
|
||||
end
|
|
@ -1,8 +0,0 @@
|
|||
class DossierUpdateSearchTermsJob < ApplicationJob
|
||||
discard_on ActiveRecord::RecordNotFound
|
||||
|
||||
def perform(dossier)
|
||||
dossier.update_search_terms
|
||||
dossier.save!(touch: false)
|
||||
end
|
||||
end
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue