o
    ޭhd                     @  sF  d dl mZ 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mZ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 d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z#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/m0Z0m1Z1 erd dl2m3Z3 d dl4m5Z5 d dl6m7Z7 eddG dd dZ8eG dd dZ9G dd 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>G d(d) d)eZ?G d*d+ d+eZ@G d,d- d-ZAG d.d/ d/e:ZG d0d1 d1eZBG d2d3 d3eZCG d4d5 d5e:ZDG d6d7 d7e:ZdS )8    )annotationsN)Iterator)	dataclass)field)Enum)TYPE_CHECKINGAnycast)Case)Field)
SqlContextTable)AggregateFunctionDistinctOptionFunction)ArithmeticExpression	Criterion)Function)TermValueWrapper)format_alias_sql)
FieldErrorOperationalError)	JSONField)RelationalField)FilterInfoDict)QueryModifierTableCriterionTupleget_joins_for_related_fieldresolve_field_json_pathresolve_nested_field)
Selectable)Model)AwaitableQueryT)frozenc                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
ResolveContexttype[Model]modelr   tablezdict[str, Any]r   zdict[str, FilterInfoDict]custom_filtersN)__name__
__module____qualname____annotations__ r-   r-   Y/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/tortoise/expressions.pyr$   -   s
   
 r$   c                   @  s4   e Zd ZU ded< eedZded< dZded< dS )	ResolveResultr   term)default_factoryzlist[TableCriterionTuple]joinsNzField | Noneoutput_field)r)   r*   r+   r,   dataclass_fieldlistr2   r3   r-   r-   r-   r.   r/   5   s   
 r/   c                   @  s   e Zd ZdZd	ddZdS )

Expressionz&
    Parent class for expressions
    resolve_contextr$   returnr/   c                 C  s   t  N)NotImplementedErrorselfr7   r-   r-   r.   resolveA   s   zExpression.resolveNr7   r$   r8   r/   )r)   r*   r+   __doc__r=   r-   r-   r-   r.   r6   <   s    r6   c                   @  s$   e Zd ZdZdddZdddZdS )ValuezG
    Wrapper for a value that should be used as a term in a query.
    valuer   r8   Nonec                 C  
   || _ d S r9   )rA   )r<   rA   r-   r-   r.   __init__J      
