U
    zh{D                     @   sf  d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZm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d Zdd Zd d! Zd"d# Zd$d% Zd&d' Zeeeeeeeeeeeeeeeeed(Zd)d* Z G d+d, d,Z!G d-d. d.e!Z"G d/d0 d0e!Z#G d1d2 d2e!Z$G d3d4 d4e!Z%G d5d6 d6e&Z'dS )7    )unicode_literalsN)FieldDoesNotExist)ModelQprefetch_related_objects) NullRelationshipValueEncounteredextract_field_valueget_model_fieldsort_by_fieldsc                    sd   t tr:jd kr& fdd}|S  fdd}|S n&t|  }| fdd}|S d S )Nc                    s.   zt |  }W n tk
r$   Y dS X |kS NFr   r   objZother_valueattribute_namevalue ]/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/modelcluster/queryset.py_test   s
    ztest_exact.<locals>._testc                    sJ   zt |  }W n tk
r$   Y dS X j|jkoHt|jpHt|jS r   )r   r   pk
isinstance	__class__r   r   r   r   r      s    
c                    s.   zt |  }W n tk
r$   Y dS X |kS r   r   r   )r   typed_valuer   r   r   .   s
    )r   r   r   r	   	to_python)modelr   r   r   fieldr   )r   r   r   r   
test_exact   s    




r   c                    sD   t |  }|d kr* fdd}n  fdd}|S )Nc                    s.   zt |  }W n tk
r$   Y dS X |d kS r   r   r   val)r   r   r   r   >   s
    ztest_iexact.<locals>._testc                    s:   zt |  }W n tk
r$   Y dS X |d k	o8| kS r   r   r   upperr   r   match_valuer   r   r   G   s
    r	   r   r    )r   r   r"   r   r   r   r!   r   test_iexact8   s    

r$   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n tk
r$   Y dS X |d k	o4|kS r   r   r   r!   r   r   r   U   s
    ztest_contains.<locals>._testr	   r   r   r   r   r   r   r   r!   r   test_containsQ   s    

r'   c                    s*   t |  }||  fdd}|S )Nc                    s:   zt |  }W n tk
r$   Y dS X |d k	o8| kS r   r   r   r!   r   r   r   c   s
    ztest_icontains.<locals>._testr#   r&   r   r!   r   test_icontains_   s    
r(   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n tk
r$   Y dS X |d k	o4|k S r   r   r   r!   r   r   r   q   s
    ztest_lt.<locals>._testr%   r&   r   r!   r   test_ltm   s    

r)   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n tk
r$   Y dS X |d k	o4|kS r   r   r   r!   r   r   r      s
    ztest_lte.<locals>._testr%   r&   r   r!   r   test_lte{   s    

r*   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n tk
r$   Y dS X |d k	o4|kS r   r   r   r!   r   r   r      s
    ztest_gt.<locals>._testr%   r&   r   r!   r   test_gt   s    

r+   c                    s&   t |  }|| fdd}|S )Nc                    s6   zt |  }W n tk
r$   Y dS X |d k	o4|kS r   r   r   r!   r   r   r      s
    ztest_gte.<locals>._testr%   r&   r   r!   r   test_gte   s    

r,   c                    s2   t |  tfdd|D  fdd}|S )Nc                 3   s   | ]}  |V  qd S N)r   ).0r   )r   r   r   	<genexpr>   s     ztest_in.<locals>.<genexpr>c                    s.   zt |  }W n tk
r$   Y dS X |kS r   r   r   )r   match_valuesr   r   r      s
    ztest_in.<locals>._test)r	   set)r   r   Z
value_listr   r   )r   r   r0   r   test_in   s    
r2   c                    s&   t |  }|| fdd}|S )Nc                    s8   zt |  }W n tk
r$   Y dS X |d k	o6|S r   )r   r   
startswithr   r!   r   r   r      s
    ztest_startswith.<locals>._testr%   r&   r   r!   r   test_startswith   s    

r4   c                    s*   t |  }||  fdd}|S )Nc                    s<   zt |  }W n tk
r$   Y dS X |d k	o:| S r   )r   r   r    r3   r   r!   r   r   r      s
    ztest_istartswith.<locals>._testr#   r&   r   r!   r   test_istartswith   s    
