o xg @sddlZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZdd lmZdd lmZGd d d ZGdddZGdddZeGdddeeZddejejej ej!fDZ"ej#ddddZ$GdddeeZ%Gddde%Z&Gddde%Z'eGd d!d!eZ(Gd"d#d#e(Z)Gd$d%d%e(Z*Gd&d'd'eeZ+Gd(d)d)eZ,Gd*d+d+eZ-Gd,d-d-eZ.Gd.d/d/eZ/Gd0d1d1eZ0Gd2d3d3e+Z1Gd4d5d5eZ2Gd6d7d7eZ3Gd8d9d9eZ4Gd:d;d;eeZ5Gdd?d?eZ7Gd@dAdAeeZ8GdBdCdCeZ9GdDdEdEe9Z:GdFdGdGe9Z;dS)HNDecimal)UUID)EmptyResultSet FieldError)NotSupportedError connection)fields) LOOKUP_SEP)Q)deconstructible)cached_property) make_hashablec@eZdZdZddZdS)SQLiteNumericMixinzp Some expressions with output_field=DecimalField() must be cast to numeric to be properly filtered. cKs\|j||fi|\}}z|jdkrd|}W||fSW||fSty-Y||fSw)N DecimalFieldzCAST(%s AS NUMERIC))as_sql output_fieldget_internal_typer)selfcompilerr extra_contextsqlparamsr>/usr/lib/python3/dist-packages/django/db/models/expressions.py as_sqlites  zSQLiteNumericMixin.as_sqliteN)__name__ __module__ __qualname____doc__rrrrrrs rc@seZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd dZddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Z d1d2Z!d3d4Z"d5d6Z#d7d8Z$d9d:Z%d;S)< Combinablezu Provide the ability to combine one or two objects with some connector. For example F('foo') + F('bar'). +-*/^z%%&|z<>#cCs.t|ds t|}|rt|||St|||S)Nresolve_expression)hasattrValueCombinedExpression)rother connectorreversedrrr_combine:s   zCombinable._combinecCs|d|jdS)NFr1MULrrrr__neg__GzCombinable.__neg__cC|||jdSNFr1ADDrr.rrr__add__Jr7zCombinable.__add__cCr8r9r1SUBr<rrr__sub__Mr7zCombinable.__sub__cCr8r9r3r<rrr__mul__Pr7zCombinable.__mul__cCr8r9r1DIVr<rrr __truediv__Sr7zCombinable.__truediv__cCr8r9r1MODr<rrr__mod__Vr7zCombinable.__mod__cCr8r9r1POWr<rrr__pow__Yr7zCombinable.__pow__cCs0t|ddrt|ddrt|t|@StdN conditionalF:Use .bitand() and .bitor() for bitwise logical operations.getattrr NotImplementedErrorr<rrr__and__\ zCombinable.__and__cCr8r9)r1BITANDr<rrrbitandcr7zCombinable.bitandcCr8r9)r1 BITLEFTSHIFTr<rrr bitleftshiftfr7zCombinable.bitleftshiftcCr8r9)r1 BITRIGHTSHIFTr<rrr bitrightshiftir7zCombinable.bitrightshiftcCr8r9)r1BITXORr<rrrbitxorlr7zCombinable.bitxorcCs0t|ddrt|ddrt|t|BStdrKrNr<rrr__or__orRzCombinable.__or__cCr8r9)r1BITORr<rrrbitorvr7zCombinable.bitorcCr8NTr:r<rrr__radd__yr7zCombinable.__radd__cCr8r^r>r<rrr__rsub__|r7zCombinable.__rsub__cCr8r^r3r<rrr__rmul__r7zCombinable.__rmul__cCr8r^rBr<rrr __rtruediv__r7zCombinable.__rtruediv__cCr8r^rEr<rrr__rmod__r7zCombinable.__rmod__cCr8r^rHr<rrr__rpow__r7zCombinable.__rpow__cCtdNrMrPr<rrr__rand__zCombinable.__rand__cCrerfrgr<rrr__ror__rizCombinable.__ror__N)&rrrr r;r?r4rCrIrFrSr\rUrWrYr1r6r=r@rArDrGrJrQrTrVrXrZr[r]r_r`rarbrcrdrhrjrrrrr!!sH  r!c@s2eZdZdZdZdZdZdZd?ddZddZ d d Z d d Z d dZ ddZ ddZeddZeddZeddZd@ddZeddZeddZedd Zed!d"Zd#d$Zed%d&Zed'd(Zd)d*Zd+d,Zd-d.Zd/d0Z d?d1d2Z!d3d4Z"d5d6Z#d7d8Z$d9d:Z%d;d<Z&d=d>Z'dS)ABaseExpressionz%Base class for all query expressions.FTNcCs|dur ||_dSdSNrrrrrr__init__s zBaseExpression.__init__cCs|j}|dd|S)N convert_value)__dict__copypop)rstaterrr __getstate__  zBaseExpression.__getstate__cCs$|j|jurgn|jg|j|Srl)rp_convert_value_nooprget_db_convertersrrrrrrxs  z BaseExpression.get_db_converterscCgSrlrr5rrrget_source_expressionsz%BaseExpression.get_source_expressionscCs |rJdSrlrrexprsrrrset_source_expressions z%BaseExpression.set_source_expressionscGsdd|DS)NcSs4g|]}t|dr |n t|trt|nt|qSr*)r+ isinstancestrFr,.0argrrr s z5BaseExpression._parse_expressions..r)r expressionsrrr_parse_expressionssz!BaseExpression._parse_expressionscCre)a Responsible for returning a (sql, [params]) tuple to be included in the current query. Different backends can provide their own implementation, by providing an `as_{vendor}` method and patching the Expression: ``` def override_as_sql(self, compiler, connection): # custom logic return super().as_sql(compiler, connection) setattr(Expression, 'as_' + connection.vendor, override_as_sql) ``` Arguments: * compiler: the query compiler responsible for generating the query. Must have a compile method, returning a (sql, [params]) tuple. Calling compiler(value) will return a quoted `value`. * connection: the database connection used for the current query. Return: (sql, params) Where `sql` is a string containing ordered sql parameters to be replaced with the elements of the list `params`. z"Subclasses must implement as_sql()rgrrrrrrrszBaseExpression.as_sqlcCtdd|DS)Ncs|]}|o|jVqdSrl)contains_aggregaterexprrrr z4BaseExpression.contains_aggregate..anyr{r5rrrrz!BaseExpression.contains_aggregatecCr)Ncsrrl)contains_over_clauserrrrrrz6BaseExpression.contains_over_clause..rr5rrrrrz#BaseExpression.contains_over_clausecCr)Ncsrrl)contains_column_referencesrrrrrrz.rr5rrrrrz)BaseExpression.contains_column_referencescs4|}|_|fdd|D|S)a  Provide the chance to do any preprocessing or validation before being added to the query. Arguments: * query: the backend query implementation * allow_joins: boolean allowing or denying use of joins in this query * reuse: a set of reusable joins for multijoins * summarize: a terminal aggregate clause * for_save: whether this expression about to be used in a save or update Return: an Expression to be added to the query. cs$g|]}|r|ndqSrlrr allow_joinsqueryreuse summarizerrrs z5BaseExpression.resolve_expression..)rr is_summaryrr{rrrrrfor_savecrrrr*s z!BaseExpression.resolve_expressioncCst|jtjSrl)rrr BooleanFieldr5rrrrLszBaseExpression.conditionalcC|jSrlrmr5rrrfieldszBaseExpression.fieldcCs"|}|durd|_td|S)z+Return the output type of this expressions.NTz4Cannot resolve expression type, unknown output_field)_resolve_output_field_output_field_resolved_to_nonerrnrrrrs zBaseExpression.output_fieldcCs&z|jWSty|jsYdSw)z Return the output field of this expression, or None if _resolve_output_field() didn't return an output type. N)rrrr5rrr_output_field_or_nones z$BaseExpression._output_field_or_nonecCsTdd|D}|D]}|D]}t||js#td|jj|jjfq|SdS)a Attempt to infer the output type of the expression. If the output fields of all source fields match then, simply infer the same type here. This isn't always correct, but it makes sense most of the time. Consider the difference between `2 + 2` and `2 / 3`. Inferring the type here is a convenience for the common case. The user should supply their own output_field with more complex computations. If a source's output field resolves to None, exclude it from this check. If all sources are None, then an error is raised higher up the stack in the output_field property. css|] }|dur|VqdSrlr)rsourcerrrr)sz7BaseExpression._resolve_output_field..zCExpression contains mixed types: %s, %s. You must set output_field.N)get_source_fieldsr __class__rr)r sources_iterrrrrrrs z$BaseExpression._resolve_output_fieldcC|Srlrvalue expressionrrrrrw6z"BaseExpression._convert_value_noopcCsF|j}|}|dkrddS|drddS|dkr ddS|jS)z Expressions provide their own converters because users have the option of manually specifying the output_field which may be a different type from the one the database returns. FloatFieldcS|durdSt|Srl)floatrrrrDz.BaseExpression.convert_value.. IntegerFieldcSrrl)intrrrrrFrrcSrrlrrrrrrHr)rrendswithrw)rr internal_typerrrrp:s zBaseExpression.convert_valuecC |j|Srl)r get_lookup)rlookuprrrrKrzBaseExpression.get_lookupcCrrl)r get_transformrnamerrrrNrzBaseExpression.get_transformcs(|}|fdd|D|S)Ncs"g|] }|dur |ndqSrl)relabeled_clonere change_maprrrSsz2BaseExpression.relabeled_clone..)rrrr{)rrclonerrrrQs zBaseExpression.relabeled_clonecCs t|Srl)rrr5rrrrrY zBaseExpression.copycCs0|js|gSg}|D] }||q |Srl)rr{extendget_group_by_colsraliascolsrrrrr\s  z BaseExpression.get_group_by_colscCsdd|DS)z9Return the underlying field types used by this aggregate.cSsg|]}|jqSr)rrrrrrfsz4BaseExpression.get_source_fields..)r{r5rrrrdz BaseExpression.get_source_fieldscKt|fi|SrlOrderByrkwargsrrraschr7zBaseExpression.asccKt|fddi|SN descendingTrrrrrdesckzBaseExpression.desccCrrlrr5rrrreverse_orderingnr|zBaseExpression.reverse_orderingccs>|V|D]}|rt|dr|EdHq|VqdS)zi Recursively yield this expression and all subexpressions, in depth-first order. flattenN)r{r+r)rrrrrrqs  zBaseExpression.flattencCs$t|jdr|j|||S||fS)z Custom format for select clauses. For example, EXISTS expressions need to be wrapped in CASE WHEN on Oracle. select_format)r+rrrrrrrrrr~s zBaseExpression.select_formatrlNTNFF)(rrrr rr filterablewindow_compatiblerorurxr{rrrr rrrr*propertyrLrrrr staticmethodrwrprrrrrrrrrrrrrrrrrksX              rkc@s,eZdZdZeddZddZddZdS) Expressionz:An expression that can be combined with other expressions.c Cst|j}|j\}}|j|i|}||j}|jg}|D])\}}t |t j r@|j r;|j r;|j jj|j f}n t|}nt|}|||fq"t|Srl)inspect signaturero_constructor_args bind_partialapply_defaults argumentsitemsrrr Fieldrmodel_metalabeltyperappendtuple) rconstructor_signatureargsrrridentityrrrrrrs       zExpression.identitycCst|tstS|j|jkSrl)rrNotImplementedrr<rrr__eq__s  zExpression.__eq__cC t|jSrl)hashrr5rrr__hash__rzExpression.__hash__N)rrrr r rrrrrrrrs   rc CsXi|](}|tjtjtjftjtjtjftjtjtjftjtjtjftjtjtjfgqSr)r rrr)rr/rrr sr)maxsizecCs<t|d}|D]\}}}t||rt||r|SqdS)Nr)_connector_combinatorsget issubclass)r/lhs_typerhs_type combinatorscombinator_lhs_typecombinator_rhs_type combined_typerrr_resolve_combined_types rcs\eZdZdfdd ZddZddZdd Zd d Zfd d ZddZ dddZ Z S)r-Ncs$tj|d||_||_||_dSNrm)superror/lhsrhs)rrr/rrrrrros zCombinedExpression.__init__cCsd|jj|S)Nz<{}: {}>)formatrrr5rrr__repr__r7zCombinedExpression.__repr__cCsd|j|j|jS)Nz{} {} {})r rr/rr5rrr__str__rzCombinedExpression.__str__cC |j|jgSrlrrr5rrrr{rz)CombinedExpression.get_source_expressionscC|\|_|_dSrlr r}rrrrr7z)CombinedExpression.set_source_expressionscsNztWSty&t|jt|jjt|jj}|dur!|YSwrl) rrrrr/rrrr)rrrrrrs     z(CombinedExpression._resolve_output_fieldcCspg}g}||j\}}||||||j\}}||||d}|j|j|}|||fSNz(%s))compilerrrropscombine_expressionr/rrrrexpression_paramsrrexpression_wrapperrrrrs     zCombinedExpression.as_sqlTFc Cs|j|||||}|j|||||}t|ttfsz|j}Wn tt fy/d}Ynwz|j} Wn tt fyDd} Ynwd|| hvr_|| kr_t|j|j |j|||||Shd} |j |j kr|| vr|| krt|j|j|||||S| } || _ || _|| _| S)N DurationField> DateField TimeField DateTimeField)rr*rrDurationExpressionTemporalSubtractionrrAttributeErrorrr/r?rrr) rrrrrrrrrrdatetime_fieldsrrrrr*s6  z%CombinedExpression.resolve_expressionrlr) rrrror r r{rrrr* __classcell__rrrrr-s  r-cs$eZdZddZfddZZS)rcCsRz|j}Wn tyYnw|dkr$||\}}|j||fS||S)Nr)rrrrrformat_for_duration_arithmetic)rsiderroutputrrrrrrs    zDurationExpression.compilecs|jjr t||S|j|g}g}||j||\}}||| |||j ||\}}||| |d}|j |j |}|||fSr) featureshas_native_duration_fieldrrrcheck_expression_supportrrrrrcombine_duration_expressionr/rrrrrs      zDurationExpression.as_sql)rrrrrrrrrrrs rcs,eZdZeZfddZddZZS)rcst||j|dSrl)rror?)rrrrrrro(zTemporalSubtraction.__init__cCs<|j|||j}||j}|j|jj||Srl)rr$rrrsubtract_temporalsrr)rrrrrrrrr+s   zTemporalSubtraction.as_sql) rrrr rrrorrrrrrr%s rc@sNeZdZdZddZddZ  dd d Zd d Zd dZddZ ddZ dS)rzDAn object capable of resolving references to existing query objects.cCs ||_dS)z^ Arguments: * name: the name of the field this expression references N)rrrrrro6s z F.__init__cCd|jj|jSN{}({}))r rrrr5rrrr =z F.__repr__NTFcCs||j|||Srl) resolve_refrrrrrrrrrrr*@rzF.resolve_expressioncKrrlrrrrrrDr7zF.asccKrrrrrrrrGrzF.desccCs|j|jko |j|jkSrl)rrr<rrrrJzF.__eq__cCrrl)rrr5rrrrMrz F.__hash__r) rrrr ror r*rrrrrrrrr2s  rcs>eZdZdZdZddZfddZddZd d d ZZ S) ResolvedOuterRefz An object that contains a reference to an outer query. In this case, the reference to the outer query has been resolved because the inner query has been used as a subquery. FcOre)NzXThis queryset contains a reference to an outer query and may only be used in a subquery.) ValueErrorrrrrrrrZrizResolvedOuterRef.as_sqlcs"tj|i|}t|jv|_|Srl)rr*r rpossibly_multivalued)rrrcolrrrr*`s z#ResolvedOuterRef.resolve_expressioncCrrlrrrelabelsrrrrhr|z ResolvedOuterRef.relabeled_cloneNcCrzrlrrrrrrrkr|z"ResolvedOuterRef.get_group_by_colsrl) rrrr rrr*rrrrrrrr/Qs r/c@s eZdZdZddZddZdS)OuterRefFcOst|j|jr |jSt|jSrl)rrrr/r1rrrr*rs zOuterRef.resolve_expressioncCrrlrr4rrrrwr|zOuterRef.relabeled_cloneN)rrrrr*rrrrrr7os r7csveZdZdZdZdZdZdZddfdd Zdd Z d d Z d d Z ddZ dddZ dddZfddZZS)FunczAn SQL function call.Nz%(function)s(%(expressions)s), rmcsh|jdur"t||jkr"td|jj|j|jdkrdndt|ftj|d|j||_||_ dS)Nz#'%s' takes exactly %s %s (%s given)argumentrrm) aritylen TypeErrorrrrrorsource_expressionsextra)rrrr@rrrros  z Func.__init__cCsl|jdd|jD}i|j|}|r.dddt|D}d|jj ||Sd|jj |S)Ncs|]}t|VqdSrlrrrrrrz Func.__repr__..r9css(|]\}}t|dt|VqdS)=NrB)rkeyvalrrrrs& {}({}, {})r*) arg_joinerjoinr?r@_get_repr_optionssortedrr rr)rrr@rrrr s z Func.__repr__cCsiS)zAReturn a dict of extra __init__() options to include in the repr.rr5rrrrJrzFunc._get_repr_optionscCrrlr?r5rrrr{zFunc.get_source_expressionscCs ||_dSrlrLr}rrrrrzFunc.set_source_expressionsTFc Cs>|}||_t|jD]\}}|||||||j|<q |Srl)rrr enumerater?r*) rrrrrrrposrrrrr*s zFunc.resolve_expressionc Ks|j|g}g}|jD]} || \} } || || q i|j|} |dur1|| d<n| d|j|p@| d|j }|pI| d|j }| || d<| d<|| |fS)NfunctiontemplaterHrr) rr$r?rrrr@ setdefaultrPrrQrHrI) rrrrPrQrHr sql_partsrrarg_sql arg_paramsdatarrrrs      z Func.as_sqlcs*t}|jdd|_|j|_|Srl)rrrr?r@)rrrrrrrrs  z Func.copyr)NNN)rrrr rPrQrHr<ror rJr{rr*rrrrrrrrr8{s  r8csVeZdZdZdZdfdd ZddZdd Zdfd d Zdd dZ ddZ Z S)r,z9Represent a wrapped value as a node within an expression.FNcstj|d||_dS)a: Arguments: * value: the value this expression represents. The value will be added into the sql parameter list and properly quoted. * output_field: an instance of the model field type that this expression will return, such as IntegerField() or CharField(). rmN)rror)rrrrrrros zValue.__init__cCr(r))r rrrr5rrrr r+zValue.__repr__cCs||j||j}|j}|dur1|jr|j||d}n|j||d}t|dr1|||||gfS|dur9dgfSd|gfS)N)rget_placeholderNULLz%s) rr$rrrget_db_prep_saveget_db_prep_valuer+rW)rrrrFrrrrrs   z Value.as_sqlTcst|||||}||_|Srl)rr*rrrrrr*szValue.resolve_expressioncCrzrlrr6rrrrr|zValue.get_group_by_colscCst|jtr tSt|jtrtSt|jtrtSt|jt r(t St|jt j r3t St|jt j r>tSt|jt jrItSt|jt jrTtSt|jtr^tSt|jtrhtSt|jtrrtSdSrl)rrrr CharFieldboolrrrrrdatetimerdatertimer timedeltarrrbytes BinaryFieldr UUIDFieldr5rrrrs.       zValue._resolve_output_fieldrlr) rrrr rror rr*rrrrrrrr,s  r,csFeZdZdfdd ZddZddZddd Zdfd d ZZS)RawSQLNcs0|durt}|||_|_tj|ddSr)r rrrrro)rrrrrrrroszRawSQL.__init__cCd|jj|j|jSNrG)r rrrrr5rrrr r&zRawSQL.__repr__cCsd|j|jfSr)rrrrrrrr7z RawSQL.as_sqlcC|gSrlrr6rrrrrMzRawSQL.get_group_by_colsTFc sh|jjD]#}|jjD]}|\}} | |jvr(||j|||nq qt |||||Srl) rrget_parent_list local_fieldsget_attname_columnlowerrr,rrr*) rrrrrrparent parent_field_ column_namerrrr*s  zRawSQL.resolve_expressionrlr) rrrror rrr*rrrrrrd s  rdc@seZdZddZddZdS)StarcCsdS)Nz'*'rr5rrrr )r|z Star.__repr__cCsdgfS)Nr$rrrrrr,z Star.as_sqlN)rrrr rrrrrrp(s rpcsPeZdZdZdZdfdd ZddZdd Zd d Zdd d Z ddZ Z S)ColTFNcs,|dur|}tj|d|||_|_dSr)rrortarget)rrrsrrrrro5sz Col.__init__cCs>|j|j}}|r|t|fnt|f}d|jjd|S)Nr*r9)rrsrr rrrI)rrrs identifiersrrrr ;sz Col.__repr__cCs<|j|jj}}|r||fn|f}dt|j|}|gfS)N.)rrscolumnrImapquote_name_unless_alias)rrrrrvrtrrrrr@sz Col.as_sqlcCs,|jdur|S|||j|j|j|jSrl)rrrrsrr4rrrrFs zCol.relabeled_clonecCrgrlrr6rrrrKrMzCol.get_group_by_colscCs0|j|jkr |j|S|j||j|Srl)rsrrxryrrrrxNs    zCol.get_db_convertersrl) rrrrr2ror rrrrxrrrrrrr0s rrcs\eZdZdZfddZddZddZdd Zdd dZddZ ddZ dddZ Z S)Refz~ Reference to column alias of the query. For example, Ref('sum_cost') in qs.annotate(sum_cost=Sum('cost')) query. cst|||_|_dSrl)rrorefsr)rrzrrrrroZs z Ref.__init__cCrerf)r rrrzrr5rrrr ^r&z Ref.__repr__cC|jgSrlrr5rrrr{arqzRef.get_source_expressionscCs |\|_dSrlr|r}rrrrdrzRef.set_source_expressionsNTFcCrrlrr-rrrr*gszRef.resolve_expressioncCrrlrr4rrrrlr|zRef.relabeled_clonecCs|j|jgfSrl)r quote_namerzrrrrror+z Ref.as_sqlcCrgrlrr6rrrrrrMzRef.get_group_by_colsrrl) rrrr ror r{rr*rrrrrrrrryUs  rycs4eZdZdZdZfddZddZddZZS) ExpressionListz An expression containing multiple expressions. Can be used to provide a list of expressions as an argument to another expression, like an ordering clause. z%(expressions)scs*|s td|jjtj|i|dS)Nz$%s requires at least one expression.)r0rrrro)rrr@rrrro~szExpressionList.__init__cCs|jdd|jDS)NcsrArlrBrrrrrrCz)ExpressionList.__str__..)rHrIr?r5rrrr r.zExpressionList.__str__cKs|j||fi|Srl)r)rrrrrrrrszExpressionList.as_sqlite) rrrr rQror rrrrrrr~vs  r~csNeZdZdZfddZddZddZdfd d Zd d Zd dZ Z S)ExpressionWrapperz An expression that can wrap another expression so that it can provide extra context to the inner expression, such as the output_field. cstj|d||_dSr)rror)rrrrrrros zExpressionWrapper.__init__cC|d|_dSNrrr}rrrrz(ExpressionWrapper.set_source_expressionscCr{rlrr5rrrr{rqz(ExpressionWrapper.get_source_expressionsNcs4t|jtr|j}|j|_|j|dStS)N)r)rrrrrrrr)rrrrrrrs    z#ExpressionWrapper.get_group_by_colscCs ||jSrl)rrrrrrrrzExpressionWrapper.as_sqlcCr(r))r rrrr5rrrr r+zExpressionWrapper.__repr__rl) rrrr rorr{rrr rrrrrrs  rcsleZdZdZdZdfdd ZddZdd Zd d Zd d Z ddZ dddZ dddZ dddZ ZS)Whenz"WHEN %(condition)s THEN %(result)sFNc s|r"|durtdi|d}}nt|ddr"t|fi|d}}|dus.t|ddr.|r2tdt|tr=|s=tdtjdd||_||d|_ dS)NrLFzLWhen() supports a Q object, a boolean expression, or lookups as a condition.z1An empty Q() can't be used as a When() condition.rmrr) r rOr>rr0rro conditionrresult)rrthenlookupsrrrros z When.__init__cCsd|j|jfS)NzWHEN %r THEN %rrrr5rrrr r7z When.__str__cCd|jj|fSNz<%s: %s>rrr5rrrr r7z When.__repr__cCr rlrr5rrrr{rzWhen.get_source_expressionscCrrlrr}rrrrr7zWhen.set_source_expressionscCs |jjgSrl)rrr5rrrrs zWhen.get_source_fieldsTcCsJ|}||_t|jdr|j||||d|_|j||||||_|S)Nr*F)rrrr+rr*rrrrrr*s  zWhen.resolve_expressionc Ksn|j||}g}||j\}}||d<||||j\} } | |d<|| |p0|j}|||fS)Nrr)rr$rrrrrQ) rrrrQrtemplate_params sql_params condition_sqlcondition_params result_sql result_paramsrrrrs     z When.as_sqlcC$g}|D] }||q|Srlr{rrrrrrrs zWhen.get_group_by_colsNNrrl)rrrrQrLror r r{rrr*rrrrrrrrs   rcs~eZdZdZdZdZdddfdd Zdd Zd d Zd d Z ddZ dddZ fddZ dddZ dfdd ZZS)Casez An SQL searched CASE expression: CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END z#CASE %(cases)s ELSE %(default)s END N)defaultrcsJtdd|Ds tdt|t||_||d|_||_dS)Ncss|]}t|tVqdSrl)rr)rcaserrrrrz Case.__init__..z.Positional arguments must all be When objects.r) allr>rrolistcasesrrr@)rrrrr@rrrros    z Case.__init__cCs dddd|jD|jfS)NzCASE %s, ELSE %rr9csrArlrB)rrrrrrrCzCase.__str__..)rIrrr5rrrr s z Case.__str__cCrrrr5rrrr r7z Case.__repr__cCs|j|jgSrlrrr5rrrr{ rzCase.get_source_expressionscCs|^|_|_dSrlrr}rrrrr+zCase.set_source_expressionsTFc CsT|}||_t|jD]\}}|||||||j|<q |j||||||_|Srl)rrrrNrr*r) rrrrrrrrOrrrrr*s zCase.resolve_expressioncst}|jdd|_|Srl)rrrr)rrrrrrrs z Case.copyc Ks|j||js||jSi|j|}g}g}|jD]} z || \} } Wn ty1Yqw|| || q||j\} } |sK| | fS|pO|j }| ||d<| |d<|| |ph| d|j }||}|j dur{|j|j|}||fS)NrrrQ)rr$rrrr@rrr case_joinerrIrrQrunification_cast_sqlr)rrrrQrrr case_partsrrcase_sql case_params default_sqldefault_paramsrrrrrs4         z Case.as_sqlcs|js |j|St|Srl)rrrrr6rrrr9s  zCase.get_group_by_colsrrrl)rrrr rQrror r r{rr*rrrrrrrrrrs    rcsveZdZdZdZdZdfdd ZddZd d Zd d Z fd dZ e ddZ ddZ dddZdddZZS)Subqueryz An explicit subquery. It may contain OuterRef() references to the outer query which will be resolved when it is applied to that query. z(%(subquery)s)FNc s$t|d||_||_t|dS)Nr)rOrr@rro)rquerysetrr@rrrroGszSubquery.__init__cCr{rlrr5rrrr{MrqzSubquery.get_source_expressionscCrrrr}rrrrPrzSubquery.set_source_expressionscC|jjSrl)rrr5rrrrSrqzSubquery._resolve_output_fieldcst}|j|_|Srl)rrrrrrrrrrrrVrvz Subquery.copycCrrl)rexternal_aliasesr5rrrr[szSubquery.external_aliasescCs |jSrl)rget_external_colsr5rrrr_rzSubquery.get_external_colsc Ksf|j|i|j|}|p|j}|||\}}|dd|d<|p*|d|j}||} | |fS)Nr:r2subqueryrQ)rr$r@rrrrQ) rrrrQrrr subquery_sqlrrrrrrbs  zSubquery.as_sqlcCs|rt||gS|jSrl)ryrrr6rrrrms  zSubquery.get_group_by_colsrlr)rrrr rQrror{rrrrrrrrrrrrrrr?s    rcsHeZdZdZeZd fdd ZddZd fdd Z d d Z Z S)ExistszEXISTS(%(subquery)s)Fc s||_tj|fi|dSrl)negatedrro)rrrrrrrro{szExists.__init__cCs|}|j |_|Srl)rrrrrrr __invert__s zExists.__invert__Nc sH|jj|jd}tj||f||d|\}}|jr d|}||fS)N)using)rQrzNOT {})rexistsrrrrr )rrrrQrrrrrrrrs  z Exists.as_sqlcCs|jjjs d|}||fS)NzCASE WHEN {} THEN 1 ELSE 0 END)rr"&supports_boolean_expr_in_select_clauser rrrrrs  zExists.select_format)Frl) rrrrQr rrrorrrrrrrrrws rc@sjeZdZdZdZdddZddZddZd d Zdd d Z ddZ dddZ ddZ ddZ ddZd S)rz%(expression)s %(ordering)sFcCs>|r|rtd||_||_||_t|dstd||_dS)Nz1nulls_first and nulls_last are mutually exclusiver*z%expression must be an expression type)r0 nulls_first nulls_lastrr+r)rrrrrrrrros  zOrderBy.__init__cCre)Nz{}({}, descending={}))r rrrrr5rrrr szOrderBy.__repr__cCrrrr}rrrrrzOrderBy.set_source_expressionscCr{rlrr5rrrr{rqzOrderBy.get_source_expressionsNcKs|p|j}|jjr|jrd|}n%|jrd|}n|jr(|jr#|jjs(d|}n|jr6|js2|jjs6d|}|j|| |j \}}||jrJdndd|}|pT|j}|| d9}|| |fS) Nz %s NULLS LASTz%s NULLS FIRSTz%%(expression)s IS NULL, %sz%%(expression)s IS NOT NULL, %sDESCASC)rorderingz%(expression)s) rQr" supports_order_by_nulls_modifierrrrorder_by_nulls_firstrr$rrcountrstrip)rrrrQrexpression_sqlr placeholdersrrrrs:      zOrderBy.as_sqlcCsDt|jtr|}tt|jdddd|_|||S|||S)NT)rF)r)rrrrrrrr)rrrrrrrr as_oracles    zOrderBy.as_oraclecCrrlrrrrrrs zOrderBy.get_group_by_colscCs.|j |_|js |jr|j |_|j |_|Srl)rrrr5rrrrs    zOrderBy.reverse_orderingcC d|_dSr9rr5rrrrrz OrderBy.asccCrr^rr5rrrrrz OrderBy.desc)FFFrl)rrrrQrLror rr{rrrrrrrrrrrs     rcsveZdZdZdZdZdZdfdd ZddZd d Z d d Z dd dZ fddZ ddZ ddZdddZZS)Windowz %(expression)s OVER (%(window)s)FTNcs||_||_||_t|ddstd|jj|jdur/t|jtt fs)|jf|_t |j|_|jdurMt|jt tfrCt |j|_n t|jt sMtdt j |d||d|_dS)NrFz3Expression '%s' isn't compatible with OVER clauses.zCorder_by must be either an Expression or a sequence of expressions.rmr) partition_byorder_byframerOr0rrrrrr~rkrrorsource_expression)rrrrrrrrrros,      zWindow.__init__cCrrl)rrr5rrrrrqzWindow._resolve_output_fieldcCs|j|j|j|jgSrlrrrrr5rrrr{rzWindow.get_source_expressionscCs|\|_|_|_|_dSrlrr}rrrrr.zWindow.set_source_expressionscCs|j||jjstd||j\}}gg}}|jdur5|jj||dd\}} | || | |j durQ| d||j \} } | | | | |j rh||j \} } | d| | | | ||pq|j }||d|d|fS)Nz1This backend does not support window expressions.zPARTITION BY %(expressions)s)rrrQz ORDER BY r)rwindow)rr$r"supports_over_clauserrrrrrrrrrQrIstrip)rrrrQexpr_sqlr window_sql window_paramssql_exprr order_sql order_params frame_sql frame_paramsrrrrs:             z Window.as_sqlcsTt|jtjr$|}|}t|d_||tt | ||S| ||Sr) rrr rrrr{rrrrrr)rrrrrr?rrrr<s  zWindow.as_sqlitecCsHdt|j|jrdt|jnd|jrdt|jndt|jp!dS)Nz{} OVER ({}{}{})z PARTITION BY rz ORDER BY )r rrrrrr5rrrr Fs  zWindow.__str__cCrrrr5rrrr Nr7zWindow.__repr__cCrzrlrr6rrrrQr|zWindow.get_group_by_cols)NNNNrl)rrrrQrrrrorr{rrrr r rrrrrrrs  " rc@sXeZdZdZdZdddZddZdd Zd d Zd d Z dddZ ddZ ddZ dS) WindowFrameaV Model the frame clause in window expressions. There are two types of frame clauses which are subclasses, however, all processing and validation (by no means intended to be complete) is done here. Thus, providing an end for a frame is optional (the default is UNBOUNDED FOLLOWING, which is the last row in the frame). z,%(frame_type)s BETWEEN %(start)s AND %(end)sNcCst||_t||_dSrl)r,startendrrrrrrro_s zWindowFrame.__init__cCrrlrrr}rrrrcr7z"WindowFrame.set_source_expressionscCr rlrr5rrrr{frz"WindowFrame.get_source_expressionscCs>|j||||jj|jj\}}|j|j||dgfS)N frame_typerr)rr$window_frame_start_endrrrrQr)rrrrrrrrris zWindowFrame.as_sqlcCrrrr5rrrr rr7zWindowFrame.__repr__cCrzrlrr6rrrrur|zWindowFrame.get_group_by_colscCs|jjdur|jjdkrdt|jjtjjf}n|jjdur*|jjdkr*tjj}ntjj}|jjdurE|jjdkrEd|jjtjj f}n|jjdurV|jjdkrVtjj}ntjj }|j |j ||dS)Nrz%d %sr) rrabsrr PRECEDING CURRENT_ROWUNBOUNDED_PRECEDINGr FOLLOWINGUNBOUNDED_FOLLOWINGrQrrrrrr xs  zWindowFrame.__str__cCre)Nz3Subclasses must implement window_frame_start_end().rgrrrrrrrrrqz"WindowFrame.window_frame_start_endrrl) rrrr rQrorr{rr rr rrrrrrUs   rc@r)RowRangeROWScC|j||Srl)rwindow_frame_rows_start_endrrrrrrzRowRange.window_frame_start_endNrrrrrrrrrr rc@r) ValueRangeRANGEcCrrl)rwindow_frame_range_start_endrrrrrrz!ValueRange.window_frame_start_endNrrrrrrrr)sb        us K  JH%! CQ8#Sh;