o
    [h                     @   s   d Z ddlmZmZ ddl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eZdS )z;Database functions that do comparisons or type conversions.    )FuncValue)_lazy_re_compilec                       s\   e Zd ZdZdZdZ fddZ fddZ fdd	Zd
d Z	dd Z
 fddZ  ZS )Castz)Coerce an expression to a new field type.ZCASTz,%(function)s(%(expressions)s AS %(db_type)s)c                    s   t  j||d d S )N)output_field)super__init__)self
expressionr   	__class__ /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/db/models/functions/comparison.pyr      s   zCast.__init__c                    s&   | j ||d< t j||fi |S )Ndb_type)r   Zcast_db_typer   as_sqlr	   compiler
connectionextra_contextr   r   r   r      s   zCast.as_sqlc           	         s   | j |}|dv r-d}t j||fd|i|\}}|dkr!dnd}|d| ||fS |dkr@d	}t j||fd|i|S | j||fi |S )
N>   datetimetimezstrftime(%%s, %(expressions)s)templater   z%H:%M:%fz%Y-%m-%d %H:%M:%fr   datezdate(%(expressions)s))r   r   r   r   insert)	r	   r   r   r   r   r   sqlparamsformat_stringr   r   r   	as_sqlite   s.   
zCast.as_sqlitec                 K   sF   d }| j  }|dkrd}n	|dkr|jrd}| j||fd|i|S )NZ
FloatFieldz(%(expressions)s + 0.0)	JSONFieldz"JSON_EXTRACT(%(expressions)s, '$')r   )r   get_internal_typeZmysql_is_mariadbr   )r	   r   r   r   r   output_typer   r   r   as_mysql&   s   
zCast.as_mysqlc                 K   s   | j ||fddi|S )Nr   z(%(expressions)s)::%(db_type)s)r   r   r   r   r   as_postgresql1   s   zCast.as_postgresqlc                    s@   | j  dkrd}t j||fd|i|S | j||fi |S )Nr   z JSON_QUERY(%(expressions)s, '$')r   )r   r   r   r   )r	   r   r   r   r   r   r   r   	as_oracle<   s   zCast.as_oracle)__name__
__module____qualname____doc__functionr   r   r   r   r!   r"   r#   __classcell__r   r   r   r   r      s    r   c                       s<   e Zd ZdZdZ fddZedd Z fddZ  Z	S )	Coalescez:Return, from left to right, the first non-null expression.ZCOALESCEc                    *   t |dk r
tdt j|i | d S )N   z+Coalesce must take at least two expressionslen
ValueErrorr   r   r	   Zexpressionsextrar   r   r   r   K      zCoalesce.__init__c                 C   s0   |   D ]}|j}|tu s|d ur|  S qd S )N)get_source_expressionsempty_result_set_valueNotImplemented)r	   r
   resultr   r   r   r4   P   s   zCoalesce.empty_result_set_valuec                    s\   | j  dkr$|  }|dd |  D  tt|j||fi |S | j||fi |S )NZ	TextFieldc                 S   s   g | ]}t |d dqS )ZTO_NCLOB)r(   )r   ).0r
   r   r   r   
<listcomp>^   s    
z&Coalesce.as_oracle.<locals>.<listcomp>)r   r   copyZset_source_expressionsr3   r   r*   r   )r	   r   r   r   cloner   r   r   r#   X   s   zCoalesce.as_oracle)
r$   r%   r&   r'   r(   r   propertyr4   r#   r)   r   r   r   r   r*   F   s    
r*   c                       s<   e Zd ZdZdZdZedZ fddZ fddZ	  Z
S )	CollateZCOLLATEz*%(expressions)s %(function)s %(collation)sFz^[\w-]+$c                    s2   |r| j |std| || _t | d S )NzInvalid collation name: %r.)collation_rematchr/   	collationr   r   )r	   r
   r?   r   r   r   r   o   s   zCollate.__init__c                    s,   | d|j| j t j||fi |S )Nr?   )
setdefaultopsZ
quote_namer?   r   r   r   r   r   r   r   u   s   zCollate.as_sql)r$   r%   r&   r(   r   Zallowed_defaultr   r=   r   r   r)   r   r   r   r   r<   g   s    r<   c                       0   e Zd ZdZdZ fddZ fddZ  ZS )Greatestz
    Return the maximum expression.

    If any expression is null the return value is database-specific:
    On PostgreSQL, the maximum not-null expression is returned.
    On MySQL, Oracle, and SQLite, if any expression is null, null is returned.
    ZGREATESTc                    r+   )Nr,   z+Greatest must take at least two expressionsr-   r0   r   r   r   r      r2   zGreatest.__init__c                       t  j||fddi|S )zUse the MAX function on SQLite.r(   MAXr   r   r   r   r   r   r         zGreatest.as_sqliter$   r%   r&   r'   r(   r   r   r)   r   r   r   r   rC   z   
    rC   c                       rB   )Leastz
    Return the minimum expression.

    If any expression is null the return value is database-specific:
    On PostgreSQL, return the minimum not-null expression.
    On MySQL, Oracle, and SQLite, if any expression is null, return null.
    ZLEASTc                    r+   )Nr,   z(Least must take at least two expressionsr-   r0   r   r   r   r      r2   zLeast.__init__c                    rD   )zUse the MIN function on SQLite.r(   ZMINrF   r   r   r   r   r      rG   zLeast.as_sqliterH   r   r   r   r   rJ      rI   rJ   c                       s$   e Zd ZdZdZ fddZ  ZS )NullIfZNULLIFr,   c                    s>   |   d }t|tr|jd u rtdt j||fi |S )Nr   z2Oracle does not allow Value(None) for expression1.)r3   
isinstancer   valuer/   r   r   )r	   r   r   r   Zexpression1r   r   r   r#      s   zNullIf.as_oracle)r$   r%   r&   r(   Zarityr#   r)   r   r   r   r   rK      s    rK   N)r'   Zdjango.db.models.expressionsr   r   Zdjango.utils.regex_helperr   r   r*   r<   rC   rJ   rK   r   r   r   r   <module>   s    ?!