r5   c                    s&   t |  }|| fdd}|S )Nc                    s8   zt |  }W n tk
r$   Y dS X |d k	o6|S r   )r   r   endswithr   r!   r   r   r      s
    ztest_endswith.<locals>._testr%   r&   r   r!   r   test_endswith   s    

r7   c                    s*   t |  }||  fdd}|S )Nc                    s<   zt |  }W n tk
r$   Y dS X |d k	o:| S r   )r   r   r    r6   r   r!   r   r   r      s
    ztest_iendswith.<locals>._testr#   r&   r   r!   r   test_iendswith   s    
r8   c                    s:   t |  }||d ||d  fdd}|S )Nr      c                    s>   zt |  }W n tk
r$   Y dS X |d k	o<|ko<|kS r   r   r   r   Zend_valZ	start_valr   r   r      s
    ztest_range.<locals>._testr%   )r   r   Z	range_valr   r   r   r:   r   
test_range   s
    
r;   c                    s    fdd}|S )Nc                    s>   zt |  }W n tk
r$   Y dS X r2|d kS |d k	S d S r   r   r   r   senser   r   r      s    ztest_isnull.<locals>._testr   )r   r   r=   r   r   r<   r   test_isnull   s    
r>   c                    s   t | fdd}|S )Nc                    s8   zt |  }W n tk
r$   Y dS X |d k	o6|S r   r   r   searchr   r   regexr   r   r     s
    ztest_regex.<locals>._test)recompiler   r   Zregex_stringr   r   rA   r   
test_regex  s    
rF   c                    s    t |t j fdd}|S )Nc                    s8   zt |  }W n tk
r$   Y dS X |d k	o6|S r   r?   r   rA   r   r   r     s
    ztest_iregex.<locals>._test)rC   rD   IrE   r   rA   r   test_iregex  s    rH   )exactZiexactcontainsZ	icontainsltZltegtZgteinr3   Zistartswithr6   Z	iendswithrangeZisnullrB   Ziregexc                 C   sj   zt | d| W n tk
r,   d}Y nX d}|sP|d tkrPt|  }nt}d|}|| ||S )N__FT)r	   joinr   FILTER_EXPRESSION_TOKENSpopr   )r   key_clausesr   Zfield_match_foundconstructorr   r   r   r    _build_test_function_from_filter7  s    

rV   c                   @   s   e Zd Zdd ZdS )FakeQuerySetIterablec                 C   s
   || _ d S r-   )queryset)selfrX   r   r   r   __init__M  s    zFakeQuerySetIterable.__init__N)__name__
__module____qualname__rZ   r   r   r   r   rW   L  s   rW   c                   @   s   e Zd Zdd ZdS )ModelIterablec                 c   s   | j jE d H  d S r-   )rX   resultsrY   r   r   r   __iter__R  s    zModelIterable.__iter__Nr[   r\   r]   ra   r   r   r   r   r^   Q  s   r^   c                   @   s   e Zd Zdd ZdS )DictIterablec                 #   sD   | j jpdd | j jjjD }| j jD ]  fdd|D V  q&d S )Nc                 S   s   g | ]
}|j qS r   namer.   r   r   r   r   
<listcomp>X  s     z)DictIterable.__iter__.<locals>.<listcomp>c              
      s    i | ]}|t  |d d d dqS TZpk_onlyZsuppress_fielddoesnotexistZ)suppress_nullrelationshipvalueencounteredr   r.   
field_namer   r   r   
<dictcomp>Z  s    z)DictIterable.__iter__.<locals>.<dictcomp>)rX   dict_fieldsr   _metafieldsr_   rY   field_namesr   rm   r   ra   W  s
    
