a
    Dg                     @   s   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 d dlmZmZmZmZ d dlmZmZmZmZmZmZmZ d d	lmZmZ d
Zd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!e!Z"dS )    )OrderedDict)warn)FieldDoesNotExist)models)Count)Value)BaseSearchBackendBaseSearchQueryCompilerBaseSearchResultsFilterFieldError)AndBoostMatchAllNotOrPhrase	PlainText)ANDORZ_ALL_Z_NONE_c                       sf   e Zd ZdZeedZ f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  ZS )DatabaseSearchQueryCompilerand)r   orc                    s$   t  j|i | t|  | _d S N)super__init__listget_fields_namesfields_names)selfargskwargs	__class__ h/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/search/backends/database/fallback.pyr   $   s    z$DatabaseSearchQueryCompiler.__init__c              	   c   s\   | j j}| jpdd | D }|D ]2}z|j| W n tyN   Y q$Y q$0 |V  q$d S )Nc                 S   s   g | ]
}|j qS r#   
field_name).0fieldr#   r#   r$   
<listcomp>*   s   z@DatabaseSearchQueryCompiler.get_fields_names.<locals>.<listcomp>)querysetmodelfieldsZget_searchable_search_fieldsZ_meta	get_fieldr   )r   r+   r   r&   r#   r#   r$   r   (   s    
z,DatabaseSearchQueryCompiler.get_fields_namesc                 C   s&   t jf i || jjd | |iS )N__)r   QZget_attnamer*   r+   )r   r(   lookupvaluer#   r#   r$   _process_lookup6   s    z+DatabaseSearchQueryCompiler._process_lookupc                 C   s   t jg dS )N)Zpk__inr   r/   r   r#   r#   r$   _process_match_none;   s    z/DatabaseSearchQueryCompiler._process_match_nonec                 C   sB   |dkrt j| }n |dkr0tdd |D }nd S |r>| }|S )Nr   r   c                 S   s   g | ]}t |qS r#   r3   )r'   Zfilr#   r#   r$   r)   B       z@DatabaseSearchQueryCompiler._connect_filters.<locals>.<listcomp>)r   r/   r   )r   filtersZ	connectorZnegatedqr#   r#   r$   _connect_filters>   s    z,DatabaseSearchQueryCompiler._connect_filtersc                 C   s4   t  }| jD ] }|t jf i |d |iO }q|S )N__icontains)r   r/   r   )r   termZ
term_queryr&   r#   r#   r$   build_single_term_filterK   s    
z4DatabaseSearchQueryCompiler.build_single_term_filter      ?c                 C   s   |j | dkrtd d S )Nr=   z7Database search backend does not support term boosting.)boostr   )r   queryr>   r#   r#   r$   check_boostQ   s    z'DatabaseSearchQueryCompiler.check_boostc                    s  t |tr@j| d j|j }|fdd|j D S t |trt	 }j
D ]"}|tj	f i |d |jiO }qX|S t |tr |j9  j|j dS t |trtS t |trj|j d}|tkrtS |tkrtS | S t |tr0 fdd|jD }t|v rtS dd |D }t|S t |trv fdd|jD }t|v r`tS dd |D }t|S td	|jj d S )
Nr>   c                    s   g | ]}  |qS r#   )r<   )r'   r;   r4   r#   r$   r)   \   s   zEDatabaseSearchQueryCompiler.build_database_filter.<locals>.<listcomp>r:   c                    s   g | ]}j | d qS rA   build_database_filterr'   subqueryr>   r   r#   r$   r)   |   s   c                 S   s   g | ]}|t kr|qS r#   )	MATCH_ALLr'   r8   r#   r#   r$   r)      r6   c                    s   g | ]}j | d qS rB   rC   rE   rG   r#   r$   r)      s   c                 S   s   g | ]}|t kr|qS r#   )
MATCH_NONErI   r#   r#   r$   r)      r6   z5`%s` is not supported by the database search backend.)
isinstancer   r@   	OPERATORSoperatorZquery_stringsplitr   r   r/   r   r   r>   rD   rF   r   rH   r   rJ   r   
subqueriesr   r   r   NotImplementedErrorr"   __name__)r   r?   r>   rM   r8   r&   rO   r#   rG   r$   rD   U   s\    



 