zValue.__init__r7   r$   r/   c                 C  s   t t| jdS Nr0   )r/   r   rA   r;   r-   r-   r.   r=   M      zValue.resolveN)rA   r   r8   rB   r>   r)   r*   r+   r?   rD   r=   r-   r-   r-   r.   r@   E   s    
r@   c                   @  s$   e Zd ZdZdZdZdZdZdZdS )	ConnectoraddsubmultruedivpowmodN)	r)   r*   r+   rK   rL   rM   divrO   rP   r-   r-   r-   r.   rJ   Q   s    rJ   c                   @  s    e Zd Zdd	d
ZdddZdS )CombinedExpressionleftr6   	connectorrJ   rightr   r8   rB   c                 C  s.   || _ || _t|tr|| _d S t|| _d S r9   )rS   rT   
isinstancer6   r@   rU   )r<   rS   rT   rU   r-   r-   r.   rD   [   s   "zCombinedExpression.__init__r7   r$   r/   c                 C  s   | j |}| j|}|j|j}}|r#|r#t|t|ur#tdtt| jj	}t
||j|jtt|j|j |p=|dS )Nz=Cannot use arithmetic expression between different field typer0   r2   r3   )rS   r=   rU   r3   typer   getattroperatorrT   rA   r/   r0   r5   setr2   )r<   r7   rS   rU   left_output_fieldright_output_fieldoperator_funcr-   r-   r.   r=   `   s    zCombinedExpression.resolveN)rS   r6   rT   rJ   rU   r   r8   rB   r>   )r)   r*   r+   rD   r=   r-   r-   r-   r.   rR   Z   s    
rR   c                   @  s   e Zd ZdZd1ddZd2ddZd3ddZd4ddZd4ddZd4ddZ	d4ddZ
d4ddZd4d d!Zd4d"d#Zd4d$d%Zd4d&d'Zd4d(d)Zd4d*d+Zd4d,d-Zd4d.d/Zd0S )5Fa  
    F() can be used to reference a model field, field of a related model, annotation or
    an attribute of a JSON field. It can be used in the following ways:

    - as a field reference, e.g. F("id")
    - as a related field reference, e.g. F("related_field__field") will return the value of the field
    of the related model.
    - as a JSON field reference, e.g. F("json_field__attribute") will return the value of the "attribute"
    property of the JSON field value. The reference can be nested, e.g. F("json_field__attribute__subattribute")
    - as a JSON field array element reference, e.g. F("json_field__0") will return the first element of the array.

    :param name: The name of the field to reference.
    namestrr8   rB   c                 C  rC   r9   )r`   )r<   r`   r-   r-   r.   rD      rE   z
F.__init__r7   r$   r/   c                 C  sV  g }d }| j d\}}}||jjjv r!t|j|j| j \}}}n|rK||jjjv rKt|jjj| t	rKdd |
dD }tt|jjj| |}nY| j |jv rf|j| j  }	t|	tr_|	}nE|	|j}n>z(|jj}
t|
j| j  }|
j| j d  }r||
jjjd }r|||}W n ty   td| j  d|jj d w t|||dS )N__c                 S  s$   g | ]}|  rt|nt|qS r-   )isdigitintra   ).0itemr-   r-   r.   
<listcomp>   s    zF.resolve.<locals>.<listcomp>function_castzThere is no non-virtual field z
 on Model )r0   r3   r2   )r`   	partitionr&   _metafetch_fieldsr   r'   
fields_maprV   r   splitr   PypikaFieldfields_db_projectionr   r   r=   r0   getget_for_dialectdbcapabilitiesdialectKeyErrorr   r)   r/   )r<   r7   r2   r3   main_name_partrb   rest_name_partsr0   	key_parts
annotationmetafuncr-   r-   r.   r=      sV   


z	F.resolveotherr   rT   rJ   
right_handboolrR   c                 C  s.   t |ts	t|}|rt||| S t| ||S r9   )rV   r6   r@   rR   )r<   r|   rT   r}   r-   r-   r.   _combine   s
   
