U
    e]                    @   s   d dl Z d dlZd dlT d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZe	 ZedZedZdddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldldmdndododpdqdrdsdtdudvdwdxdydzdzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd	d
ddddddddddddddddddddddddddd d d!d"d#d$d%d%d%d&d'd(d)d*d*d+d,d-d.d/d0d1d2d3d3d4d5d6d6d7d8d9d:d:d:d;d<d=d>d>d?d@dAdBdCdCdDdEdEdEdFdGdHdIdJdKdKdLdMdMdMdNdOdOdPdQdRdSdSdTdUdUdVdVdWdXdYdYdZd[d\d]d]d^d^d_d_d`dadbdcdddedfdgdhdidjdjdkdldldmdndodpdqdrdsdsdtdtdududvdwdxdxdxdydydzdzd{d|d}d~d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddÐdÐdÐdÐdÐdÐdĐdĐdĐdĐdĐdĐdĐdĐdŐdŐdŐdŐdŐdŐdŐdŐdŐdŐdƐdƐdƐdƐdƐdƐdƐdƐdƐdǐdǐdǐdǐdǐdǐdȐdȐdȐdȐdȐdȐdȐdȐdȐdȐdɐdɐdɐdɐdɐdɐdɐdɐdɐdɐdɐdʐdʐdʐdʐdʐdʐdʐdʐdʐdʐdʐdʐdʐdʐdːdːdːdːdːdːdːdːdːdːdːdːd̐Zdd͐dΐdϐdАdѐdҐdӐdԐdՐdd'dאdؐdِdڐdېdܐdݐdސdߐddddddddddddddddddddddddddddddddd ddddddddedd	d
ddddddddddddddddddddddddd d!d"d#d$dd%d&d'd(dd)ddd*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:dd;d<d=d>d?d@dAdBdCdDdEdFdGdHdIddJdKdLdMdNdOdPdĐdQdRdSdTdTdUdVdVd͐dWdXdYdZd[d\d]d^ddِd_d_d`dadbdcdddedfdgdhddidjddkdldmdddndndododdpdqdrdrdsdtdududvdwdxdyddzdd{d d|d|d}dd~dddddd	d
dddddddddddddddddddddddddddddddd!dddd%dd(dd)dddd+dd.dddddd2dd5d7d7ddddddd<dddddd>d>dd?dd@dAddBddddDdFddGddHdJdJdddKddRdRdddUdWddYd\ddddddddddddddldldddddndndddqdqddsdÐdvdvdwdydydzdzd{dĐd|d~d~dŐdŐdƐdddǐdddȐdȐdɐdɐdʐdʐdʐddːd̐d̐d̐dd͐ddddddddddddddΐdΐdΐdΐdϐdϐddddddddddddАdАdАdddddddddddddddddѐdѐdddҐddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddÐdÐdÐdĐdĐdĐdĐdĐdĐdĐdŐdŐdŐdŐdŐdƐdƐdƐdǐdǐdǐdǐdǐdǐdǐdǐdȐdȐdȐdȐdȐdɐdɐdɐdɐdɐdɐdɐdɐdɐdɐdɐdʐdʐdʐdʐdʐdʐdʐdʐdʐdːdːdːdːdːdːdӐdӐdӐdӐdӐdӐdӐdӐdӐdӐdӐdӐdԐdԐdԐdԐdԐdԐdԐdԐdԐdԐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐdՐd֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐d֐dאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdאdd d d d d d d d d d d d d d d d d d d d d d d d d dؐZdِdڄ ZdZdZeeeeZeeeeZdݐdބ Zdߐd Zdd ZG dd dejjjZdS (      N)*)SQLAlchemyDataDriveren_USru_RUi'  i$  i#  iH   ib  iC  i  i  i}  i  i+  i  i  is  iC  i  i  i  ip  i  i  i  i  i  i  ia  i  i  iy  iC  i  i  i  i  i  i  i  i  i  i[  i?  i  i  i  i  i  i:  i  i  iO  i>  i  i  i  i  iZ  i  i  i  i  i9  i
  i
  i
  in
  im
  iU
  iJ
  i/
  i$
  i
  i	  i	  i	  i	  i[	  i?	  i0	  i  i  iD  i/  i$  i  i  i  i  i  i  i  iM  i?  i8  i2  i  i  iu  iR  iM  iC  i8  i6  i4  i   i  i  i  i  i  i  i  i  i  i  i  i  iw  ih  if  iY  iL  i<  i2  i#  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  iy  ig  ie  iV  iP  iL  iA  i6  i0  i.  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  iv  ij  ic  i^  i[  iZ  iU  iR  iJ  iH  iF  iC  i=  i9  i%  i!  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  iw  in  ic  i^  i]  iZ  iN  iI  iF  iE  i8  i0  i)  i  i  i  i  i  i  i
  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i}  ix  is  iq  ip  io  im  il  if  id  ic  i\  i[  iX  iT  iO  iN  iL  iD  i?  i>  i9  i8  i6  i3  i2  i0  i.  i*  i'  i$  i"  i   i  i  i  i  i  i
  i  i  i  i  i                                                                                                                                                                          ~   {   z   y   v   u   s   q   p   o   m   l   k   j   i   g   f   e   c   a   `   _   ^   \   [   Z   Y   W   V   U   R   Q   N   M   J   I   G   F   D   C   B   A   @   ?   >   =   :   9   8   7   6   3   2   1   0   /   .   -   ,   +   *   (   '   %   $   #   "   !                                                                      
   	            (  u   стu   тоu   ноu   наu   поu   енu   ниu   коu   раu   овu   неu   роu   прu   алu   гоu   реu   осu   лиu   каu   воu   ерu   таu   отu   ваu   орu   олu   етu   теu   омu   анu   елu   одu   тьu   лаu   онu   леu   лоu   есu   атu   риu   льu   деu   огu   веu   ныu   тиu   заu   итu   скu   даu   акu   ойu   инu   меu   емu   илu   чеu   обu   асu   доu   моu   киu   трu   сяu   едu   соu   миu   ннu   сеu   амu   исu   авu   жеu   азu   маu   имu   твu   арu   виu   иеu   руu   боu   слu   изu   выu   диu   быu   ияu   икu   егu   пеu   ивu   чтu   всu   ейu   сьu   окu   ьнu   оеu   нуu   сиu   ихu   этu   хоu   адu   чаu   ожu   аяu   спu   ляu   евu   ичu   муu   чиu   шеu   тсu   днu   куu   удu   ыхu   саu   екu   беu   очu   ийu   паu   циu   крu   знu   опu   аеu   дуu   ииu   щеu   туu   ыеu   ыйu   ирu   тыu   озu   внu   ылu   рыu   ятu   утu   тнu   жиu   нтu   усu   ссu   шиu   идu   ымu   няu   гаu   свu   езu   луu   ктu   мыu   мнu   ееu   ужu   уюu   влu   улu   грu   пиu   ажu   брu   абu   учu   дрu   цеu   аюu   ечu   снu   ачu   гиu   чнu   суu   глu   люu   жнu   ахu   ебu   буu   рнu   урu   ьсu   ывu   щиu   ньu   звu   плu   апu   жаu   гдu   ряu   нсu   ькu   угu   блu   оиu   лсu   ждu   ашu   баu   биu   умu   ицu   епu   ртu   здu   ютu   зоu   ежu   врu   длu   укu   упu   клu   шаu   ешu   ошu   пуu   смu   агu   двu   вуu   кеu   ткu   ацu   йсu   ояu   айu   зиu   иоu   дыu   убu   нкu   ысu   ытu   игu   ехu   ющu   ещu   хаu   ндu   дсu   рмu   ялu   геu   янu   гуu   июu   лыu   ушu   рсu   фиu   тяu   цаu   зыu   вшu   охu   ишu   змu   фоu   ьшu   иаu   нцu   ксu   ямu   шкu   увu   рьu   зуu   ргu   ибu   рвu   ядu   срu   зеu   чуu   шлu   феu   мяu   явu   унu   шьu   лнu   ьюu   ркu   ьеu   чкu   дьu   ущu   щаu   ышu   ооu   еоu   ухu   бяu   вкu   сыu   ясu   втu   йнu   зрu   ецu   юдu   язu   бнu   лкu   бщu   узu   ржu   вяu   мпu   кнu   ллu   дяu   уеu   квu   счu   шнu   взu   юбu   оцu   ижu   ипu   яеu   ьяu   пыu   ащu   дкu   рдu   лжu   офu   аиu   хиu   ящu   яхu   хнu   ощu   злu   фаu   ырu   экu   вдu   шоu   бсu   ынu   зяu   шуu   згu   тлu   ьмu   впu   хрu   млu   ьтu   йтu   жуu   гнu   еаu   пяu   ыкu   ршu   нгu   бъu   еяu   ммu   оюu   яюu   ьзu   ыбu   цыu   ъеu   кцu   схu   сдu   ыпu   афu   чьu   якu   ауu   ючu   ищu   дпu   рхu   нчu   мсu   уаu   фрu   вьu   цоu   дцu   ычu   йчu   ефu   тдu   збu   хуu   зкu   лгu   хвu   пнu   ифu   вмu   нюu   джu   нфu   оэu   йдu   яжu   ппu   ыдu   еиu   штu   жкu   юсu   еюu   мкu   цуu   ячu   юрu   рбu   элu   дмu   йкu   сшu   рюu   сюu   дтu   рпu   щуu   хлu   тчu   ярu   ъяu   ррu   чшu   ьбu   ыгu   бкu   йшu   птu   мьu   рчu   тмu   гкu   зьu   пкu   рлu   еуu   ьцu   нщu   ягu   ьгu   кжu   псu   бхu   уйu   сбu   цкu   фуu   мбu   ьиu   пьu   лчu   яяu   сцu   оуu   тпu   цвu   яцu   ттu   энu   лтu   ызu   щнu   хеu   тюu   ябu   ддu   зжu   сфu   нрu   яйu   нвu   дшu   ввu   йоu   рцu   юнu   флu   аоu   жоu   хсu   рфu   дчu   ьчu   чоu   эрu   ффu   вчu   юзu   лдu   сёu   эфu   ьдu   бюu   бвu   жбu   уяu   тцu   нзu   фтu   вгu   хмu   члu   юмu   дхu   ймu   дгu   тбu   йцu   эмu   эпu   щьu   вхu   ётu   юкu   япu   жчu   оаu   ыжu   бмu   рзu   мрu   эсu   юлu   ёнu   йлu   ккu   юцu   вцu   ыяu   съu   щёu   чрu   дзu   хтu   кзu   дъu   швu   иуu   бьu   ёмu   дбu   юшu   чёu   жьu   мвu   южu   мчu   мцu   мгu   уцu   жсu   лбu   лпu   уиu   ююu   нжu   гчu   сгu   ьвu   еёu   зсu   пцu   лёu   яиu   ёлu   яшu   уфu   гсu   аэu   фсu   дюu   лмu   югu   рщu   вщu   ёрu   эдu   лзu   гмu   гвu   дёu   мфu   зъu   шпu   мэu   эвu   пчu   кмu   ьфu   бжu   тхu   ншu   эйu   кпu   уэu   гтu   нбu   ьоu   бдu   шмu   кгu   зчu   шёu   юхu   сжu   ббu   нёu   кшu   ззu   тщu   фыu   зцu   ггu   лхu   йеu   ааu   тёu   ьщu   ыиu   тфu   нхu   тгu   рэu   лвu   бшu   рёu   вёu   ьпu   лрu   зтu   ххu   йзu   эзu   чвu   шрu   ыщu   оёu   вбu   нпu   кдu   сэu   йбu   жлu   тъu   жмu   бзu   уоu   жрu   сзu   жгu   тзu   жёu   жжu   фьu   йфu   пшu   зюu   иэu   эхu   тэu   лшu   бэu   йрu   хгu   бтu   хшu   гбu   мтu   йгu   фнu   нэu   тшu   фгu   аёi!  iF  i  iL  iW  i  i  i	  i  i[  i  il  if  iD  iw  iR  i$  i  i  i  i  i  ix  i  i
  i
  ic
  i2
  i%
  i
  i	  i	  i	  i:	  i.	  i 	  i	  i	  i  i  i  i  i:  i  i  i  i  i  iJ  i=  i+  i*  i  i  i  i	  i  i  i  i  i  iw  iQ  iO  i-  i  i  i  i  i  i  i  i  iZ  iU  iH  iC  i>  i5  i3  i  i  i  i  i  i  i  i  i  i  i  i  im  ia  iS  iN  i-  i  i  i  i  i  i  i  i  i  i  i  i  i  i~  i{  il  if  ie  iY  iW  iL  iG  i@  i/  i"  i  i
  i	  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  it  ik  ih  i_  i\  iU  iT  iQ  iG  i>  i,  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  iw  it  ih  i`  i_  iY  iV  iJ  iH  iF  iE  iC  iB  iA  i<  i:  i4  i/  i,  i+  i&  i!  i  i  i  i  i  i  i                                                                                               }   |   x   t   r   h   d   b   X   T   P   O   L   K   H   <   ;   4   )   &                  (  thheinZerZanreesZonstntenZatZedZndtoorZeaZtiarteZngZalitasisZhaetZseZouZoflesaveroZraZrihinemedecotaZecsiZllZsoZnaZliZlaelZmaZdiZicZrtnsZrsioZomZchZotcaZceZhobettfotsssnoeeZemZacZildaZniurwashZeiamtrZdtusloZpeZunZncZwiutZadZewZowgeZepZaiZlyZolZftoseoZefZprZweZdomoidZiemipafiZpoZctZwhZirZaygaZscZkeZevspZimopZdsZldZulZooZsuiaZghplZebZigviZivZwoZyoZrdZtwZbaZagZryabZlsswZapZfeZtuZcifaZhtfravZegZgoZboZbuZtyZmpocZodZehZysZeyZrmZovgtZyaZckZgiZrnZgrrcZblltZytZoaZyeobZdbZffZsfZrrZduZkiZucifafZdrZclexZsmZpiZsbZcrtlZoiruZupZbyZtcnnZakslZnfZueZdwZauppZugZrlZrgbrZcuZuaZdhZrkyiZluZumZbinynwZquZogZsnZmbZvaZdfddmsZgsZawZnhZpuhrsdtbptZnmZdcZguZtmZmuZnuZmmnleuZwnnbZrpZdmsrZudZuiZrfokZywZtfZiprwrbZohksdpZfuZyctpmtZdlZnkZccZubZrhZnpZjuZflZdnkaphhuZjoZlfZybrvZoeZibZikZypglZlpZymZlbZhsZdgZgnZeknrZpsZtdZlcskZyfZyhZvoZahZdyZlmZsyZnvZydZfsZsgZyrZylZwsZmyZoyknZizZxpZlwtnkoZaajaZzeZfcZgwtgZxtZfhZlrZjeZynZggZgfeqZhyZktZhcbsZhwZhncsZhmZnjZhhZwtgcZlhZejZfmZdvlvwrZgpfpZgbZgmZhlZlkcyZmcZygZxiZhbfwZgyZhpZmwZpmZzaZlgiwZxaZfbsvgdZixZajklZhfZhdZaesqZdjZfyazZlnZaofdkwZmfZmhZsjZufZtvZxcZyuZbbZwwZojZaxmrZwlZxeZkhZoxZuoZziZfgZihZtkiiiuZtjZmnZwykyZkffnZuyZpwZdkZrjukZkrZkuZwmZkmZmdmlZezZkbZwcZwdZhgZbtZzoZkcZpfZyvZpcpywbZykZcpZyjZkpZpbZcdZjiZuwZuhZwfZyyZwpZbcZaqcbZiqcmZmgZdqZbjZtzZkdpdZfjZcfZnzZcwZfvZvyZfkZozZzzZijZljZnqZuvZxoZpgZhkZkgZvsZhvZbmZhjZcngvZcgZwuZgjxhZgkZtqZcqZrqZbhZxsuzZwkZxuZuxZbdZbwZwgmvZmjZpnZxmZoqZbvZxwZkkZbpzuZrzZxfmkzhZbnZzyZhqZwjZiyZdzZvrZzsZxyZcvxbZxrZujZyqZvdZpkZvuZjrZzlZszZyzZlqZkjZbfZnxZqaZqiZkvZzwZwvuuZvtZvpZxdZgqZxlZvcczZlzZztZwzZsxZzbZvlZpvZfqZpjZzmZvwZcjZzcbgZjsZxgrxhzZxxZvmZxnZqwZjpZvnZzdZzrZfzZxvZzpZvhZvbzfgzZtxZvfZdxZqbZbkZzgZvgZjcZzkZznZuqZjmZvvZjdZmqZjhZqsZjtZjbZfxZpqZmzZyxZqtZwqZjjZjwZlxZgxZjnZzvZmxZjkZkqZxkZjfZqmZqhZjlZjgZvkZvjZkzZqcZxjZpzZqlZqoZjvZqfZqdZbzhxZzjZpxZqpZqeZqrZzqZjyZbqZxqZcxZkxZwxZqyZqvZqnZvxZbxZjzZvzZqgZqqZzxxzZqkZvqZqjZqxZjxZjqZqzc                    sD    fddt | | dd  D }t|dkr0dS t|t| d S )Nc                    s0   g | ](\}}|  r|  r || d qS )r   )isalphaget).0abstat ./cmf/models/cmf_text_search.py
