o
    (S-g#  ã                   @   s¸   d 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 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eƒZdS )z;Database functions that do comparisons or type conversions.é    )ÚNotSupportedError)ÚFuncÚValue)Ú	TextField)Ú	JSONField)Ú_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.ÚCASTz,%(function)s(%(expressions)s AS %(db_type)s)c                    s   t ƒ j||d� d S )N)Úoutput_field)ÚsuperÚ__init__)ÚselfÚ
expressionr
   ©Ú	__class__© úd/var/www/html/map_library/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
   Ú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>   ÚtimeÚdatetimez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 )NÚ
FloatFieldz(%(expressions)s + 0.0)r   z"JSON_EXTRACT(%(expressions)s, '$')r   )r
   Úget_internal_typeÚmysql_is_mariadbr   )r   r   r   r   r   Úoutput_typer   r   r   Úas_mysql)   s   
zCast.as_mysqlc                 K   ó   | j ||fddi|¤ŽS )Nr   z(%(expressions)s)::%(db_type)s©r   r   r   r   r   Úas_postgresql4   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.Ú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   ÚexpressionsÚextrar   r   r   r   N   ó   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   r?   S   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 )Nr   c                 S   s   g | ]}t |d d�‘qS )ÚTO_NCLOB)r0   )r   )Ú.0r   r   r   r   Ú
<listcomp>a   s    
ÿÿz&Coalesce.as_oracle.<locals>.<listcomp>)r
   r$   ÚcopyÚset_source_expressionsr>   r   r2   r   )r   r   r   r   Úcloner   r   r   r+   [   s   þÿzCoalesce.as_oracle)
r,   r-   r.   r/   r0   r   Úpropertyr?   r+   r1   r   r   r   r   r2   I   s    
r2   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 )	ÚCollateÚ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Úmatchr8   Ú	collationr   r   )r   r   rM   r   r   r   r   r   s   zCollate.__init__c                    s,   |  d|j | j¡¡ tƒ j||fi |¤ŽS )NrM   )Ú
setdefaultÚopsÚ
quote_namerM   r   r   r   r   r   r   r   x   s   zCollate.as_sql)r,   r-   r.   r0   r   Úallowed_defaultr   rK   r   r   r1   r   r   r   r   rI   j   s    rI   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.
    ÚGREATESTc                    r4   )Nr5   z+Greatest must take at least two expressionsr6   r9   r   r   r   r   ˆ   r<   zGreatest.__init__c                    ó   t ƒ j||fddi|¤ŽS )zUse the MAX function on SQLite.r0   ÚMAX©r   r"   r   r   r   r   r"   �   ó   zGreatest.as_sqlite©r,   r-   r.   r/   r0   r   r"   r1   r   r   r   r   rS   }   ó
    rS   c                       sN   e Zd ZdZeƒ Z‡ fdd„Z‡ fdd„Zdd„ Z‡ fdd	„Z	d
d„ Z
‡  ZS )Ú
JSONObjectÚJSON_OBJECTc                    s8   g }|  ¡ D ]\}}| t|ƒ|f¡ qtƒ j|Ž  d S r=   )ÚitemsÚextendr   r   r   )r   Úfieldsr:   ÚkeyÚvaluer   r   r   r   –   s   zJSONObject.__init__c                    s&   |j jstdƒ‚tƒ j||fi |¤ŽS )Nz7JSONObject() is not supported on this database backend.)ÚfeaturesÚhas_json_object_functionr   r   r   r   r   r   r   r   œ   s
   ÿzJSONObject.as_sqlc                K   s2   G dd„ dƒ}| j ||f|ƒ d|› d�dœ|¤ŽS )Nc                   @   s   e Zd Zdd„ ZdS )z'JSONObject.as_native.<locals>.ArgJoinerc                 S   s6   t |d d d… |dd d… dd�}d dd„ |D ƒ¡S )Nr5   é   T)Ústrictz, c                 S   s   g | ]}d   |¡‘qS )z VALUE )Újoin)rC   Úpairr   r   r   rD   §   s    z@JSONObject.as_native.<locals>.ArgJoiner.join.<locals>.<listcomp>)Úziprf   )r   ÚargsÚpairsr   r   r   rf   ¥   s   "z,JSONObject.as_native.<locals>.ArgJoiner.joinN)r,   r-   r.   rf   r   r   r   r   Ú	ArgJoiner¤   s    rk   z'%(function)s(%(expressions)s RETURNING ú))Ú
arg_joinerr   r)   )r   r   r   Ú	returningr   rk   r   r   r   Ú	as_native£   s   þ
üûzJSONObject.as_nativec                    sj   |j jr|j jr)|  ¡ }| dd„ t| ¡ ƒD ƒ¡ tt|ƒj	||fddi|¤ŽS | j
||fddi|¤ŽS )Nc                 S   s,   g | ]\}}|d  dkrt |tƒ ƒn|‘qS )r5   r   )r   r   )rC   Úindexr   r   r   r   rD   ¸   s    ÿÿz,JSONObject.as_postgresql.<locals>.<listcomp>r0   ÚJSONB_BUILD_OBJECTrn   ÚJSONB)rb   Úis_postgresql_16Úuses_server_side_bindingrE   rF   Ú	enumerater>   r   r[   r   ro   )r   r   r   r   rE   r   r   r   r*   ±   s&   ÿþ
þÿ
þýüzJSONObject.as_postgresqlc                 K   r(   )Nrn   ÚCLOB)ro   r   r   r   r   r+   Å   s   zJSONObject.as_oracle)r,   r-   r.   r0   r   r
   r   r   ro   r*   r+   r1   r   r   r   r   r[   ’   s    r[   c                       rR   )Ú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.
    ÚLEASTc                    r4   )Nr5   z(Least must take at least two expressionsr6   r9   r   r   r   r   Ô   r<   zLeast.__init__c                    rU   )zUse the MIN function on SQLite.r0   ÚMINrW   r   r   r   r   r"   Ù   rX   zLeast.as_sqliterY   r   r   r   r   rw   É   rZ   rw   c                       s$   e Zd ZdZdZ‡ fdd„Z‡  ZS )ÚNullIfÚNULLIFr5   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.)r>   Ú
isinstancer   ra   r8   r   r   )r   r   r   r   Úexpression1r   r   r   r+   â   s   zNullIf.as_oracle)r,   r-   r.   r0   Úarityr+   r1   r   r   r   r   rz   Þ   s    rz   N)r/   Ú	django.dbr   Údjango.db.models.expressionsr   r   Údjango.db.models.fieldsr   Údjango.db.models.fields.jsonr   Údjango.utils.regex_helperr   r   r2   rI   rS   r[   rw   rz   r   r   r   r   Ú<module>   s    ?!7