U
    {hHA                     @   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)SubqueryConstraint	WhereNode)class_is_indexedget_indexed_models)	MATCH_ALL	PlainTextc                   @   s   e Zd ZdS )FilterErrorN__name__
__module____qualname__ r   r   d/var/www/dating/data/www/fatepal.com/env/lib/python3.8/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|| 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                   @   s^   e Zd ZdZd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 k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   )r   filters	connectornegatedr   r   r   _connect_filtersH   s    z(BaseSearchQueryCompiler._connect_filtersFc                 C   s   |  |}|d kr<td| d | d | jjj d |d|sN| |||}|d k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_filterK   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rtdn`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rD   ANDFZ_ptr_idzECould not apply filter on search results: Subqueries are not allowed.c                    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   rO      s     z>Could not apply filter on search results: Unknown where node: )r(   r   lhsExtractDater   r   lookup_nametargetZattnamedatetimedateintrhsrF   r?   endswithr   r   r=   childrenr>   r)   type)
r   Z
where_noderD   r5   r9   r:   Zfilter1Zfilter2r=   Zchild_filtersr   r2   r   rM   n   s    
  
   
  
z4BaseSearchQueryCompiler._get_filters_from_where_nodec                 C   s   |  | jjjS r   )rM   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 krrtd| d | d | jjj d |d	||fV  qd S )
NF-TrG   z'Cannot sort search results with field "r@   rA   rB   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}||k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('rA   rB   r   TrK   )r,   r&   r.   Zget_searchable_search_fieldsr    r   rM   r+   r[   listr`   )r   Zallowed_fieldsr   r   r   r   check   s0    

zBaseSearchQueryCompiler.check)NNT)F)F)r   r   r   r*   r   r6   r;   r?   rF   rM   r\   r`   rc   r   r   r   r   r#   $   s      
	
#
c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   rf   rg   rh   r   r   r   r     s    zBaseSearchResults.__init__c                 C   sl   |d k	r4| j d k	r(t| j | j| | _ n| j| | _ |d k	rh| j d k	r\t| j | j| | _n| j| | _d S r   )rj   minri   )r   ri   rj   r   r   r   _set_limits  s    

zBaseSearchResults._set_limitsc                 C   s6   | j }|| j| j| jd}| j|_| j|_| j|_|S )N)rh   )r   rf   rg   rh   ri   rj   rm   )r   klassnewr   r   r   _clone'  s      zBaseSearchResults._clonec                 C   s   t d S r   r7   r2   r   r   r   
_do_search1  s    zBaseSearchResults._do_searchc                 C   s   t d S r   r7   r2   r   r   r   	_do_count4  s    zBaseSearchResults._do_countc                 C   s   | j d krt|  | _ | j S r   )rk   rb   rs   r2   r   r   r   results7  s    
zBaseSearchResults.resultsc                 C   s2   | j d kr,| jd k	r"t| j| _ n
|  | _ | j S r   )rl   rk   lenrt   r2   r   r   r   count<  s
    


zBaseSearchResults.countc                 C   s   |   }t|trh|jd k	r&t|jnd }|jd k	r>t|jnd }||| | jd k	rd| j| |_|S | jd k	r|| j| S | j| |_| j| d |_t|d S d S )NrG   r   )	rr   r(   sliceri   rV   rj   ro   rk   rb   )r   keyrq   ri   rj   r   r   r   __getitem__D  s    



zBaseSearchResults.__getitem__c                 C   s   t |  S r   )iterru   r2   r   r   r   __iter__Z  s    zBaseSearchResults.__iter__c                 C   s   t |  S r   )rv   ru   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>)rb   rv   )r   datar   r   r   __repr__`  s    zBaseSearchResults.__repr__c                 C   s   |   }||_|S r   )rr   rm   )r   r   cloner   r   r   annotate_scoref  s    z BaseSearchResults.annotate_scorec                 C   s   t dd S )Nz-This search backend does not support facetingr7   )r   r   r   r   r   facetk  s    zBaseSearchResults.facet)N)NN)r   r   r   Zsupports_facetr   ro   rr   rs   rt   ru   rw   rz   r|   r}   r   r   r   r   r   r   r   rd     s   



rd   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   p  s    zEmptySearchResults.__init__c                 C   s   |   S r   r   r2   r   r   r   rr   s  s    zEmptySearchResults._clonec                 C   s   g S r   r   r2   r   r   r   rs   v  s    zEmptySearchResults._do_searchc                 C   s   dS re   r   r2   r   r   r   rt   y  s    zEmptySearchResults._do_count)r   r   r   r   rr   rs   rt   r   r   r   r   r   r   o  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 ](}| |}||k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   rZ   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   rZ   r   r   r   r   r   delete  s    zBaseSearchBackend.deletec                 K   sb   t |tr|j}|}n|}|j }t|s2t S |dkr@t S |||f|}|  | | |S )N )	r(   r   r.   objectsallr	   r   rc   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 k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   )_metaparentsrb   r   get_model_root)r.   Zparent_modelr   r   r   r     s    r   ) rT   warningsr   Z#django.db.models.functions.datetimer   rQ   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#   rd   r   r   r   r   r   r   r   r   <module>   s(    jbh