z
F._combinec                 C  s   |  dtjdS )NFr   rJ   rM   r<   r-   r-   r.   __neg__   rH   z	F.__neg__c                 C     |  |tjdS NFr   rJ   rK   r<   r|   r-   r-   r.   __add__   rH   z	F.__add__c                 C  r   r   r   rJ   rL   r   r-   r-   r.   __sub__   rH   z	F.__sub__c                 C  r   r   r   r   r-   r-   r.   __mul__   rH   z	F.__mul__c                 C  r   r   r   rJ   rQ   r   r-   r-   r.   __truediv__   rH   zF.__truediv__c                 C  r   r   r   rJ   rP   r   r-   r-   r.   __mod__   rH   z	F.__mod__c                 C  r   r   r   rJ   rO   r   r-   r-   r.   __pow__   rH   z	F.__pow__c                 C  r   NTr   r   r-   r-   r.   __radd__   rH   z
F.__radd__c                 C  r   r   r   r   r-   r-   r.   __rsub__   rH   z
F.__rsub__c                 C  r   r   r   r   r-   r-   r.   __rmul__   rH   z
F.__rmul__c                 C  r   r   r   r   r-   r-   r.   __rtruediv__   rH   zF.__rtruediv__c                 C  r   r   r   r   r-   r-   r.   __rmod__   rH   z
F.__rmod__c                 C  r   r   r   r   r-   r-   r.   __rpow__   rH   z
F.__rpow__N)r`   ra   r8   rB   r>   )r|   r   rT   rJ   r}   r~   r8   rR   )r8   rR   )r)   r*   r+   r?   rD   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r-   r-   r.   r_   t   s$    


1











r_   c                      s2   e Zd Zd fddZdd
dZdddZ  ZS )Subqueryqueryr"   r8   rB   c                      t    || _d S r9   )superrD   r   )r<   r   	__class__r-   r.   rD         

zSubquery.__init__ctxr   ra   c                 C  s&   | j   | j   | j j |d S )Nr   )r   _choose_db_if_not_chosen_make_queryget_parameterized_sqlr<   r   r-   r-   r.   get_sql   s   

zSubquery.get_sqlaliasr    c                 C  s"   | j   | j   | j j |S r9   )r   r   r   as_)r<   r   r-   r-   r.   r      s   

zSubquery.as_)r   r"   r8   rB   r   r   r8   ra   )r   ra   r8   r    )r)   r*   r+   rD   r   r   __classcell__r-   r-   r   r.   r      s    
r   c                      s(   e Zd Zd fddZdd	d
Z  ZS )RawSQLsqlra   r8   rB   c                   r   r9   )r   rD   r   )r<   r   r   r-   r.   rD      r   zRawSQL.__init__r   r   c                 C  s   |j rt| j| j|dS | jS )N)r   r   r   )
with_aliasr   r   r   r   r-   r-   r.   r      s   zRawSQL.get_sql)r   ra   r8   rB   r   )r)   r*   r+   rD   r   r   r-   r-   r   r.   r      s    r   c                   @  s   e Zd ZdZdZdZdZedd9ddZd:ddZd:ddZ	d;ddZ
d<ddZd=ddZd>d#d$Zd>d%d&Zd?d*d+Zd>d,d-Zd@d0d1ZdAd2d3ZdAd4d5ZdAd6d7Zd8S )BQa6  
    Q Expression container.
    Q Expressions are a useful tool to compose a query from many small parts.

    :param join_type: Is the join an AND or OR join type?
    :param args: Inner ``Q`` expressions that you want to wrap.
    :param kwargs: Filter statements that this Q object should encapsulate.
    )childrenfilters	join_type_is_negatedANDORr   argsr   ra   kwargsr   r8   rB   c                O  sv   |r|rt dd|i|}|f| }i }tdd |D s!td|| _|| _|| j| jhvr3td|| _d| _d S )Nr   c                 s  s    | ]}t |tV  qd S r9   )rV   r   )re   noder-   r-   r.   	<genexpr>  s    zQ.__init__.<locals>.<genexpr>z%All ordered arguments must be Q nodeszjoin_type must be AND or ORFr-   )	r   allr   r   r   r   r   r   r   )r<   r   r   r   newargr-   r-   r.   rD     s   

z
Q.__init__r|   c                 C  "   t |ts	tdt| || jdS )z
        Returns a binary AND of Q objects, use ``AND`` operator.

        :raises OperationalError: AND operation requires a Q node
        zAND operation requires a Q noder   )rV   r   r   r   r   r-   r-   r.   __and__'     
z	Q.__and__c                 C  r   )z
        Returns a binary OR of Q objects, use ``OR`` operator.

        :raises OperationalError: OR operation requires a Q node
        zOR operation requires a Q noder   )rV   r   r   r   r   r-   r-   r.   __or__1  r   zQ.__or__c                 C  s$   t | jd| ji| j}|  |S )zQ
        Returns a negated instance of the Q object, use ``~`` operator.
        r   )r   r   r   r   negate)r<   qr-   r-   r.   
__invert__;  s   zQ.__invert__objectr~   c                 C  s2   t |tsdS | j|jko| j|jko| j|jkS r   )rV   r   r   r   r   r   r-   r-   r.   __eq__C  s   


zQ.__eq__c                 C  s   | j  | _ dS )z:
        Negates the current Q object. (mutation)
        N)r   r   r-   r-   r.   r   L  s   zQ.negater7   r$   keyrA   r'   r   r   c                 C  st   | d\}}}tt|jjj| }t|||}	tdi ||i}
|
t	|j
|	d d |j|jd}t|	d|@ S )Nrb   r   r   )r&   r'   r   r(   )r2   r-   )ri   r	   r   r&   rj   rl   r   r   r=   r$   related_modelr   r(   r   )r<   r7   r   rA   r'   related_field_namerb   forwarded_fieldsrelated_fieldrequired_joinsr   modifierr-   r-   r.   _resolve_nested_filterR  s   
zQ._resolve_nested_filterc                 C  s   |j | }|j|d  }t|trt|d}n||}|d }|jjjj	j
|d}	|	r.|	}|jjr=t||j|d}
|
S t||j|d}
|
S )Nr   rG   rZ   )filter_func)having_criterion)where_criterion)r(   r   rV   r   r/   r=   r&   rj   rr   executor_classget_overridden_filter_funcr0   is_aggregater   )r<   r7   r   rA   r'   having_infory   annotation_inforZ   overridden_operatorr   r-   r-   r.   _resolve_custom_kwarge  s"   


zQ._resolve_custom_kwargr&   r%   0tuple[Criterion, tuple[Table, Criterion] | None]c           
      C  s   d }|d u r| d|j jv r|j | d}d}n|j |}d|v rG|d ||j j |d |d  kf}d|v rB|d ||}|d }nt|tsf|j j|d  }d|v r`|d |||n|||}|d }|||d|d  |}	|	|fS )	N__isnullTr'   backward_keyvalue_encoderr   rZ   source_field)	rj   r   