<listcomp>   s       z$bigram_text_rank.<locals>.<listcomp>r   r   gHz>)ziplensum)textry  Zstatsrz  rx  r{  bigram_text_rank   s     r  u   йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮz@qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.c                    s   d  fdd| D S )N c                 3   s   | ]}  ||V  qd S N)rt  )ru  xdict_rz  r{  	<genexpr>"   s     z'ninja_translate_text.<locals>.<genexpr>)join)r  r  rz  r  r{  ninja_translate_text!   s    r  c                 C   sX   t | t}t | t}t|t}t|t}d||  dkr<|S d||  dkrP|S | S d S )Nr   g?)r  rus2engeng2rusr  bigram_stat_rubigram_stat_eng)wordZ	trans_engZ	trans_rusZrank_ruZrank_engrz  rz  r{  
ninja_once$   s    



r  c                 C   s   d dd | dD S )N c                 S   s   g | ]}t |qS rz  )r  ru  wrz  rz  r{  r|  2   s     zninja.<locals>.<listcomp>)r  splitr  rz  rz  r{  ninja1   s    r  c                   @   s   e Zd ZdZdZddddddd	d
dddddgZeedddZe	d-e
jjdddZe	d.eeeeeeeeejejeeedddZe	e
jjdddZe	d/dd Ze	dd!dgfd"d#Ze	d$gdd%d!dgd&fd'd(Ze	d0d)d*Ze	d1d+d,ZdS )2CmfTextSearchuC   
    Сервис полнотекстового поиска.
    russiannametext_renderr  
text_drafttags	parent_idtree_parent_idroot_parent_idcmf_created_atcmf_modified_atcodecmf_deletedcmf_archivedr  c                 C   sz   | rvddl m} || dd} t| dkrZtdt|  d |  d d jd	d
} ddd t	
d| D } | S )Nr   )BeautifulSoupzhtml.parser
i  z)CmfTextSearch.clean_text: trunc text len z to 1mbi  ignore)errorsr  c                 S   s   g | ]}t |d k r|qS )rr   )r~  r  rz  rz  r{  r|  S   s      z,CmfTextSearch.clean_text.<locals>.<listcomp>z	[ \n<>|&])Zbs4r  Zget_textr~  gdebugencodedecoder  r   r  )r  r  rz  rz  r{  
clean_textH   s    zCmfTextSearch.clean_textTobjc                    s    fdd}|r j | jd |dp4|dp4|d}| |} jrV j d| }d }|d}|rzdd	d
 |D }| j jj j|d|||d|d|d|d|d|d|d|ddS )Nc                    s&   d }|  j kr" |  jr" |  j}|S r  )fieldsZ
