o xg[@sddlZddlZddlZddlmZddlmZddlmZmZm Z m Z m Z ddl m Z mZmZmZmZddlmZddlmZddlmZdd lmZdd lmZGd d d ZGd ddee ZGdddeZGdddZGdddeZ GdddeeZ!ej"GdddeeZ#ej"GdddeZ$ej"GdddeeZ%ej"GdddeeZ&ej"Gdd d eeZ'ej"Gd!d"d"eeZ(Gd#d$d$Z)ej"Gd%d&d&e)e&Z*ej"Gd'd(d(e)e'Z+ej"Gd)d*d*e eZ,Gd+d,d,eZ-ej"Gd-d.d.e-Z.ej"Gd/d0d0e.Z/ej"Gd1d2d2e-Z0ej"Gd3d4d4e0Z1ej"Gd5d6d6e-Z2ej"Gd7d8d8e2Z3ej"Gd9d:d:e eZ4ej"Gd;d<dd>eZ6ej"Gd?d@d@e6Z7GdAdBdBeZ8GdCdDdDe8e#Z9GdEdFdFe8e%Z:GdGdHdHe8e&Z;GdIdJdJe8e'Zej"GdOdPdPe>e$Z?ej"GdQdRdRe>e.Z@ej"GdSdTdTe>e/ZAej"GdUdVdVe>e0ZBej"GdWdXdXe>e1ZCej"GdYdZdZe>e2ZDej"Gd[d\d\e>e3ZEdS)]N)copy)EmptyResultSet)CaseExistsFuncValueWhen) CharField DateTimeFieldField IntegerField UUIDField)RegisterLookupMixin) OrderedSet)RemovedInDjango40Warning)cached_property) make_hashablec@seZdZdZdZdZddZddZd,dd Zd d Z d d Z ddZ ddZ d,ddZ ddZddZddZd,ddZddZddZed d!Zed"d#Zed$d%Zed&d'Zd(d)Zd*d+ZdS)-LookupNTFcCs`|||_|_||_t|jdr|j}ng}|r+ddlm}t||r+td||_ dS)Nget_bilateral_transformsrQueryzBBilateral transformations on nested querysets are not implemented.) lhsrhsget_prep_lookuphasattrrdjango.db.models.sql.queryr isinstanceNotImplementedErrorbilateral_transforms)selfrrrrr :/usr/lib/python3/dist-packages/django/db/models/lookups.py__init__s      zLookup.__init__cCs|jD]}||}q|SN)r)rvalue transformr r r!apply_bilateral_transforms(s  z!Lookup.apply_bilateral_transformsc Cs|dur|j}|jrs zLookup.get_source_expressionscCs*t|dkr |d|_dS|\|_|_dS)Nr)r0rr)r new_exprsr r r!set_source_expressionsCs zLookup.set_source_expressionscCs<t|jdr |jS|jrt|jjdr|jj|jS|jSNr*get_prep_value)rr prepare_rhsrr(rBr<r r r!rIs zLookup.get_prep_lookupcCs d|gfS)Nr)r )rr$r2r r r!r/Ps zLookup.get_db_prep_lookupcCs*|p|j}t|dr||j}||S)Nr*)rrr*r+r,)rr1r2rr r r! process_lhsSs    zLookup.process_lhscCsZ|j}|jr|rt||jjd}||}||j}t |dr'| |S| ||S)Nr'as_sql) rrr;rrr(r&r*r+rr,r/)rr1r2r$r r r! process_rhsYs     zLookup.process_rhscCst|jd SNrE)rrr<r r r!r;gzLookup.rhs_is_direct_valuecCs4t|}|j||_t|jdr|j||_|S)Nrelabeled_clone)rrrIrr)rrelabelsnewr r r!rIjs  zLookup.relabeled_clonecCs*|j}t|jdr||j|S)Nget_group_by_cols)rrLrrr.)raliascolsr r r!rLqs  zLookup.get_group_by_colscCstr#rrr1r2r r r!rEwz Lookup.as_sqlcCsfd}g}|j|jfD]}t|trtt|dddd}d}||q |r+t||n|}|||S)NFT)then)default) rrrrrrr-typerE)rr1r2wrappedexprsexprlookupr r r! as_oraclezs   zLookup.as_oraclecC|jjp t|jddS)Ncontains_aggregateF)rr[getattrrr<r r r!r[zLookup.contains_aggregatecCrZ)Ncontains_over_clauseF)rr^r\rr<r r r!r^r]zLookup.contains_over_clausecCrZ)N is_summaryF)rr_r\rr<r r r!r_r]zLookup.is_summarycCs|j|j|jfSr#) __class__rrr<r r r!identityszLookup.identitycCst|tstS|j|jkSr#)rrNotImplementedra)rotherr r r!__eq__s  z Lookup.__eq__cCstt|jSr#)hashrrar<r r r!__hash__rHzLookup.__hash__r#)__name__ __module__ __qualname__ lookup_namerCcan_use_none_as_rhsr"r&r:r=r@rr/rDrFr;rIrLrErYrr[r^propertyr_rardrfr r r r!rs8        rc@s,eZdZdZdZdZeddZddZdS) Transformz RegisterLookupMixin() is first so that get_lookup() and get_transform() first examine self and then check output_field. Fr>cCs |dSNr)r=r<r r r!rs z Transform.lhscCs2t|jdr |j}ng}|jr||j|S)Nr)rrr bilateralr-r`)rrr r r!rs   z"Transform.get_bilateral_transformsN) rgrhri__doc__roarityrlrrr r r r!rms  rmcs.eZdZdfdd ZddZddZZS) BuiltinLookupNcsbt|||\}}|jj}|jjj|d}|j|||}|j|j ||}|t |fS)N)r2) superrDrr(get_internal_typedb_typeopsfield_cast_sql lookup_castrjlist)rr1r2rlhs_sqlr9field_internal_typerur`r r!rDs  zBuiltinLookup.process_lhscCsF|||\}}|||\}}|||||}d||f|fSNz%s %s)rDrFr. get_rhs_op)rr1r2rzr9rhs_sql rhs_paramsr r r!rEs   zBuiltinLookup.as_sqlcC|j|j|Sr# operatorsrjrr2rr r r!r~zBuiltinLookup.get_rhs_opr#)rgrhrirDrEr~ __classcell__r r r|r!rrs rrc@eZdZdZdZddZdS)FieldGetDbPrepValueMixinzZ Some lookups require Field.get_db_prep_value() to be called on their inputs. FcsVt|jjdd}t|ddp|jjjd|jr"fdd|DfS|ddgfS)N target_fieldget_db_prep_valuer)csg|] }|ddqS)Tpreparedr ).0vr2rr r! sz?FieldGetDbPrepValueMixin.get_db_prep_lookup..Tr)r\rr(r$get_db_prep_lookup_value_is_iterable)rr$r2fieldr rr!r/sz+FieldGetDbPrepValueMixin.get_db_prep_lookupN)rgrhrirprr/r r r r!rs rcsBeZdZdZdZddZfddZddZd fd d ZZ S) FieldGetDbPrepValueIterableMixinzg Some lookups require Field.get_db_prep_value() to be called on each value in an iterable. TcCs^t|jdr |jSg}|jD]}t|drn|jr't|jjdr'|jj|}||q|SrA)rrrCrr(rBr-)rprepared_values rhs_valuer r r!rs    z0FieldGetDbPrepValueIterableMixin.get_prep_lookupcs"|r |||St||Sr#)r;r:rsrFrPr|r r!rFs z,FieldGetDbPrepValueIterableMixin.process_rhscCs<|g}t|dr||j}t|dr||\}}||fS)Nr*rE)rr*r+r,)rr1r2r6paramr9r r r!resolve_expression_parameters    z=FieldGetDbPrepValueIterableMixin.resolve_expression_parameterNcsJt|}tfddt|D\}}tj|}|t|fS)Nc3s$|] \}}||VqdSr#)r)rr6rr1r2rr r! s  zEFieldGetDbPrepValueIterableMixin.batch_process_rhs..)rsr:zip itertoolschain from_iterabletuple)rr1r2r pre_processedr6r9r|rr!r:s   z2FieldGetDbPrepValueIterableMixin.batch_process_rhsr#) rgrhrirprrrFrr:rr r r|r!rs rc@seZdZdZdZddZdS)PostgresOperatorLookupz*Lookup defined by operators on PostgreSQL.NcCsD|||\}}|||\}}t|t|}d||j|f|fS)Nz%s %s %s)rDrFrpostgres_operator)rr1r2r lhs_paramsrrr9r r r! as_postgresqlsz$PostgresOperatorLookup.as_postgresql)rgrhrirprrr r r r!rs rcs,eZdZdZfddZfddZZS)ExactexactcsVddlm}t|j|r&|jr"|jjs!|j|jdgntdt S)NrrpkzSThe QuerySet value for an exact lookup must be limited to one result using slicing.) rrrr has_limit_onehas_select_fieldsclear_select_clause add_fields ValueErrorrsrrrr|r r!r!s     zExact.get_prep_lookupcs`t|jtr)t|jddr)|j|jr)|||\}}|jr!dnd}|||fSt ||S)N conditionalFr)zNOT %s) rrboolr\rrv0conditional_expression_supported_in_where_clauserDrsrE)rr1r2rzr9templater|r r!rE/s    z Exact.as_sql)rgrhrirjrrErr r r|r!rs rc$eZdZdZdZfddZZS)IExactiexactFcs2t||\}}|r|j|d|d<||fSrn)rsrFrvprep_for_iexact_queryrqnr2rr9r|r r!rFCszIExact.process_rhs)rgrhrirjrCrFrr r r|r!r>rc@eZdZdZdS) GreaterThangtNrgrhrirjr r r r!rJrc@r)GreaterThanOrEqualgteNrr r r r!rOrrc@r)LessThanltNrr r r r!rTrrc@r)LessThanOrEquallteNrr r r r!rYrrc eZdZdZfddZZS)IntegerFieldFloatRoundingz Allow floats to work as query values for IntegerField. Without this, the decimal portion of the float would always be discarded. cs$t|jtr t|j|_tSr#)rrfloatmathceilrsrr<r|r r!rcs  z)IntegerFieldFloatRounding.get_prep_lookup)rgrhrirprrr r r|r!r^rc@ eZdZdS)IntegerGreaterThanOrEqualNrgrhrir r r r!rirc@r)IntegerLessThanNrr r r r!rnrrcsHeZdZdZfddZfddZddZfdd Zd d ZZ S) InincsPddlm}t|j|r#|jjdd|jjs#|j|jdgt S)NrrT) clear_defaultr) rrrrclear_orderingrrrrsrrr|r r!rws    zIn.get_prep_lookupcst|jdd}|dur||jkrtd|rPz t|j}|dWnty5dd|jD}Ynw|s:t| |||\}}dd |d}||fSt ||S)N_dbzvSubqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.cSsg|]}|dur|qSr#r )rrr r r!rsz"In.process_rhs..(, )) r\rrMrr;rdiscard TypeErrorrr:joinrsrF)rr1r2db_rhsrr3r4 placeholderr|r r!rFs$  zIn.process_rhscCsd|S)NzIN %sr rr r r!r~z In.get_rhs_opcs>|j}|r|rt|j|kr|||St||Sr#)rvmax_in_list_sizer;r0rsplit_parameter_list_as_sqlrsrE)rr1r2rr|r r!rEs  z In.as_sqlcCs|j}|||\}}|||\}}dg}g} tdt||D];} | dkr-|d|d|| ||| | |} || | |} d| } || |d| | q"|dd|| fS)Nrrz OR z%s IN (rr) rvrrDr:ranger0r-r.r)rr1r2rrrrrin_clause_elementsr9offsetr3r4 param_groupr r r!rs$        zIn.split_parameter_list_as_sql) rgrhrirjrrFr~rErrr r r|r!rss   rcs0eZdZdZdZfddZfddZZS) PatternLookupz%%%s%%Fcs>t|jds |jr|j|j|j}||St||SrG) rrr pattern_opsrjformat pattern_escrsr~)rr2rpatternr|r r!r~s  zPatternLookup.get_rhs_opcsFt||\}}|r|r|js|j|j|d|d<||fSrn)rsrFr;r param_patternrvprep_for_like_queryrr|r r!rFszPatternLookup.process_rhs)rgrhrirrCr~rFrr r r|r!rs  rc@r)ContainscontainsNrr r r r!rrrc@r) IContains icontainsNrr r r r!rrrc@eZdZdZdZdS) StartsWith startswithz%s%%Nrgrhrirjrr r r r!rrc@r) IStartsWith istartswithNrr r r r!rrrc@r)EndsWithendswithz%%%sNrr r r r!rrrc@r) IEndsWith iendswithNrr r r r!rrrc@seZdZdZddZdS)RangercCsd|d|dfS)NBETWEEN %s AND %srr>r rr r r!r~szRange.get_rhs_opN)rgrhrirjr~r r r r!rs rc@r)IsNullisnullFcCsFt|jts tdt||j\}}|jrd||fSd||fS)NzXUsing a non-boolean value for an isnull lookup is deprecated, use True or False instead.z %s IS NULLz%s IS NOT NULL)rrrwarningswarnrr,r)rr1r2r6r9r r r!rEs   z IsNull.as_sqlN)rgrhrirjrCrEr r r r!rs rcr)RegexregexFcs\|j|jvr t||S|||\}}|||\}}|j|j}|||f||fSr#)rjrrsrErDrFrv regex_lookup)rr1r2rrrr sql_templater|r r!rEs z Regex.as_sql)rgrhrirjrCrErr r r|r!rrrc@r)IRegexiregexNrr r r r!r$rrcs4eZdZddZfddZddZddZZS) YearLookupcCs4|jjj}t|tr|j|}|S|j|}|Sr#)rr(rr rv%year_lookup_bounds_for_datetime_field!year_lookup_bounds_for_date_field)rr2yearr(boundsr r r!year_lookup_bounds*s    zYearLookup.year_lookup_boundsc s||r7||||jj\}}|||\}}|||}|||j\}}||||d||f|fSt ||Sr}) r;rDrrFget_direct_rhs_sqlr rr.get_bound_paramsrsrE) rr1r2rzr9rr8startfinishr|r r!rE2s zYearLookup.as_sqlcCrr#rrr r r!r @rzYearLookup.get_direct_rhs_sqlcCstd)NzAsubclasses of YearLookup must provide a get_bound_params() methodrOrrrr r r!r CszYearLookup.get_bound_params)rgrhrir rEr r rr r r|r!r)s  rc@seZdZddZddZdS) YearExactcCsdS)Nrr rr r r!r JrQzYearExact.get_direct_rhs_sqlcCs||fSr#r rr r r!r MrzYearExact.get_bound_paramsN)rgrhrir r r r r r!rIs rc@eZdZddZdS)YearGtcC|fSr#r rr r r!r RzYearGt.get_bound_paramsNrgrhrir r r r r!rQ rc@r)YearGtecC|fSr#r rr r r!r WrzYearGte.get_bound_paramsNrr r r r!rVrrc@r)YearLtcCrr#r rr r r!r \rzYearLt.get_bound_paramsNrr r r r!r[rrc@r)YearLtecCrr#r rr r r!r arzYearLte.get_bound_paramsNrr r r r!r`rrcr) UUIDTextMixinzs Strip hyphens from a value when filtering a UUIDField on backends without a native datatype for UUID. cs`|jjs#ddlm}|rt|j|_||jtdtdtd|_t ||\}}||fS)Nr)Replace-rr') featureshas_native_uuid_fielddjango.db.models.functionsrr;rrr rsrF)rrr2rrr9r|r r!rFjs  zUUIDTextMixin.process_rhs)rgrhrirprFrr r r|r!rerrc@r) UUIDIExactNrr r r r!r"trr"c@r) UUIDContainsNrr r r r!r#yrr#c@r) UUIDIContainsNrr r r r!r$~rr$c@r)UUIDStartsWithNrr r r r!r%rr%c@r)UUIDIStartsWithNrr r r r!r&rr&c@r) UUIDEndsWithNrr r r r!r'rr'c@r) UUIDIEndsWithNrr r r r!r(rr()Frrrrdjango.core.exceptionsrdjango.db.models.expressionsrrrrrdjango.db.models.fieldsr r r r r django.db.models.query_utilsrdjango.utils.datastructuresrdjango.utils.deprecationrdjango.utils.functionalrdjango.utils.hashablerrrmrrrrrregister_lookuprrrrrrrrrrrrrrrrrrrrrrrrrrrrr"r#r$r%r&r'r(r r r r!s       3    F