o 3a@sdZddlmZddlmZmZddlmZddlm Z GdddeZ Gdd d eZ Gd d d eZ Gd d d eZ GdddeZGdddeZGdddeZdS)z;Database functions that do comparisons or type conversions.)NotSupportedError)FuncValue) JSONField)_lazy_re_compilecsTeZdZdZdZdZfddZfddZfdd Zd d Z fd d Z Z S)Castz)Coerce an expression to a new field type.CASTz,%(function)s(%(expressions)s AS %(db_type)s)cstj||ddS)N) output_field)super__init__)self expressionr  __class__G/usr/lib/python3/dist-packages/django/db/models/functions/comparison.pyr sz Cast.__init__c s&|j||d<tj||fi|S)Ndb_type)r cast_db_typer as_sqlr compiler connection extra_contextrrrrsz Cast.as_sqlc  s|j|}|dvr-d}tj||fd|i|\}}|dkr!dnd}|d|||fS|dkr@d }tj||fd|i|S|j||fi|S) N>timedatetimezstrftime(%%s, %(expressions)s)templaterz%H:%M:%fz%Y-%m-%d %H:%M:%frdatezdate(%(expressions)s))r rr rinsert) r rrrrrsqlparams format_stringrrr as_sqlites  zCast.as_sqlitecKsFd}|j}|dkrd}n |dkr|jrd}|j||fd|i|S)N FloatFieldz(%(expressions)s + 0.0)rz"JSON_EXTRACT(%(expressions)s, '$')r)r get_internal_typemysql_is_mariadbr)r rrrr output_typerrras_mysql"s z Cast.as_mysqlc s@|jdkrd}tj||fd|i|S|j||fi|S)Nrz JSON_QUERY(%(expressions)s, '$')r)r r#r r)r rrrrrrr as_oracle-szCast.as_oracle) __name__ __module__ __qualname____doc__functionrr rr!r&r' __classcell__rrrrrs    rc0eZdZdZdZfddZfddZZS)Coalescez:Return, from left to right, the first non-null expression.COALESCEc*t|dkr tdtj|i|dS)Nz+Coalesce must take at least two expressionslen ValueErrorr r r expressionsextrarrrr 9 zCoalesce.__init__c s\|jdkr$|}|dd|Dtt|j||fi|S|j||fi|S)N TextFieldcSsg|]}t|ddqS)TO_NCLOB)r,)r).0r rrr Cs z&Coalesce.as_oracle..)r r#copyset_source_expressionsget_source_expressionsr r/r)r rrrclonerrrr'>s zCoalesce.as_oracle)r(r)r*r+r,r r'r-rrrrr/5s  r/cs8eZdZdZdZedZfddZfddZZ S)CollateCOLLATEz*%(expressions)s %(function)s %(collation)sz ^[\w\-]+$cs2|r|j|std|||_t|dS)NzInvalid collation name: %r.) collation_rematchr5 collationr r )r r rFrrrr Ps zCollate.__init__c s,|d|j|jtj||fi|S)NrF) setdefaultops quote_namerFr rrrrrrVszCollate.as_sql) r(r)r*r,rrrDr rr-rrrrrBJs  rBcr.)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. GREATESTcr1)Nr2z+Greatest must take at least two expressionsr3r6rrrr er9zGreatest.__init__c tj||fddi|S)zUse the MAX function on SQLite.r,MAXr r!rrrrr!jzGreatest.as_sqliter(r)r*r+r,r r!r-rrrrrJ[  rJcsBeZdZdZeZfddZfddZddZdd Z Z S) JSONObject JSON_OBJECTc s8g}|D] \}}|t||fqtj|dS)N)itemsextendrr r )r fieldsr7keyvaluerrrr sszJSONObject.__init__c s&|jjstdtj||fi|S)Nz7JSONObject() is not supported on this database backend.)featureshas_json_object_functionrr rrrrrrys zJSONObject.as_sqlcKs|j||fddi|S)Nr,JSONB_BUILD_OBJECTrrrrr as_postgresqlszJSONObject.as_postgresqlcKs*Gddd}|j||f|dd|S)Nc@seZdZddZdS)z'JSONObject.as_oracle..ArgJoinercSs2ddt|ddd|dddD}d|S)NcSsg|]}d|qS)z VALUE )join)r<argrrrr=sz@JSONObject.as_oracle..ArgJoiner.join..r2z, )zipr^)r argsrrrr^s( z,JSONObject.as_oracle..ArgJoiner.joinN)r(r)r*r^rrrr ArgJoiners rcz,%(function)s(%(expressions)s RETURNING CLOB)) arg_joinerrr\)r rrrrcrrrr'szJSONObject.as_oracle) r(r)r*r,rr r rr]r'r-rrrrrRos  rRcr.)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. LEASTcr1)Nr2z(Least must take at least two expressionsr3r6rrrr r9zLeast.__init__c rL)zUse the MIN function on SQLite.r,MINrNrrrrr!rOzLeast.as_sqliterPrrrrrerQrecs$eZdZdZdZfddZZS)NullIfNULLIFr2c s>|d}t|tr|jdurtdtj||fi|S)Nrz2Oracle does not allow Value(None) for expression1.)r@ isinstancerrXr5r r)r rrr expression1rrrr's zNullIf.as_oracle)r(r)r*r,arityr'r-rrrrrhsrhN)r+ django.dbrdjango.db.models.expressionsrrdjango.db.models.fields.jsonrdjango.utils.regex_helperrrr/rBrJrRrerhrrrrs   -(