is_definedvalue)
field_namer  r  rz  r{  get_field_valueX   s    
z0CmfTextSearch.index_obj.<locals>.get_field_value)r  r  r  r  r  r  c                 s   s   | ]}t |jV  qd S r  )strr  )ru  tagrz  rz  r{  r  l   s     z*CmfTextSearch.index_obj.<locals>.<genexpr>r  r  r  r  r  r  r  r  r  obj_id	obj_modelobj_nameobj_textobj_tagsobj_parent_idobj_tree_parent_idobj_root_parent_idobj_created_atobj_modified_atobj_codeobj_deletedobj_archived)	load_fieldsrequired_fieldsr  r  r  
index_datar  r  
class_name)clsr  r  r  r  Zobj_tags_strr  rz  r  r{  	index_objV   s4    
     zCmfTextSearch.index_objNFr  c                 C   sP  |st dddl}| jj}|| }|j}| }||jj	g
|jj|k }|| }|r|d }| 
|jj	|kj||||||||	|
|jj| j||jj| j||jj| j||||d}|| nl|  }| j||||||||||	|
|jj| j||jj| j||jj| j||||d}|| |S )u   
        :return: id записи
        :rtype: str

        Пока работу с БД выполняем через коре sqlachemy. Т.к. в ORM не достаточно функционала.
        zempty obj_idr   N)r  r  r  r  r  r  r  r  r  name_tsvectortext_tsvectortags_tsvectorr  r  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )
