a
    Dg)A                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d d	lmZmZ G d
d deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd dZG dd deZG dd dZG dd dZdd ZdS )     N)warn)Extract)ExtractYear)Lookup)QuerySet)NothingNode	WhereNode)class_is_indexedget_indexed_models)	MATCH_ALL	PlainTextc                   @   s   e Zd ZdS )FilterErrorN__name__
__module____qualname__ r   r   [/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/search/backends/base.pyr      s   r   c                       s"   e Zd Zdd fdd
Z  ZS )
FieldErrorN
field_namec                   s   || _ t j|i | d S N)r   super__init__)selfr   argskwargs	__class__r   r   r      s    zFieldError.__init__)r   r   r   r   __classcell__r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )SearchFieldErrorNr   r   r   r   r   r       s   r    c                   @   s   e Zd ZdS )FilterFieldErrorNr   r   r   r   r   r!      s   r!   c                   @   s   e Zd ZdS )OrderByFieldErrorNr   r   r   r   r   r"       s   r"   c                   @   sf   e Zd ZdZdddZdd Zdd	 Zd
d Zdd ZdddZ	dddZ
dd Zdd Zdd ZdS )BaseSearchQueryCompilerorNTc                 C   sP   || _ |d u rtdt t}nt|tr:t||p4| jd}|| _|| _	|| _
d S )Nz7Querying `None` is deprecated, use `MATCH_ALL` instead.)operator)querysetr   DeprecationWarningr   
isinstancestrr   DEFAULT_OPERATORqueryfieldsorder_by_relevance)r   r&   r+   r,   r%   r-   r   r   r   r   '   s    
z BaseSearchQueryCompiler.__init__c                    s&    fdd j j D |d }|S )Nc                    s   i | ]}|  jj|qS r   )Zget_attnamer&   model.0fieldr   r   r   
<dictcomp>>   s   zABaseSearchQueryCompiler._get_filterable_field.<locals>.<dictcomp>)r&   r.   Zget_filterable_search_fieldsget)r   field_attnamer1   r   r2   r   _get_filterable_field<   s    

z-BaseSearchQueryCompiler._get_filterable_fieldc                 C   s   t d S r   NotImplementedError)r   r1   lookupvaluer   r   r   _process_lookupE   s    z'BaseSearchQueryCompiler._process_lookupc                 C   s   t d S r   r7   r2   r   r   r   _process_match_noneH   s    z+BaseSearchQueryCompiler._process_match_nonec                 C   s   t d S r   r7   )r   filters	connectornegatedr   r   r   _connect_filtersK   s    z(BaseSearchQueryCompiler._connect_filtersFc                 C   s   |  |}|d u r<td| d | d | jjj d |d|sN| |||}|d u rtd| d | d t| d	 | d
 |S )Nz)Cannot filter search results with field "!". Please add index.FilterField('') to .search_fields.r   z+Could not apply filter on search results: "__z = z". Lookup "z"" not recognised.)r6   r!   r&   r.   r   r;   r   r)   )r   r5   r9   r:   
check_onlyr1   resultr   r   r   _process_filterN   sR    
z'BaseSearchQueryCompiler._process_filterc           
         s  t |trt |jtr^t |jts>td|jj d qt|jjjj}|j}|dkrnt	
t|jdd}n|dkrt	
t|jd dd}d}n|dkrt	
t|jd dd}d}n|dkrt	
t|jdd}n|dkrH j|dt	
t|jdd|d	} j|dt	
t|jd dd|d	}|r4d S  ||gd
dS ntd|jj d n|jjj}|j}|j}|drd S  j||||d	S t |tr  S t |tr|j} fdd|jD }	|s
dd |	D }	 |	||jS ntdtt| d S )Nz(Cannot apply filter on search results: "z" queries are not supported.Zgte   gtZlteltexactrE   ANDFZ_ptr_idc                    s   g | ]}  |qS r   )_get_filters_from_where_node)r0   childr2   r   r   
<listcomp>   s   zHBaseSearchQueryCompiler._get_filters_from_where_node.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r   r   )r0   Zchild_filterr   r   r   rP      s   z>Could not apply filter on search results: Unknown where node: )r(   r   lhsExtractDater   r   lookup_nametargetZattnamedatetimedateintrhsrG   r@   endswithr   r<   r   r>   childrenr?   r)   type)
r   Z
where_noderE   r5   r9   r:   Zfilter1Zfilter2r>   Zchild_filtersr   r2   r   rN   q   s    