get_filterdb_pk_columnrV   r   rl   to_db_valuerp   )
r<   r&   r   rA   r'   joinfilter_infofield_objectop	criterionr-   r-   r.   _process_filter_kwarg}  s.   



zQ._process_filter_kwargc           	      C  sn   ||j jjvr|dd |j jjv r| ||||}|S | |j |||\}}|r-|gng }t||d}|S )Nrb   r   )r   r2   )r&   rj   r   rm   rk   r   r   r   )	r<   r7   r   rA   r'   r   r   r   r2   r-   r-   r.   _resolve_regular_kwarg  s   zQ._resolve_regular_kwargTable | FilterInfoDicttuple[str, Any]c                 C  s   |}||j jjv s||j jjv r$|j jj| }tt|j}t|d|}nD||j jj	v r2t|d|}n6|
dd |j jjv sJ||jv sJ||j jjv rM|}nt|j jj|j jjB t|jB }td| d| t|trs||j}||fS )Npkrb   r   zUnknown filter param 'z'. Allowed base values are )r&   rj   	fk_fields
o2o_fieldsrl   r	   ra   r   rY   
m2m_fieldsrm   rk   r(   r   sortedfieldsr[   r   rV   r6   r=   r0   )r<   r7   r   rA   
filter_keyr   filter_valueallowedr-   r-   r.   _get_actual_filter_params  s8   
zQ._get_actual_filter_paramsc                 C  s   t  }| j D ]4\}}| |||\}}||jv r$| ||||j}n	| ||||j}| j| j	kr8||M }q||O }q| j
rC| }|S r9   )r   r   itemsr   r(   r   r'   r   r   r   r   )r<   r7   r   raw_key	raw_valuer   rA   filter_modifierr-   r-   r.   _resolve_kwargs  s    




zQ._resolve_kwargsc                 C  sJ   t  }| jD ]}||}| j| jkr||M }q||O }q| jr#| }|S r9   )r   r   r=   r   r   r   )r<   r7   r   r   node_modifierr-   r-   r.   _resolve_children  s   



zQ._resolve_childrenc                 C  s   | j r| |S | |S )a   
        Resolves the logical Q chain into the parts of a SQL statement.

        :param model: The Model this Q Expression should be resolved on.
        :param table: ``pypika_tortoise.Table`` to keep track of the virtual SQL table
            (to allow self referential joins)
        )r   r   r   r;   r-   r-   r.   r=     s   