ValueError
sqlalchemyr6  data_driverZdp_model_clsZ	__table__SessionZselectcr  wherer  Zwith_for_updateexecutefirstupdatevaluessqlfuncZto_tsvector_fts_configZgen_idinsert)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r(  Zsa_modeltablesZget_stmtZget_resZid_Zupdate_stmtZinsert_stmtrz  rz  r{  r  y   st    



zCmfTextSearch.index_datac                 C   s>   |j s
d S | jD ](}|dkrq||jkr|| jr dS qd S )Nr  T)full_searchr  r  Z
is_changed)r  r  r  rz  rz  r{  is_obj_need_reindex   s    
z!CmfTextSearch.is_obj_need_reindexr   c           	   
   C   s   t jj D ]}|jsq|j}d}t }t|j	| j
||| gdgd}|sRq|D ]}| j|dd qV|t|7 }| j  td| d| dt | d	d
 q"qdS )z	
        r   r  )r  sliceorder_byF)r  zCmfTextSearch.reindex_models: :, z0.3z secN)cmfmodels	CmfEntityiter_subclassesr  r  timeZcmfutilZget_model_by_namelistr  r  r~  r6  Zcommitr  r  )	r  Zmodels_listZcommit_everyZ	model_cls
model_nameoffsetr   obj_listr  rz  rz  r{  reindex_models   s$    
 

zCmfTextSearch.reindex_modelsr   c           4   
   K   s  dt _|}|}t|}||kr4d|kr4| d| }|dkr@d}t|}	d|	d< ddg}	d}g }