z4BaseSearchQueryCompiler._get_filters_from_where_nodec                 C   s   |  | jjjS r   )rN   r&   r+   wherer2   r   r   r   _get_filters_from_queryset   s    z2BaseSearchQueryCompiler._get_filters_from_querysetc                 c   s   | j r
d S | jjjD ]h}d}|dr6d}|dd  }| |}|d u rrtd| d | d | jjj d |d	||fV  qd S )
NF-TrH   z'Cannot sort search results with field "rA   rB   rC   r   )	r-   r&   r+   Zorder_by
startswithr6   r"   r.   r   )r   r   reverser1   r   r   r   _get_order_by   s4    

z%BaseSearchQueryCompiler._get_order_byc                 C   s~   | j rZdd | jj D }| j D ]6}||vr"td| d | d | jjj d |dq"| j| jjjdd	 t	| 
  d S )
Nc                 S   s   h | ]
}|j qS r   r   r/   r   r   r   	<setcomp>   s   z0BaseSearchQueryCompiler.check.<locals>.<setcomp>zCannot search with field "z!". Please add index.SearchField('rB   rC   r   TrL   )r,   r&   r.   Zget_searchable_search_fieldsr    r   rN   r+   r\   listra   )r   Zallowed_fieldsr   r   r   r   check   s0    

zBaseSearchQueryCompiler.check)NNT)F)F)r   r   r   r*   r   r6   r;   r<   r@   rG   rN   r]   ra   rd   r   r   r   r   r#   $   s      
	
#
ar#   c                   @   s|   e Zd ZdZdddZdddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )BaseSearchResultsFNc                 C   s4   || _ || _|| _d| _d | _d | _d | _d | _d S Nr   )backendquery_compilerprefetch_relatedstartstop_results_cache_count_cache_score_field)r   rg   rh   ri   r   r   r   r     s    zBaseSearchResults.__init__c                 C   sl   |d ur4| j d ur(t| j | j| | _ n| j| | _ |d urh| j d ur\t| j | j| | _n| j| | _d S r   )rk   minrj   )r   rj   rk   r   r   r   _set_limits  s    

zBaseSearchResults._set_limitsc                 C   s6   | j }|| j| j| jd}| j|_| j|_| j|_|S )N)ri   )r   rg   rh   ri   rj   rk   rn   )r   klassnewr   r   r   _clone(  s    zBaseSearchResults._clonec                 C   s   t d S r   r7   r2   r   r   r   
_do_search2  s    zBaseSearchResults._do_searchc                 C   s   t d S r   r7   r2   r   r   r   	_do_count5  s    zBaseSearchResults._do_countc                 C   s   | j d u rt|  | _ | j S r   )rl   rc   rt   r2   r   r   r   results8  s    
zBaseSearchResults.resultsc                 C   s2   | j d u r,| jd ur"t| j| _ n
|  | _ | j S r   )rm   rl   lenru   r2   r   r   r   count=  s
    


zBaseSearchResults.countc                 C   s   |   }t|trh|jd ur&t|jnd }|jd ur>t|jnd }||| | jd urd| j| |_|S | jd ur|| j| S | j| |_| j| d |_t|d S d S )NrH   r   )	rs   r(   slicerj   rW   rk   rp   rl   rc   )r   keyrr   rj   rk   r   r   r   __getitem__E  s    



zBaseSearchResults.__getitem__c                 C   s   t |  S r   )iterrv   r2   r   r   r   __iter__[  s    zBaseSearchResults.__iter__c                 C   s   t |  S r   )rw   rv   r2   r   r   r   __len__^  s    zBaseSearchResults.__len__c                 C   s,   t | d d }t|dkr$d|d< d| S )N      z$...(remaining elements truncated)...z<SearchResults %r>)rc   rw   )r   datar   r   r   __repr__a  s    zBaseSearchResults.__repr__c                 C   s   |   }||_|S r   )rs   rn   )r   r   cloner   r   r   annotate_scoreg  s    z BaseSearchResults.annotate_scorec                 C   s   t dd S )Nz-This search backend does not support facetingr7   )r   r   r   r   r   facetl  s    zBaseSearchResults.facet)N)NN)r   r   r   Zsupports_facetr   rp   rs   rt   ru   rv   rx   r{   r}   r~   r   r   r   r   r   r   r   re     s   