z1DatabaseSearchQueryCompiler.build_database_filter)r=   )r=   )rQ   
__module____qualname__ZDEFAULT_OPERATORr   r   rL   r   r   r2   r5   r9   r<   r@   rD   __classcell__r#   r#   r!   r$   r      s   
r   c                   @   s   e Zd ZdS )!DatabaseAutocompleteQueryCompilerN)rQ   rR   rS   r#   r#   r#   r$   rU      s   rU   c                   @   s4   e Zd ZdZdd Zdd Zdd ZdZd	d
 ZdS )DatabaseSearchResultsi  c                 C   s\   | j j}| j   | j | j j}|tkr,n|tkr>| }n
||}|	 | j
| j S r   )query_compilerr*   Z_get_filters_from_querysetrD   r?   rH   rJ   nonefilterZdistinctstartstop)r   r*   r8   r#   r#   r$   get_queryset   s    


z"DatabaseSearchResults.get_querysetc                 C   s<   |   }| jr0|jf i | jtd t di}|| jS )N)Zoutput_field)r\   Z_score_fieldannotater   r   Z
FloatFielditeratoriterator_chunk_size)r   r*   r#   r#   r$   
_do_search   s    z DatabaseSearchResults._do_searchc                 C   s   |    S r   )r\   countr4   r#   r#   r$   	_do_count   s    zDatabaseSearchResults._do_countTc                    sz   | j  }|d u r@td  d   d | j jjj d  d|  }| jt	dd
d}t fd	d
|D S )Nz(Cannot facet search results with field "z!". Please add index.FilterField('z') to z.search_fields.r%   pkra   z-countc                    s   g | ]}|  |d  fqS rd   r#   )r'   resultr%   r#   r$   r)      r6   z/DatabaseSearchResults.facet.<locals>.<listcomp>)rW   Z_get_filterable_fieldr   r*   r+   rQ   r\   valuesr]   r   Zorder_byr   )r   r&   r(   r?   resultsr#   r%   r$   facet   s0    
zDatabaseSearchResults.facetN)	rQ   rR   rS   r_   r\   r`   rb   Zsupports_facetrh   r#   r#   r#   r$   rV      s   
rV   c                   @   sH   e Zd ZeZeZeZdd Zdd Z	dd Z
dd Zd	d
 Zdd ZdS )DatabaseSearchBackendc                 C   s   d S r   r#   r4   r#   r#   r$   reset_index   s    z!DatabaseSearchBackend.reset_indexc                 C   s   d S r   r#   )r   r+   r#   r#   r$   add_type   s    zDatabaseSearchBackend.add_typec                 C   s   d S r   r#   r4   r#   r#   r$   refresh_index   s    z#DatabaseSearchBackend.refresh_indexc                 C   s   d S r   r#   r   objr#   r#   r$   add   s    zDatabaseSearchBackend.addc                 C   s   d S r   r#   )r   r+   Zobj_listr#   r#   r$   add_bulk   s    zDatabaseSearchBackend.add_bulkc                 C   s   d S r   r#   rm   r#   r#   r$   delete   s    zDatabaseSearchBackend.deleteN)rQ   rR   rS   r   Zquery_compiler_classZ!autocomplete_query_compiler_classrV   Zresults_classrj   rk   rl   ro   rp   rq   r#   r#   r#   r$   ri      s   ri   N)#collectionsr   warningsr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.modelsr   Zdjango.db.models.expressionsr   Zwagtail.search.backends.baser   r	   r
   r   Zwagtail.search.queryr   r   r   r   r   r   r   Zwagtail.search.utilsr   r   rH   rJ   r   rU   rV   ri   ZSearchBackendr#   r#   r#   r$   <module>   s    $	 =