zDictIterable.__iter__Nrb   r   r   r   r   rc   V  s   rc   c                   @   s   e Zd Zdd ZdS )ValuesListIterablec                 #   sH   | j jpdd | j jjjD }| j jD ] t fdd|D V  q&d S )Nc                 S   s   g | ]
}|j qS r   rd   rf   r   r   r   rg   b  s     z/ValuesListIterable.__iter__.<locals>.<listcomp>c              	      s   g | ]}t  |d d d dqS rh   rj   rk   rm   r   r   rg   d  s     )rX   tuple_fieldsr   rp   rq   r_   tuplerr   r   rm   r   ra   a  s    zValuesListIterable.__iter__Nrb   r   r   r   r   rt   `  s   rt   c                   @   s   e Zd Zdd ZdS )FlatValuesListIterablec                 c   s2   | j jd }| j jD ]}t||ddddV  qd S )Nr   Tri   )rX   ru   r_   r   )rY   rl   r   r   r   r   ra   h  s    zFlatValuesListIterable.__iter__Nrb   r   r   r   r   rw   g  s   rw   c                   @   s   e Zd Zdd Z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d Zd d! Zd"d# Zdd$d%d&Zd'd( Zd)d* Zd+d, Zd-d. ZeeeZd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9Z dS );FakeQuerySetc                 C   s"   || _ || _g | _g | _t| _d S r-   )r   r_   ro   ru   r^   iterable_class)rY   r   r_   r   r   r   rZ   o  s
    zFakeQuerySet.__init__c                 C   s   | S r-   r   r`   r   r   r   allv  s    zFakeQuerySet.allNc                 C   s6   t | j|d k	r|n| j}| j|_| j|_| j|_|S r-   )rx   r   r_   ro   ru   ry   )rY   r_   newr   r   r   	get_cloney  s
    zFakeQuerySet.get_clonec                    sj   j  g } fdd}jD ]B}t|tr>|| | q|\}}|t| j|d| q||S )Nc                    s    fdd}|S )Nc                    sr   d}t jkr&t fddD }n<t jkrHt fddD }nt fddD dk}jrn| S |S )NFc                    s   g | ]}| qS r   r   r.   testrm   r   r   rg     s     zSFakeQuerySet.resolve_q_object.<locals>.test.<locals>.test_inner.<locals>.<listcomp>c                    s   g | ]}| qS r   r   r}   rm   r   r   rg     s     c                    s   g | ]}| qS r   r   r}   rm   r   r   rg     s     r9   )r   ANDrz   ORanysumZnegated)r   result)	connectorfiltersq_objectrm   r   
test_inner  s    

z?FakeQuerySet.resolve_q_object.<locals>.test.<locals>.test_innerr   )r   r   r   r   r   r   r~     s    z+FakeQuerySet.resolve_q_object.<locals>.testrO   )	r   childrenr   r   appendresolve_q_objectrV   r   split)rY   r   r   r~   childrT   r   r   r   r   r     s    

zFakeQuerySet.resolve_q_objectc                 O   sN   g }|D ]}| | | q| D ]"\}}| t| j|d| q&|S )NrO   )r   r   itemsrV   r   r   )rY   argskwargsr   r   keyr   r   r   r   _get_filters  s    zFakeQuerySet._get_filtersc                    s,   | j || | j fdd| jD d}|S )Nc                    s&   g | ] t  fd dD r qS )c                    s   g | ]}| qS r   r   r}   rm   r   r   rg     s     z2FakeQuerySet.filter.<locals>.<listcomp>.<listcomp>rz   r.   r   rm   r   rg     s   z'FakeQuerySet.filter.<locals>.<listcomp>r_   r   r|   r_   rY   r   r   cloner   r   r   filter  s
    