g }g }g }dd	 tjj D }d
dg}| j|dd}| j	d||fd
dg|	dd|}| j|dd}| j	d||f|	d
dgdd|}|dkr| j|ddd}| j|dd}| j	dd
g|f|	d|d|}| j	ddg|f|	d|d|}| j|dd}| j	dd
g|f|	d|d|}| j	ddg|f|	d|d|}| j|dd}| j	|d
g|f|	dd|}| j	|dg|f|	dd|}t
dd|}| j	|d
g|fddi|}| j	|dg|fddi|} t
dd|}!| j	|d
g|!fddi|}"| j	|dg|!fddi|}#| j|dd}$| j	|d
g|$f|	dd|}%| j	|dg|$f|	dd|}&d }'d| kr tjjdd gd!d"d#| gdd#| ggd$}'|'r*|s$|'j|'j d%ddd&gS |'jS g }(t })tjjd'gdd(d)|  d)ggdd*gd+}*|*D ]>}+|+jd d, D ](},|(|,jj|+jj|,jjd-ddg qvqdd.d/ }-d}.|s|s|s|s|s|s|s|s|s| s|"s|#s|%s|&rN|.r>|-||(|) |-||(|) |-||(|) |-||(|) d}.|-||(|) |-||(|) |-||(|) |-|"|(|) |-||(|) |-||(|) |-| |(|) |-|#|(|) |-||(|) |-||(|) |-||(|) |-||(|) |-||(|) |-|%|(|) |-|&|(|) |-||(|) qtd0D ]<}/td1D ]}0|-||(|) q|-||(|) trntd}1|1d |)krn|(|1 |)|1d  trtd}1|1d |)kr|(|1 |)|1d  trtd}1|1d |)kr|(|1 |)|1d  |r|d}1|1d |)kr|(|1 |)|1d  tr
td}1|1d |)kr
|(|1 |)|1d  q
q|(|d |d,  }(|svd2d	 |(D S i }2g }3|(D ]f}1|3|1d  |1d1  d|1d0 d3d|1d4 d5d|1d,  |1d6 |1d1 |1d0 |1d4 d7|2|1d < q|2t _|3S )8Nr  r   OR ANYr  r   r   c                 S   s   g | ]}|j r|jqS rz  )r  r  )ru  mrz  rz  r{  r|    s      z1CmfTextSearch.fulltext_search.<locals>.<listcomp>ZCmfTaskZCmfDocumentFsynonymsr  N)model_name_not_inr  labelTS)r  r  r  )r  
stop_words)r  r  text_stop_wordsZNsA)r  r  z([&] )([^!])z<1> \2r  ZH1z<2> \2ZH2r  r  ORr  =)r  filterZCODEr  r  headliner  rankage_daysz
deals.nameZILIKE%r   )r  r  r  r   ZCOMPc                 S   s:   | r6|  d}|d |kr6|| ||d  dS dS )Nr   TF)popappendadd)r  resultskip_idsrrz  rz  r{  add_if_existst  s    

z4CmfTextSearch.fulltext_search.<locals>.add_if_existsr   r   c                 S   sd   g | ]\}|d  |d |d  d|d  d|d dd|d dd	t j 	|d |d |d d
qS )r   r   r   r  r   r   .6fr   .0fz words=r  )r  FST)ru  r  rz  rz  r{  r|    s   4r  r   r  r   )r  r  r  r  r  ) r  r	  r  r  r  r  r  r  prepare_search_querysearch_oncer   substripr  rt  r  r  setZ
CmfCompanyZdealsr  r  r  r  rangeZres_strong_position_h1r   r  Zres_strong_position_h2Zres_all_foundZres_syn_foundfulltext_search_headlines)4r  r  r  search_queryZonly_idsr  kwargsZorig_field_nameZorig_search_queryZfullsearch_sliceZres_name_foundZres_name_syn_foundZres_other_name_foundZres_other_text_foundZother_model_namesZbase_model_namesZother_tsquery_name_foundZother_res_name_foundZother_tsquery_text_syn_foundZother_res_text_foundr  Ztsquery_name_foundZtask_res_name_foundZdocument_res_name_foundZtsquery_name_syn_foundZtask_res_name_syn_foundZdocument_res_name_syn_foundZtsquery_all_foundZtask_res_all_foundZdocument_res_all_foundZtsquery_strong_position_h1Ztask_res_strong_position_h1Zdocument_res_strong_position_h1Ztsquery_strong_position_h2Ztask_res_strong_position_h2Zdocument_res_strong_position_h2Ztsquery_syn_foundZtask_res_syn_foundZdocument_res_syn_foundZany_res_code_foundr  r  Z
contr_listZcontrZdealr  Zdo_top_Ztttr  r  Z	result_idrz  rz  r{  fulltext_search   s    
        	
*	









,	zCmfTextSearch.fulltext_searchZnull000r  !null000c	                 C   s   |dks|d krd}|dkr.t d| dd d| }	| d}
|d	 }|d
 |d	  }d}|rvt|}d| d}tjjj d d|	|