z	Q.resolveN)r   r   r   ra   r   r   r8   rB   )r|   r   r8   r   )r8   r   )r|   r   r8   r~   )r8   rB   )
r7   r$   r   ra   rA   r   r'   r   r8   r   )
r&   r%   r   ra   rA   r   r'   r   r8   r   )r7   r$   r   ra   rA   r   r8   r   )r7   r$   r8   r   )r)   r*   r+   r?   	__slots__r   r   rD   r   r   r   r   r   r   r   r   r   r   r   r   r=   r-   r-   r-   r.   r     s&    	






	



 

 
r   c                   @  sX   e Zd ZU dZdZeZded< dZdddZ	dddZ
d ddZd!ddZd"ddZdS )#r   a  
    Function/Aggregate base.

    :param field: Field name
    :param default_values: Extra parameters to the function.

    .. attribute:: database_func
        :annotation: pypika_tortoise.terms.Function

        The pypika function this represents.

    .. attribute:: populate_field_object
        :annotation: bool = False

        Enable populate_field_object where we want to try and preserve the field type.
    r   r   default_valuesztype[PypikaFunction]database_funcFr   'str | F | CombinedExpression | Functionr   r   r8   rB   c                 G  s   || _ d | _|| _d S r9   r   r<   r   r   r-   r-   r.   rD     s   
zFunction.__init__
Term | strPypikaFunctionc                 G  s   | j |g|R  S r9   )r   r   r-   r-   r.   _get_function_field  s   zFunction._get_function_fieldr7   r$   ra   r/   c                 C  s0   t |j|j|\}}}| jr|| _t|||dS )NrW   )r   r&   r'   populate_field_objectr   r/   )r<   r7   r   r0   r2   r3   r-   r-   r.   _resolve_nested_field  s   

zFunction._resolve_nested_fieldIterator[Any]c                 c  s2    | j D ]}t|tr||jV  q|V  qd S r9   )r   rV   r   r=   r0   )r<   r7   default_valuer-   r-   r.   _resolve_default_values'  s   

z Function._resolve_default_valuesc                 C  sp   |  |}t| jtr| || jn| j|}| j|jg|R  }t||j	|j
d}| jr6|j
 }r6|| _|S )aJ  
        Used to resolve the Function statement for SQL generation.

        :param model: Model the function is applied on to.
        :param table: ``pypika_tortoise.Table`` to keep track of the virtual SQL table
            (to allow self referential joins)
        :return: Dict with keys ``"joins"`` and ``"fields"``
        rW   )r  rV   r   ra   r  r=   r   r0   r/   r2   r3   r  r   )r<   r7   r   function_argr0   resres_output_fieldr-   r-   r.   r=   .  s    



zFunction.resolveN)r   r   r   r   r8   rB   )r   r   r8   r   r7   r$   r   ra   r8   r/   )r7   r$   r8   r  r>   )r)   r*   r+   r?   r   r   r   r,   r  rD   r   r  r  r=   r-   r-   r-   r.   r     s   
 



r   c                      sP   e Zd ZU dZeZded< dddd fddZdddZd fddZ	  Z
S ) 	Aggregatez
    Base for SQL Aggregates.

    :param field: Field name
    :param default_values: Extra parameters to the function.
    :param is_distinct: Flag for aggregate with distinction
    ztype[AggregateFunction]r   FN)distinct_filterr   str | F | CombinedExpressionr   r   r  r~   r  Q | Noner8   rB   c                  s$   t  j|g|R   || _|| _d S r9   )r   rD   r  filter)r<   r   r  r  r   r   r-   r.   rD   Y  s   