re   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	EmptySearchResultsc                    s   t  d d  d S r   )r   r   r2   r   r   r   r   q  s    zEmptySearchResults.__init__c                 C   s   |   S r   r   r2   r   r   r   rs   t  s    zEmptySearchResults._clonec                 C   s   g S r   r   r2   r   r   r   rt   w  s    zEmptySearchResults._do_searchc                 C   s   dS rf   r   r2   r   r   r   ru   z  s    zEmptySearchResults._do_count)r   r   r   r   rs   rt   ru   r   r   r   r   r   r   p  s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )	NullIndexz
    Index class that provides do-nothing implementations of the indexing operations required by
    BaseSearchBackend. Use this for search backends that do not maintain an index, such as the
    database backend.
    c                 C   s   d S r   r   r   r.   r   r   r   	add_model  s    zNullIndex.add_modelc                 C   s   d S r   r   r2   r   r   r   refresh  s    zNullIndex.refreshc                 C   s   d S r   r   r   itemr   r   r   add_item  s    zNullIndex.add_itemc                 C   s   d S r   r   )r   r.   itemsr   r   r   	add_items  s    zNullIndex.add_itemsc                 C   s   d S r   r   r   r   r   r   delete_item  s    zNullIndex.delete_itemN)	r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   ~  s   r   c                   @   s   e Zd ZdZdZdZdZdZdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdddZdS )BaseSearchBackendNFc                 C   s   d S r   r   )r   paramsr   r   r   r     s    zBaseSearchBackend.__init__c                 C   s   t  S r   )r   r   r   r   r   get_index_for_model  s    z%BaseSearchBackend.get_index_for_modelc                 C   s   d S r   r   r2   r   r   r   get_rebuilder  s    zBaseSearchBackend.get_rebuilderc                 C   s   t d S r   r7   r2   r   r   r   reset_index  s    zBaseSearchBackend.reset_indexc                 C   s   |  || d S r   )r   r   r   r   r   r   add_type  s    zBaseSearchBackend.add_typec                 C   s8   g }t  D ](}| |}||vr
|  || q
d S r   )r
   r   r   append)r   Zrefreshed_indexesr.   indexr   r   r   refresh_index  s    

zBaseSearchBackend.refresh_indexc                 C   s   |  t|| d S r   )r   r[   r   r   objr   r   r   add  s    zBaseSearchBackend.addc                 C   s   |  ||| d S r   )r   r   )r   r.   Zobj_listr   r   r   add_bulk  s    zBaseSearchBackend.add_bulkc                 C   s   |  t|| d S r   )r   r[   r   r   r   r   r   delete  s    zBaseSearchBackend.deletec                 K   sf   t |tr|j}|}n|}|j }t|s2t S |dkr@t S |||fi |}|  | | |S )N )	r(   r   r.   Zobjectsallr	   r   rd   results_class)r   query_compiler_classr+   model_or_querysetr   r.   r&   Zsearch_query_compilerr   r   r   _search  s    

zBaseSearchBackend._searchTc                 C   s   | j | j|||||dS )Nr,   r%   r-   )r   r   r   r+   r   r,   r%   r-   r   r   r   search  s    zBaseSearchBackend.searchc                 C   s*   | j d u rtd| j| j |||||dS )Nz9This search backend does not support the autocomplete APIr   )!autocomplete_query_compiler_classr8   r   r   r   r   r   autocomplete  s    
zBaseSearchBackend.autocomplete)NNT)NNT)r   r   r   r   r   r   Zrebuilder_classZcatch_indexing_errorsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s.      
   r   c                 C   s,   | j jr(t| j j d d }t|S | S )a  
    This function finds the root model for any given model. The root model is
    the highest concrete model that it descends from. If the model doesn't
    descend from another concrete model then the model is it's own root model so
    it is returned.

    Examples:
    >>> get_model_root(wagtailcore.Page)
    wagtailcore.Page

    >>> get_model_root(myapp.HomePage)
    wagtailcore.Page

    >>> get_model_root(wagtailimages.Image)
    wagtailimages.Image
    r   )Z_metaparentsrc   r   get_model_root)r.   Zparent_modelr   r   r   r     s    r   ) rU   warningsr   Z#django.db.models.functions.datetimer   rR   r   Zdjango.db.models.lookupsr   Zdjango.db.models.queryr   Zdjango.db.models.sql.wherer   r   Zwagtail.search.indexr	   r
   Zwagtail.search.queryr   r   	Exceptionr   r   r    r!   r"   r#   re   r   r   r   r   r   r   r   r   <module>   s(    kbh