||
f }tjjj ||||t|t|||d}t	|}|S )Nr  r  )r  r  r  u6   Недопустимое значение field_name: T)abortZobj_Z	_tsvectorr   r   z$obj_modified_at > now() - interval 'z
 days' ANDz"set gin_fuzzy_search_limit=100000;a  SELECT
                obj_id,
                obj_name,
                ts_headline('russian', %s, :tsquery, 'MaxFragments=3') as headline,
                :label || (CASE WHEN EXTRACT(days from (now()-obj_modified_at)) < 365 then 'R' else '' end) as label,
                ts_rank_cd(%s, :tsquery, 2|8) *
                    (CASE WHEN EXTRACT(days from (now()-obj_modified_at)) < 365 then
                        (365-EXTRACT(days from (now()-obj_modified_at)))/30+1 else 1 end) as rank,
                EXTRACT(days from (now()-obj_modified_at)) as age_days
            FROM cmf_text_search
            WHERE
              %s
              %s @@ :tsquery and obj_model IN :model_name_in and obj_model NOT IN :model_name_not_in
              and (obj_text is null or obj_text = '' or text_tsvector @@ to_tsquery('russian', :text_stop_words))
              order by rank desc limit :slice_for offset :slice_from;
              )tsquery
slice_from	slice_formodel_name_inr  r  r  )
	cmf_alertintr  r  r6  r  r  r  tupler  )r  r  r  Ztsquery_strr  r  r  r  r  Zsearch_fieldZtsvector_fieldr  r  Zage_days_subqueryr  Z