zAggregate.__init__(ArithmeticExpression | PypikaField | strr   c                 G  s*   t t| j|g|R  }| jr| }|S r9   )r	   r   r   r  )r<   r   r   functionr-   r-   r.   r   d  s   zAggregate._get_function_fieldr7   r$   ra   r/   c                   sH   t  ||}| jr"t }|| j|M }t |j|j	d |_|S r9   )
r   r  r  r   r=   
PypikaCasewhenr   r0   else_)r<   r7   r   retr   r   r-   r.   r  l  s   zAggregate._resolve_nested_field)
r   r  r   r   r  r~   r  r  r8   rB   )r   r  r8   r   r	  )r)   r*   r+   r?   r   r   r,   rD   r   r  r   r-   r-   r   r.   r
  N  s   
 
r
  c                   @  s   e Zd ZdZd
ddZd	S )	_WhenThenzGThis is not a real term, but a helper to store the when and then terms.r  r   thenr8   rB   c                 C  s   || _ || _d S r9   )r  r  )r<   r  r  r-   r-   r.   rD   y  s   
z_WhenThen.__init__N)r  r   r  r   r8   rB   )r)   r*   r+   r?   rD   r-   r-   r-   r.   r  v  s    r  c                   @  s4   e Zd ZdZdddddZdddZdddZdS )Whenz
    When expression.

    :param args: Q objects
    :param kwargs: keyword criterion like filter
    :param then: value for criterion
    :param negate: false (default)
    F)r   r   r   r  r   r   r~   r   r   r8   rB   c                O  s   || _ || _|| _|| _d S r9   )r   r  r   r   )r<   r  r   r   r   r-   r-   r.   rD     s   
zWhen.__init__list[Q]c                 C  s   g }| j D ]}t|tstd| jr||  q|| q| j D ]!\}}| jr:|tdi ||i  q%|tdi ||i q%|S )Nzexpected Q objects as argsr-   )r   rV   r   	TypeErrorr   appendr   r   )r<   	q_objectsargr   rA   r-   r-   r.   _resolve_q_objects  s   

zWhen._resolve_q_objectsr7   r$   r/   c                 C  sf   |   }t }|D ]	}|||M }q	t| jtr!| j|j}n	ttt	| j}t
t|j|dS rF   )r  r   r=   rV   r  r6   r0   r	   r   wrap_constantr/   r  r   )r<   r7   r  r   r   r  r-   r-   r.   r=     s   zWhen.resolveN)
r   r   r  r   r   r~   r   r   r8   rB   )r8   r  r>   )r)   r*   r+   r?   rD   r  r=   r-   r-   r-   r.   r  ~  s    
r  c                   @  s*   e Zd ZdZdddd
dZdddZdS )r
   z
    Case expression.

    :param args: When objects
    :param default: value for 'CASE WHEN ... THEN ... ELSE <default> END'
    N)defaultr   r  r   .str | F | CombinedExpression | Function | Noner8   rB   c                G  s   || _ || _d S r9   )r   r   )r<   r   r   r-   r-   r.   rD     s   
zCase.__init__r7   r$   r/   c                 C  s   t  }| jD ]}t|tstd||}tt|j}|	|j	|j
}qt| jtr6|| j|j}n	|t| j}t|dS )Nzexpected When objects as argsrG   )r  r   rV   r  r  r=   r	   r  r0   r  r  r   r6   r  r   r  r/   )r<   r7   caser  r  	when_termr-   r-   r.   r=     s   



zCase.resolve)r   r  r   r!  r8   rB   r>   rI   r-   r-   r-   r.   r
     s
    
r
   )E
__future__r   rZ   collections.abcr   dataclassesr   r   r4   enumr   typingr   r   r	   pypika_tortoiser
   r  r   rn   r   r   pypika_tortoise.functionsr   r   pypika_tortoise.termsr   r   r   r   r   r   pypika_tortoise.utilsr   tortoise.exceptionsr   r   tortoise.fields.basetortoise.fields.datar   tortoise.fields.relationalr   tortoise.filtersr   tortoise.query_utilsr   r   r   r   r   pypika_tortoise.queriesr    tortoise.modelsr!   tortoise.querysetr"   r$   r/   r6   r@   rJ   rR   r_   r   r   r   r
  r  r  r-   r-   r-   r.   <module>   sV    		s |Q(6