2018-07-31 12:03:01 +02:00
class DossierSearchService
2018-07-31 12:04:49 +02:00
def self . matching_dossiers_for_gestionnaire ( search_terms , gestionnaire )
2018-07-31 14:56:21 +02:00
dossier_by_exact_id_for_gestionnaire ( search_terms , gestionnaire )
. presence || dossier_by_full_text_for_gestionnaire ( search_terms , gestionnaire )
2018-07-31 12:03:01 +02:00
end
private
2018-07-31 14:29:37 +02:00
def self . dossier_by_exact_id_for_gestionnaire ( search_terms , gestionnaire )
id = search_terms . to_i
if id != 0 && id_compatible? ( id ) # Sometimes gestionnaire is searching dossiers with a big number (ex: SIRET), ActiveRecord can't deal with them and throws ActiveModel::RangeError. id_compatible? prevents this.
2018-07-31 14:54:55 +02:00
dossiers_by_id ( id , gestionnaire )
else
Dossier . none
2018-07-31 14:29:37 +02:00
end
end
2018-07-31 12:04:49 +02:00
def self . dossiers_by_id ( id , gestionnaire )
2018-07-31 14:53:22 +02:00
( gestionnaire . dossiers . where ( id : id ) + gestionnaire . dossiers_from_avis . where ( id : id ) ) . uniq
2018-07-31 12:03:01 +02:00
end
def self . id_compatible? ( number )
2018-07-31 14:45:50 +02:00
ActiveRecord :: Type :: Integer . new . serialize ( number )
true
rescue ActiveModel :: RangeError
false
2018-07-31 12:03:01 +02:00
end
2018-07-31 14:32:17 +02:00
def self . dossier_by_full_text_for_gestionnaire ( search_terms , gestionnaire )
2018-07-31 15:08:10 +02:00
ts_vector = " to_tsvector('french', search_terms || private_search_terms) "
ts_query = " to_tsquery('french', #{ Dossier . connection . quote ( to_tsquery ( search_terms ) ) } ) "
gestionnaire
. dossiers
. not_archived
. state_not_brouillon
. where ( " #{ ts_vector } @@ #{ ts_query } " )
. order ( " COALESCE(ts_rank( #{ ts_vector } , #{ ts_query } ), 0) DESC " )
end
def self . to_tsquery ( search_terms )
2018-08-22 18:36:24 +02:00
search_terms . strip
. gsub ( / ['? \\ :&|!] / , " " ) # drop disallowed characters
. split ( / \ s+ / ) # split words
. map { | x | " #{ x } :* " } # enable prefix matching
2018-07-31 15:08:10 +02:00
. join ( " & " )
2018-07-31 14:32:17 +02:00
end
2018-07-31 12:03:01 +02:00
end