found_objsZall_objsrz  rz  r{  r    s6    



zCmfTextSearch.search_oncec              
   C   s  dt _| }tdd|}td|}d}d}|D ]0}t|dkrHq4t|dkr|dkr^q4|dkrv|d| 7 }q4|dkrq4|d	kr|d
7 }q4|dkr|d7 }q4t|dkr|d| 7 }q4|d dkr|d|dd   7 }|d|dd   7 }q4|dd}| j||d}	|r(|d dkr0|d7 }t|	dkrN||	d  7 }q4|dd	|	 d 7 }q4q4|dddddddd}|d dkr|dd  }t|dkr|d dkr|dd  }z.t
jjj dd|i}
t|
d d }W n tjjk
r } zft
jjj  td |  td!| d| dt j  t
jjj d"d|i}
t|
d d }W 5 d }~X Y nX t|d#| |r|S |S )$Nr  u   [^-A-Za-zА-Яа-я0-9()|&! ]z(,| |&|\||\(|\))r   r   )-!z()&|r  )r   u   или|z |)u   иand&z &r   z& z& !r  r  r  )r   r"  z( z | z )r  z or z AND z & z and )r"  r   z!select to_tsquery('russian', :q);qu;   Ошибочный синтаксиса в запросе: u@   DEV: Ошибочный синтаксиса в запросе: z+select websearch_to_tsquery('russian', :q);z->)r  r	  lowerr   r  r  r~  replaceprepare_wordr  r  
CmfSynonymr6  r  r  r  r  r  excZProgrammingErrorZrollbackr  print)r  r  r  r  Zsearch_query_allowed_symbtokensZstopsr$  tZ	sug_wordsr  erz  rz  r{  r
    sv    
$ "z"CmfTextSearch.prepare_search_queryc                 C   s  t  jd| d7  _|d tjkr.d}t}nd}t}g }||st  jd7  _||}g }d}|D ]}	|dkr| qt|	dkrqj|	d |d kr|	d |d krqjd	|	kr|		d	d
}	t  jd|	 d7  _|
|	 |d7 }qjt  jd|	 d7  _|
|	 |d7 }qjg }
tjjj dd|i}d}|D ]\}}|dkrR qt|dkrdq:|d |d ks|d |d kr:|	d	d
}t  jd| d7  _|

