U
    =e                     @   sH   d dl Z d dlZd dlT d dlmZ d dlZG dd dejjj	j
Z
dS )    N)*)SQLAlchemyDataDriverc                   @   s   e Zd ZdZdZ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d
ddZe	e
jjdddZe	dddZdS ) CmfTextSearchuC   
    Сервис полнотекстового поиска.
    russiannametext_rendertext
text_drafttags	parent_idtree_parent_idroot_parent_idcmf_created_atcmf_modified_at)r   c                 C   s^   | rZddl m} || dd} t| dkrZtdt|  d |  d d jd	d
} | S )Nr   )BeautifulSoupzhtml.parser
i  z)CmfTextSearch.clean_text: trunc text len z to 1mbi  ignore)errors)Zbs4r   Zget_textlengdebugencodedecode)r   r    r   /./modules/text_search/models/cmf_text_search.py
clean_text   s    zCmfTextSearch.clean_textTobjc                    s    fdd}|r j | jd |dp4|dp4|d}| |}d }|d}|rddd	d
 |D }| j jj j|d|||d|d|d|d|dd
S )Nc                    s&   d }|  j kr" |  jr" |  j}|S N)fieldsZ
is_definedvalue)
field_namer    r   r   r   get_field_value$   s    
z0CmfTextSearch.index_obj.<locals>.get_field_value)r   r   r   r	   r
    c                 s   s   | ]}t |jV  qd S r   )strr   ).0tagr   r   r   	<genexpr>6   s     z*CmfTextSearch.index_obj.<locals>.<genexpr>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)load_fieldsrequired_fieldsr   join
index_dataidr    
class_name)clsr   r3   r"   r,   Zobj_tags_strr-   r   r   r   	index_obj"   s*    
    zCmfTextSearch.index_objNr(   c                 C   sD  |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}|| nf|  }| 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/   r0   r1   r2   name_tsvectortext_tsvectortags_tsvector)r7   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r;   r<   r=   )
ValueErrorZ
sqlalchemydpZdata_driverZdp_model_clsZ	__table__ZSessionZselectcr7   wherer)   Zwith_for_updateZexecutefirstupdatevaluesZsqlfuncZto_tsvector_fts_configZgen_idinsert)r9   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   ZsaddZsa_modeltablesZget_stmtZget_resZid_Zupdate_stmtZinsert_stmtr   r   r   r6   A   sh    



zCmfTextSearch.index_datac                 C   sB   |j dkrd S | jD ](}|dkr"q||jkr|| jr dS qd S )NCmfDocumentr   T)r8   r4   r   Z
is_changed)r9   r   r!   r   r   r   is_obj_need_reindex   s    

z!CmfTextSearch.is_obj_need_reindexd   c              
   C   s   |sddg}|D ]}d}t   }t|j| j||| gdgd}|sHq|D ]}| j|dd qL|t|7 }| j  t	
d| d	| d
t   | dd qqdS )z	
        rK   ZCmfTaskr   r   )r   sliceZorder_byF)r3   zCmfTextSearch.reindex_models: :z, z0.3z secN)timeZcmfutilZget_model_by_namelistr4   r:   r   r?   Zcommitr   r   )r9   Zmodels_listZcommit_everyZ
model_nameoffsettsZobj_listr   r   r   r   reindex_models   s"    
 

zCmfTextSearch.reindex_models)T)	NNNNNNNNN)NrM   )__name__
__module____qualname____doc__rF   r4   staticmethodr$   r   classmethodZcmfZmodelsZ	BaseModelr:   datetimer6   rL   rT   r   r   r   r   r   	   sV                                Q	r   )r[   rP   Zcmf.includeZcmf.data_providers.sqlalchemyr   Z*modules.text_search.fields.cmf_text_searchmodulesZtext_searchr   Zcmf_text_searchr   r   r   r   r   <module>   s
   