zFakeQuerySet.filterc                    s,   | j || | j fdd| jD d}|S )Nc                    s&   g | ] t  fd dD s qS )c                    s   g | ]}| qS r   r   r}   rm   r   r   rg     s     z3FakeQuerySet.exclude.<locals>.<listcomp>.<listcomp>r   r   r   rm   r   rg     s   z(FakeQuerySet.exclude.<locals>.<listcomp>r   r   r   r   r   r   exclude  s
    
zFakeQuerySet.excludec                 O   sl   | j ||}| }|dkr4| jd| jjj n4|dkrN|D ]
}|  S n| jd| jjj|f d S )Nr   z!%s matching query does not exist.r9   z2get() returned more than one %s -- it returned %s!)r   countr   ZDoesNotExistrp   Zobject_nameZMultipleObjectsReturned)rY   r   r   r   Zresult_countr   r   r   r   get  s    
zFakeQuerySet.getc                 C   s
   t | jS r-   lenr_   r`   r   r   r   r     s    zFakeQuerySet.countc                 C   s
   t | jS r-   boolr_   r`   r   r   r   exists  s    zFakeQuerySet.existsc                 C   s   | D ]
}|  S d S r-   r   )rY   r   r   r   r   first  s    zFakeQuerySet.firstc                 C   s,   | j r(| jt| j d}|D ]
}|  S d S Nr   )r_   r|   reversed)rY   r   r   r   r   r   last  s    zFakeQuerySet.lastc                 G   s   | S r-   r   rY   r   r   r   r   select_related  s    zFakeQuerySet.select_relatedc                 G   s   t | jf|  | S r-   )r   r_   r   r   r   r   prefetch_related  s    zFakeQuerySet.prefetch_relatedc                 G   s   | S r-   r   r   r   r   r   only  s    zFakeQuerySet.onlyc                 G   s   | S r-   r   r   r   r   r   defer  s    zFakeQuerySet.deferc                 G   s.   |   }||_|D ]}t| j| qt|_|S r-   )r|   ro   r	   r   rc   ry   )rY   rq   r   fr   r   r   values  s    zFakeQuerySet.values)flatc                G   sN   |   }||_|D ]}t| j| q|rDt|dkr<tdt|_nt|_|S )Nr9   zH'flat' is not valid when values_list is called with more than one field.)	r|   ru   r	   r   r   	TypeErrorrw   ry   rt   )rY   r   rq   r   r   r   r   r   values_list  s    zFakeQuerySet.values_listc                 G   s&   | j | jd d  d}t|j| |S r   )r|   r_   r
   )rY   rq   r   r   r   r   order_by  s    zFakeQuerySet.order_byc                    sl   g }|sdd | j jjD }t }| jD ]6 t fdd|D }||kr(|| |  q(| j|dS )Nc                 S   s   g | ]}|j s|jqS r   )Zprimary_keyre   rf   r   r   r   rg   	  s      z)FakeQuerySet.distinct.<locals>.<listcomp>c                 3   s   | ]}t t |V  qd S r-   )strr   rf   r   r   r   r/     s     z(FakeQuerySet.distinct.<locals>.<genexpr>r   )	r   rp   rq   r1   r_   rv   addr   r|   )rY   rq   Zunique_resultsZ	seen_keysr   r   r   r   distinct  s    

zFakeQuerySet.distinctc                 C   s   | j S r-   r   r`   r   r   r   _get_result_cache  s    zFakeQuerySet._get_result_cachec                 C   s   t || _d S r-   )listr_   )rY   r   r   r   r   _set_result_cache  s    zFakeQuerySet._set_result_cachec                 C   s
   | j | S r-   r   )rY   kr   r   r   __getitem__  s    zFakeQuerySet.__getitem__c                 c   s   |  | }|E d H  d S r-   )ry   )rY   iteratorr   r   r   ra   !  s    
zFakeQuerySet.__iter__c                 C   s
   t | jS r-   r   r`   r   r   r   __nonzero__%  s    zFakeQuerySet.__nonzero__c                 C   s   t t| S r-   )reprr   r`   r   r   r   __repr__(  s    zFakeQuerySet.__repr__c                 C   s
   t | jS r-   r   r`   r   r   r   __len__+  s    zFakeQuerySet.__len__T)N)!r[   r\   r]   rZ   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyZ_result_cacher   ra   r   r   r   orderedr   r   r   r   rx   n  s:   
			
rx   )(
__future__r   rC   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r   r   Zmodelcluster.utilsr   r   r	   r
   r   r$   r'   r(   r)   r*   r+   r,   r2   r4   r5   r7   r8   r;   r>   rF   rH   rR   rV   rW   r^   rc   rt   rw   objectrx   r   r   r   r   <module>   s\   ,