| |d7 }q:t|t|
B |hB }n|h}t }|D ]D}	t|	d d D ]*}||j t  jd|j d7  _qq||B }t }|rtjjddt||hB gddgdgddgd}|D ]\}|jrt|jjdd d D ]6}| 	d	d
}t  jd| d7  _|| qqt||B t|B }t|S )Nz|w:z: r   r   r   zspellError, r   r   r  z<->z	addSpell r  z
            SELECT
                name, similarity(:word, name) as sim
            FROM cmf_synonym
            WHERE
                :word % name
            ORDER BY "sim" desc
            LIMIT 5;
             r  zaddSpellTrgm z
normalize r  INr  Zorderno)r  r  r  r  ,r   zsynAdd )r  r	  stringZascii_lettersdictionary_endictionary_rucheckZsuggestr~  r&  r  r  r(  r6  r  r  r  r  morphparser  Znormal_formr  r  r  r  r  )r  r  r  langZ
dictionaryZfiltered_suggestions3ZsuggestionsZfiltered_suggestionsir  Zfiltered_suggestions2Zsuggestions2_listZsuggr  Zall_suggestionsZnormalized_wordsr'  Zsynonym_wordsZsynonym_listZsynonymr  rz  rz  r{  r'  X  s    
 


	 
$
 zCmfTextSearch.prepare_word)T)NNNNNNNNNNFF)Nr   )TF)T)__name__
__module____qualname____doc__r  r  staticmethodr  r  classmethodr  r  Z	BaseModelr  datetimeboolr  r  r  r  r  r
  r'  rz  rz  rz  r{  r  <   s             "                             X g   1Er  ) r>  r  Zcmf.includeZcmf.data_providers.sqlalchemyr   Zcmf.fields.cmf_text_searchr  Zenchantr0  Z	pymorphy2r   r  ZMorphAnalyzerr4  ZDictr1  r2  r  r  r  Zrus_keyZeng_keydictr}  r  r  r  r  r  r  Zcmf_text_searchr  rz  rz  rz  r{  <module>   sR   

                  J