U aJ@sddlmZddlmZddlmZddlmZddlmZddlmZddl m Z ddl m Z dd l m Z dd l m Z dd l mZd d lmZd dlmZd dlmZd dlmZd dlm Z d dlmZd dlmZd dlmZd dlm Zd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlm Z d dlm!Z!d dlm"Z"d dlm#Z#d dl$m%Z%d d l$m&Z&ej'Z(e )Z*e +d!Z,Gd"d#d#e-Z.e )d$d$d%Z/Gd&d'd'eZ0ejj1d(d)Gd*d+d+e0Z2ejj1d(d,Gd-d.d.e0e#Z3dGd1d2Z4d3d4Z5d5d6Z6d7d8Z7Gd9d:d:e-Z8Gd;d<dd>e8Z:Gd?d@d@e8Z;GdAdBdBe;Zd/S)H) attributes) interfaces)loading)_is_aliased_class)ORMColumnsClauseRole) PathRegistry)_entity_corresponds_to)_ORMJoin)aliased)Bundle) ORMAdapter)exc)future)inspect)sql)util) coercions) expression)roles)visitors)_entity_namespace_key)_select_iterables)CacheableOptions) CompileState)Options)LABEL_STYLE_DISAMBIGUATE_ONLY)LABEL_STYLE_NONE)LABEL_STYLE_TABLENAME_PLUS_COL) SelectState)ExtendedInternalTraversal)InternalTraversalLABEL_STYLE_LEGACY_ORMc@s*eZdZdZGdddeZdddZdS) QueryContext) compile_statequeryparams load_optionsbind_argumentsexecution_optionssession autoflushpopulate_existinginvoke_all_eagers version_check refresh_statecreate_eager_joinspropagated_loader_optionsrZrunidZpartialsZpost_load_pathsidentity_token yield_perloaders_require_bufferingloaders_require_uniquingc@s4eZdZdZdZdZdZdZdZdZ dZ dZ dZ dS)z!QueryContext.default_load_optionsFTN) __name__ __module__ __qualname__Z_only_return_tuples_populate_existing_version_check_invoke_all_eagers _autoflush_refresh_identity_token _yield_per_refresh_stateZ_lazy_loaded_fromZ_legacy_uniquingr@r@WC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\orm\context.pydefault_load_optionsJsrBNcCs||_|p t|_|pt|_||_||_||_d|_d|_||_ dd|j D|_ t |j |_ |j|_|j|_|j|_|j|_|j|_|j|_|j|_|jr|jrtdd|jdS)NFcSsh|]}|jr|qSr@)Zpropagate_to_loaders.0or@r@rA jsz(QueryContext.__init__..zThe yield_per Query option is currently not compatible with %s eager loading. Please specify lazyload('*') or query.enable_eagerloads(False) in order to proceed with query.yield_per().z, ) r' _EMPTY_DICTr)r(r$r%r*r4r5r& _with_optionsr1dictrr<r+r9r,r;r-r:r.r?r/r>r3r=r2_no_yield_perssa_excInvalidRequestErrorjoin)selfr$ statementr&r*r'r)r(r@r@rA__init__Vs4      zQueryContext.__init__)NN)r6r7r8 __slots__rrBrPr@r@r@rAr#0s r#T)Z _result_disable_adapt_to_contextZ future_resultc@seZdZeZGdddeZeZddZ e ddZ e ddZ e d d Z e d d Ze d dZeddZddZddZdS)ORMCompileStatec @seZdZdejfdejfdejfdejfdejfdejfdejfdejfd ejfd ejfd ejfd ejfg Z d Z d Z dZ dZ eZdZdZdZdZd Zd Zd ZdS)z'ORMCompileState.default_compile_options_use_legacy_query_style_for_statement_bake_ok_with_polymorphic_adapt_map _current_path_enable_single_crit_enable_eagerloads_orm_only_from_obj_alias_only_load_props_set_base_alias_for_refresh_state_render_for_subqueryFTr@N)r6r7r8r!Z dp_booleanr Zdp_has_cache_key_tuplesZdp_has_cache_keyZ dp_plain_objZ_cache_key_traversalrSrTrUrV_path_registryrWrXrYrZr[r\r]r^r@r@r@rAdefault_compile_optionss6r`cOs tdSNNotImplementedError)rNargkwr@r@rArPszORMCompileState.__init__cCs |rddd}|St|SdS)NcSs|r|St|dSdS)Nkey)getattr)colcol_namer@r@rAnamesz7ORMCompileState._column_naming_convention..name)N)r_column_naming_convention)cls label_stylelegacyrjr@r@rArks z)ORMCompileState._column_naming_conventioncKs tdS)aCreate a context for a statement given a :class:`.Compiler`. This method is always invoked in the context of SQLCompiler.process(). For a Select object, this would be invoked from SQLCompiler.visit_select(). For the special FromStatement object used by Query to indicate "Query.from_statement()", this is called by FromStatement._compiler_dispatch() that would be called by SQLCompiler.process(). Nrb)rlstatement_containercompilerrer@r@rAcreate_for_statements z$ORMCompileState.create_for_statementcCst|Sra)_column_descriptions)rlrOr@r@rAget_column_descriptionssz'ORMCompileState.get_column_descriptionsc Cs|r ||fStjddddh||j\}}|s4t}n |t}d|ksL|jrf|d|d|jd}||d<z|jd}Wn t k rd st d YnX|r|j |d <|j r| ||fS) N_sa_orm_load_optionsr,r+r3T)Zstream_resultsZmax_row_bufferclauseplugin_subjectFz0statement had 'orm' plugin but no plugin_subjectmapper) r#rBZfrom_execution_options_execution_options_orm_load_exec_optionsunionr>get_propagate_attrsKeyErrorAssertionErrorrwr<) rlr*rOr&r)r(Zis_reentrant_invoker'rvr@r@rAorm_pre_session_execsB     z$ORMCompileState.orm_pre_session_execc Cs<|j}|jj}|dtj} t||||| ||} t|| S)Nrt)contextZcompiledr$r{r#rBrZ instances) rlr*rOr&r)r(resultZexecution_contextr$r'Z querycontextr@r@rAorm_setup_cursor_result&s  z'ORMCompileState.orm_setup_cursor_resultcCsdd|jDS)zreturn all _MapperEntity objects in the lead entities collection. Does **not** include entities that have been replaced by with_entities(), with_only_columns() cSsg|]}t|tr|qSr@ isinstance _MapperEntityrDentr@r@rA Os z9ORMCompileState._lead_mapper_entities..) _entitiesrNr@r@rA_lead_mapper_entitiesGsz%ORMCompileState._lead_mapper_entitiescCs>|js:|jj|jkr:|jD]}||t||jqdSra) is_aliased_classrwpersist_selectable_polymorphic_adaptersiterate_to_root"_mapper_loads_polymorphically_withsql_util ColumnAdapter_equivalent_columns)rNext_info selectablempr@r@rA _create_with_polymorphic_adapterSs z0ORMCompileState._create_with_polymorphic_adaptercCs:|jp |gD](}||j|<|D]}||j|j<q"q dSra)_with_polymorphic_mappersrrZ local_table)rNrwadapterm2mr@r@rAr_s  z2ORMCompileState._mapper_loads_polymorphically_withN)r6r7r8rGrVrr`r_ current_pathrP classmethodrkrqrsrrpropertyrrrr@r@r@rArRs$*    G   rRZormZorm_from_statementc@sLeZdZeZdZdZdZdZ dZ e Z e Z eddZddZddZdS) ORMFromStatementCompileStateNFc Ks|dk r|j }nd}||}d|_|jj|_||_|_|j|_ }|j rV|j |_ g|_ i|_t|_|j|_|jrt|tjr|js|j s|jtkr|t|_n||_||js|j s|jnt|j|_t||j|j |jj |_!|r0|j"r0dti|_#|j$|_%|j"D]}|j&r|'|qni|_#|j$|_%|j(r`|j(D]\}} ||qLg|_)g|_*g|_+g|_,d|_-t|jtj.tj/fri|_0|j D]} | 1|qtj2|j|j)dd|_nt3j4j5|jdd|_6|S)NT_unbound_load_dedupesF) positional)Zadapt_on_names)7stack__new___primary_entity_compile_optionsrSuse_legacy_query_styleroselect_statementelementZrequested_statementZis_dmltableZ dml_tablerrsetrJcompile_optionsrr SelectBaseZ _is_textual _label_stylerZset_label_stylerrOrk_label_convention _QueryEntityto_compile_state _raw_columnsrWrrHr_global_attributesglobal_attributes_is_compile_stateprocess_compile_state_with_context_optionsprimary_columnssecondary_columnsr0_fallback_from_clausesorder_byZ TextClauseZ UpdateBaseextra_criteria_entitiessetup_compile_stateZ TextualSelectrrr_from_obj_alias) rlrorpretoplevelrNrOoptfnrfentityr@r@rArqss             z1ORMFromStatementCompileState.create_for_statementcCs|Srar@rNcolscurrent_adapterr@r@rA_adapt_col_listsz,ORMFromStatementCompileState._adapt_col_listcCsdSrar@rr@r@rA_get_current_adaptersz1ORMFromStatementCompileState._get_current_adapter)r6r7r8r immutabledict_aliased_generationsr_has_mapper_entities_has_orm_entitiesmulti_row_eager_loaderscompound_eager_adapterrGr eager_joinsrrqrrr@r@r@rArfs lrselectc@steZdZeZZeZdZdZdZ dZ dZ dZ dZ dZdZeddZddZedd Zed d Zed d ZeedddZddZddZddZddZddZddZdIddZdd Z d!d"Z!d#d$Z"d%d&Z#d'd(Z$d)d*Z%d+d,Z&d-d.Z'd/d0Z(d1d2Z)d3d4Z*d5d6Z+d7d8Z,d9d:Z-d;d<Z.d=d>Z/d?d@Z0e1dAdBZ2e1dCdDZ3dEdFZ4dGdHZ5dS)JORMSelectCompileStateNFr@c  sj|||dk r$|j }|j_n d}i_|}|j|j|_|jr`|_ t j _n|_ |jj _ |jj_g_d_i_i_t_|jjrt|jj_|j_|s؈jddd7_jrj jtkrj st_nt_n j j_|jj_ |j!r>fdd|j!D_"t#$|j%j|jj&_'d_(|r|j)sv|j!rdti_*|j!D]8}|j)D]*}|j+r|,d d j"|Dqqj j)D]}|j+r|-qni_*|j.r|j.D]\}} |qg_/g_0i_1i_2g_3g_45d d |j6D_78t9j:j;|f|S) z@compiler hook, we arrive here from compiler.visit_select() only.NTF)rYr^csi|]}|t|jgqSr@)rrr)rDmemoized_entitiesrr@rA Jsz>ORMSelectCompileState.create_for_statement..r@rcSsg|]}t|tr|qSr@rrr@r@rArjs z>ORMSelectCompileState.create_for_statement..css|] }|jVqdSra)r)rDinfor@r@rA sz=ORMSelectCompileState.create_for_statement..).NFc3s |]}r|dn|VqdSrr@rrr@rArscss$|]}|dk rt|ndVqdSrarZsurface_selectablesrDsr@r@rArscss$|]}|dk rt|ndVqdSrarrr@r@rArsraTrzyNo column-based properties specified for refresh operation. Use session.expire() to reload collections and related items.z4Query contains no columns with which to SELECT from.FZ deepentity)8rrO_join_entitiesrr\_set_select_from_aliasr _setup_joins_joinr_legacy_setup_joins _legacy_joinrr_where_criteriatuple_order_by_clausesrr_having_criteria_group_by_clausesrZflatten_iteratorgroup_byrrZ_target_adaptercopy_and_processZ _distinct_on distinct_onZ _distinctdistinctZ _correlate correlateZ_correlate_exceptcorrelate_exceptZ_auto_correlate dedupe_cols_for_update_argrr0rX_adjust_for_extra_criteriarr[rKrLlistrr_should_nest_selectable_compound_eager_statement_simple_statementr _mapper_zeroZ _annotate)rNr%rrrZrecZstrategyezeror@rrArs                   z)ORMSelectCompileState._setup_for_generatecCsp||}g|_d|_i|_i|_|j|j}|jrJt |j|_| | |j ||_ t||j|j|S)aCreates a partial ORMSelectCompileState that includes the full collection of _MapperEntity and other _QueryEntity objects. Supports a few remaining use cases that are pre-compilation but still need to gather some of the column / adaption information. N)rrrrrr`rrrVrIrrkrrrrr)rlr%rnrNrr@r@rA_create_entities_collection(s& z1ORMSelectCompileState._create_entities_collectioncCs8|j}|sdS|d\}}}}t|tjr0|jS|SdS)N)rrrPropComparatorr)rlrO setup_joinstargetonclausefrom_flagsr@r@rAdetermine_last_joined_entityKs z2ORMSelectCompileState.determine_last_joined_entityccs||jD]p}|jr`d|jkr`|jd}|jsH|jsHt|gD] }|Vq:qvt|jD] }|VqRqt|gD] }|VqjqdS)NZentity_namespace)r is_selectable _annotations is_mapperrrZ_all_column_expressions)rlrOrZenselemr@r@rAall_selected_columnsYs     z*ORMSelectCompileState.all_selected_columnszsqlalchemy.orm.querycCsHtjj}tjtj||d}||j|}|j j |j |j |j |jd|S)N)Zapply_propagate_attrs)rHrrxr|)rZ preloadedZ orm_queryrexpectrZReturnsRowsRoleZ FromStatementr__dict__updaterHrrxr|)rlrOfrom_statementr%Zstmtr@r@rArksz$ORMSelectCompileState.from_statementcCs&|jD]\}}|||jq dSra)rVitemsr_adapter)rNrwpr@r@rArsz.ORMSelectCompileState._setup_with_polymorphicscCsT|j}|jjstt|jdks$t||jd}|rP|jddi7_||_dS)NrrrXF)rrr\r~lenr_get_select_from_alias_from_objr)rNr%rr@r@rArs z,ORMSelectCompileState._set_select_from_aliascCsh|}d|jkr|jd}t|dr<|js4tdqd|jSn(t|jtjj r`| }t ||SdSdS)N parententityrwzPA selectable (FromClause) instance is expected when the base alias is being set.) r hasattrrrK ArgumentErrorrrrrAliasedReturnsRows _all_equivsrr)rNfrom_objrequivsr@r@rArs    z5ORMSelectCompileState._get_select_from_alias_from_objcCs |jdjS)z8return the Mapper associated with the first QueryEntity.r)rrwrr@r@rArsz"ORMSelectCompileState._mapper_zerocCsD|jD]}d|jkr|jdSq|jD]}|jr*|jSq*dS)zReturn the 'entity' (mapper or AliasedClass) associated with the first QueryEntity, or alternatively the 'select from' entity if specified.rN)rr r entity_zero)rNrZqentr@r@rA _entity_zeros    z"ORMSelectCompileState._entity_zerocCs$|j|jgkrtd||jjS)Nz4%s() can only be used against a single mapped class.)rrrKrLr)rNZmethnamer@r@rA_only_full_mapper_zerosz,ORMSelectCompileState._only_full_mapper_zerocCs$t|jdkrt|pd|S)Nrz8This operation requires a Query against a single mapper.)rrrKrLr)rNZ rationaler@r@rA_only_entity_zeros z'ORMSelectCompileState._only_entity_zerocCs^i}|jD]&}dd|DD]}||jjq qdd|jDD]}||jjqF|S)NcSsg|]}t|tr|qSr@rrr@r@rArs z5ORMSelectCompileState._all_equivs..cSsg|]}t|tr|qSr@rrr@r@rArs )rvaluesrrwrr)rNrrrr@r@rArs  z!ORMSelectCompileState._all_equivscCsL|jr&dd|jD}t|j|}ng}d}|j|jrHt|j|n|j||j|j |j |j |jf|j |j j|j j|j|jd|j}|}|}t|||_tj|g|j}|j |_|j dk r|j jdkr|j |_ |}|jD]}t|||j}q|j !|||r4|jj!|f|j"||jj!|f|j#|S)NcSs$g|]}t|tjjr|jn|qSr@)rrelementsZ_label_referencer)rDr r@r@rArs zCORMSelectCompileState._compound_eager_statement.. for_updatehintsstatement_hintsrr)$rr expand_column_list_from_order_byr_select_statementrr unique_listrrrrmrr_hints_statement_hintsrr _select_argsaliasrrrrrrrZofrr"Z splice_joinsZstop_on select_fromnon_generativerr)rNZunwrapped_order_byZorder_by_col_exprinnerrrOZ from_clauseZ eager_joinr@r@rArst   z/ORMSelectCompileState._compound_eager_statementcCs|jjrF|jrF|jsF|jrFt|j|j}|r8t d|j|7_|j |j rbt |j|j n |j|j t|jt|j|j|j|j|jf|j|jj|jj|j|jd|j}|jr|jj|f|j|S)NzORDER BY columns added implicitly due to DISTINCT is deprecated and will be removed in SQLAlchemy 2.0. SELECT statements with DISTINCT should be written to explicitly include the appropriate columns in the columns clauser$)rrSrrrrr(rrwarn_deprecated_20r)rr*rrrrr"rrrmrrr+r,rrr-rr0)rNZto_addrOr@r@rAr2sL  z'ORMSelectCompileState._simple_statementcCstj}||}||_||_||_|r,||_|r6||_|rL|jt |7_|rd|j j |f|n|rt|j ||r|j t |7_ | |_ | |_|r||_|r||_||_|r||_| r| |_| r|jj |f| | r|jj |f| |Sra)rSelectrrrrrrrrrr0r _limit_clause_offset_clause _prefixes _suffixesrr+r,rr)rNZ raw_columnsrZwhere_criteriaZhaving_criteriarmrr%r&r'rr limit_clause offset_clauserrprefixessuffixesrr3rOr@r@rAr)[sJ  z'ORMSelectCompileState._select_statementcCsxd|jkr0|jd}|j|d}|r0||St|tjrB|}nt|drT|j}ndS|j|d}|rt||SdS)Nrr) r rr{Z adapt_clauserrZ FromClauserr)rNrsearchr.r@r@rA_adapt_polymorphic_elements     z0ORMSelectCompileState._adapt_polymorphic_elementcCsBd|jkr>|j|jddD]}||}|dk r|SqdS)Naliased_generationr@)r rr{replace)rNrrZ replaced_elemr@r@rA_adapt_aliased_generations   z/ORMSelectCompileState._adapt_aliased_generationcsrfdd|DS|SdS)Ncsg|]}|dqS)Tr@rCrr@rArsz9ORMSelectCompileState._adapt_col_list..r@rr@rrArsz%ORMSelectCompileState._adapt_col_listcslg|jr(|jjrdnd|jjf|jr>d|jf|jrTd|jfs\dSfdd}|S)NFTcsfdd}t|i|S)NcsFd|jkpd|jk}D](\}}|s(|r||}|dk r|SqdS)N _orm_adaptr)r )r Z is_orm_adaptZ always_adaptreadaptersr@rAr?s  zRORMSelectCompileState._get_current_adapter.._adapt_clause..replace)rZreplacement_traverse)ruZ as_filterr?rCr@rA _adapt_clauses zAORMSelectCompileState._get_current_adapter.._adapt_clause) rappendrrZr?rr@rr=)rNrEr@rCrArs"  z*ORMSelectCompileState._get_current_adapterc Cs|D]\}}}}|d}|d}|t|}|dk rBt|}|dkr`t|tjr`|}d}nd|jkrt|jd}|dkr|jst|dst dd} t|tjrt |dd} |dkr| r| }nN|j }z |j }Wn<t k r} ztjt d|| dW5d} ~ XYnX|j} |j| d} t| trV| j| rV| j} t | |j}|j } t|tjsn| }|dk r|| k r|jdd| k rtd |jd||fn|dk rd} |} nd} } ||| ||| d d || qdS) Nisouterfullrrw9Expected mapped entity or selectable/table as join target_of_type0Join target %s does not refer to a mapped entityZreplace_contextzMexplicit from clause %s does not match left side of relationship attribute %sF)_reset_joinpointrrrrr r rrKrrgrrAttributeErrorrraise_ _parententityrr{r rwisa aliased_classrfrQueryableAttributerL_join_left_to_right)rNargsentities_collectionrightrrrrGrHof_typeerrleftr.propr@r@rArs           zORMSelectCompileState._joinc Cs|D]\}}}}|d}|d}|d} |d} |d} |dk rVt|tjsVt|}|dk rrt|tjsrt|}| s|n0|jdd} | s| } n| r|j| d|j| <t|tj tjfr|dkr|}d}nd|j kr|j d}|dkr|j st |d st d t|tj r,t|d d} nd} t|tjrRtt||}nD| rt|tj r|}t|}t|d d|jkrt||j}t|tj r|dkr| r| }nN|j}z |j}Wn<tk r}ztjt d ||d W5d}~XYnX|j}|j|d}t|trH|j|rH|j}t||j}|j}t|tjs`|}|s|||jf}||jkr|j|}||jf|d<| |qnd}}|!||||||| || qdS)zconsumes arguments from join() or outerjoin(), places them into a consistent format with which to form the actual JOIN constructs. rGr from_joinpointrHr>Nr@rrwrIrJrKrLprev)"rr string_typesrrM _joinpointr{rrrr r rrKrrgr_joinpoint_zerorPrfrrrNrOrr rwrQrRrrScopy_update_joinpointrT)rNrUrVrWrrZr outerjoincreate_aliasesr\rHr>Zprev_aliased_generationrXZjp0rrYr.r[Zedgejpr@r@rArls              z"ORMSelectCompileState._legacy_joincCs|jd|S)N_joinpoint_entity)r_r{rrr@r@rAr` sz%ORMSelectCompileState._joinpoint_zeroc  Cs"|dkr,|dkst|||||\}} } n|||\} } ||krZ|sZtd||f|||||||\} }}| js|| } nd} | dk r|j| }|jd| t ||||| | dg|j| dd|_nH| dk rt || t st|| j }n|}|jt || ||| | dg|_dS)zgiven raw "left", "right", "onclause" parameters consumed from a particular key within _join(), add a real ORMJoin object to our _from_obj list (or augment an existing one) Nz>Can't construct a join from %s to %s, they are the same entityr@)rGrHZ_extra_criteriar) r~"_join_determine_implicit_left_side_join_place_explicit_left_siderKrL _join_check_and_adapt_right_sider _get_extra_criteriarr rrr)rNrVrZrWrr[rdr>rcrHreplace_from_obj_indexuse_entity_indexr_infoZextra_criteriaZ left_clauser@r@rArTs         z)ORMSelectCompileState._join_left_to_rightcCsXt|}d}}|jrrt|j|j|}t|dkrH|d}|j|}n(t|dkr`tdntd|fn|rDi} t|D]R\} } | j } | dkrqt| } | |krqt | t r| | f| | j<qd| f| | j<qt | }t||j|}t|dkr| ||d\}}n*t|dkr2tdntd|fn td|||fS)zWhen join conditions don't express the left side explicitly, determine if an existing FROM or entity in this query can serve as the left hand side. NrraCan't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.zDon't know how to join to %r. Please use the .select_from() method to establish an explicit left side, as well as providing an explicit ON clause if not present already to help resolve the ambiguity.zgNo entities to join from; please use select_from() to establish the left entity/selectable of this join)rrrZfind_left_clause_to_join_fromrrrKrL enumerateentity_zero_or_selectablerrrkeys)rNrVrZrWrrmrkrlindexesZ potentialZ entity_indexrrZent_infoZ all_clausesr@r@rArgssj       z8ORMSelectCompileState._join_determine_implicit_left_sidec Csd}}t|}|jrHt|j|j}t|dkr|jsl| sl| jrlt| j#tj$rl|| t %| j| jt|tj&r|}|r||d}|s|r|'||||j(f|j)f|d n ||d|_)t|||fS)ztransform the "right" side of the join as well as the onclause according to polymorphic mapping translations, aliasing on the query or on the join, special cases where the right and left side have overlapping tables. FrwNTz*Can't join table/selectable '%s' to itselfrzIJoin target %s does not correspond to the right side of join condition %sz(Selectable '%s' is not derived from '%s'zpThe aliased=True parameter on query.join() only works with an ORM entity, not a plain selectable, as the target.)Zflat)Z equivalentsr@)rfr]r>)rfr>)*rrgwith_polymorphicrrrZJoinrrrZselectables_overlaprKrL common_parentrwrris_clause_elementZ _is_lateralrZis_derived_from descriptionrrrrZFromClauseRoler r~r rr_debugrr{Z_with_polymorphic_selectablerrZ ClauseElementrbrfr_)rNrZrWrr[rdr>rsrmoverlapZ right_mapperrZright_selectableZright_is_aliasedZ need_adapterrZaliased_entityrr@r@rAris                    z6ORMSelectCompileState._join_check_and_adapt_right_sidecCsJ||_d|kr@|d\}}t|}|||<||f|d<|}q||_dS)Nr])r_rIra _joinpath)rNrefr]r@r@rArbs   z'ORMSelectCompileState._update_joinpointcCs |j|_dSra)r{r_rr@r@rArMsz&ORMSelectCompileState._reset_joinpointcCs.|jj|jj|j|j|jj|jj|jp(ddS)N)r8r9rrr:r;r)rr4r5rrr6r7rrr@r@rAr-sz"ORMSelectCompileState._select_argscCsF|j}|ddk pD|ddk pD|ddpD|ddpD|ddS)Nr8r9rFrr@r)r-r{)rNkwargsr@r@rArs    z-ORMSelectCompileState._should_nest_selectablecs:djf|jkr2tfdd|jdjfDSdSdS)Nadditional_entity_criteriac3s(|] }|js|jkr|VqdSra)Zinclude_aliasesrZ_resolve_where_criteria)rDZaerr@rArs z.r@)rwrr)rNrr@rrArj s z)ORMSelectCompileState._get_extra_criteriac Cs|jD]V}|jdd}|r|jjdk s8d|jf|jkr||jkr||jrP|jndf|j|<qt |j }|D]\}}||j krqp|jj}| |}|dk r||f7}| }|D]@}|r||}|rt|ddi}||d}|j|f7_qqpdS)aApply extra criteria filtering. For all distinct single-table-inheritance mappers represented in the columns clause of this query, as well as the "select from entity", add criterion to the WHERE clause of the given QueryContext such that only the appropriate subtypes are selected from the total results. Additionally, add WHERE criteria originating from LoaderCriteriaOptions associated with the global context. rNr~rATF)rr r{rw_single_table_criterionrrrrrr"rrjrZtraverserZ_deep_annotater) rNZ fromclauserr<rZ single_critr~rrr@r@rArs>          z0ORMSelectCompileState._adjust_for_extra_criteria)N)6r6r7r8rGr{r_rrrrrrrrrrrrqrrrr rZpreload_modulerrrrrrr r!rrrr)r=r@rrrrr`rTrgrhrirbrMrr-rrjrr@r@r@rArsr  "     X)G 1t ejBE   rNFcCs4|dkrtj||d}|}dddd|jDDS)N)rnc SsJg|]B\}}|j|jt|dd|j|jdk r>|js>t|ddnddqS)rFNr)rjtyper exprr) _label_namerrgrrrw)rDrZinsp_entr@r@rArWs  z(_column_descriptions..cSs(g|] }||jdk rt|jndfqSra)rr)rDZ_entr@r@rAras   )rrr)Zquery_or_select_stmtr$rnctxr@r@rArrOs  rrcCsJ|}|jr|j}|dk r|S|jrBd|jdjkrB|jdjdSt|S)Nrr)r_last_joined_entityrr _entity_from_pre_ent_zero)query_or_augmented_selectrNrr@r@rA_legacy_filter_by_entity_zeroosrcCsX|}|jsdS|jd}d|jkr,|jdSt|tr<|jSd|jkrP|jdS|SdS)Nrrbundle)rr rrr)rrNrr@r@rAr|s      rc Cs|s|S|d\}}}}|d}|dkr@t|ttjfr@|}d}|dk r^d|jkr^|jdj}|dk r|}t|}|js|js|j r|S|}t|tjr|jSt|tr|rt |dd|} n|} | dkrdSt| } t | j|d} | dk r| j jSdS)a given the legacy_setup_joins collection at a point in time, figure out what the "filter by entity" would be in terms of those joins. in 2.0 this logic should hopefully be much simpler as there will be far fewer ways to specify joins with the ORM rr\Nrr) rstrrrr rrrwrr $_legacy_determine_last_joined_entityrgr) rrrWrZleft_rr\Z last_entityZinspr]attrr@r@rArsD       rc@s,eZdZdZdZdZdZdZeddZ dS)rz:represent an entity column returned within a Query result.r@FcCst|D]\}}|jr6|jr0|||j|qn|j}|jr|jrnd|jkrZt|||qt ||j ||q|j ddrt |||q|jrt ||j ||qt ||g||q|jrt |||q|S)NrrF)rnZ_is_lambda_elementZ _is_sequencerZ _resolvedrwr r r _ColumnEntity _for_columnsZ_select_iterabler{ _BundleEntityZ_is_clause_listZ is_bundle)rlr$entitiesrVrtrr@r@rArs\ z_QueryEntity.to_compile_stateN) r6r7r8__doc__rQ_non_hashable_value_null_column_typeuse_id_for_hashrrr@r@r@rArsrc@s`eZdZdZdZddZdZdZdZe ddZ e dd Z d d Z d d Z ddZddZdS)rz mapper/class/AliasedClass entity) rrwrrpath_extra_entitiesrrr_polymorphic_discriminatorc Cs|||jdkr||_d|_d|_|jd}|j|}|_|j}||_|j |_ }|jf|_ |j rr|j |_ n |jj|_ |j |_ |j|_||jkrt|j|}|j rtd||j|j\}}||_||_|j|_n>|j|_|j|_|j|_|js |js |jr|||jdS)NTrz6Can't use with_polymorphic() against an Aliased object)rFrrrr  _post_inspectrrrrwrrrjrclass_r6r_rrVrrcZ_with_polymorphic_argsZwith_polymorphic_mappersrrZpolymorphic_onrruinherits_requires_row_aliasingr) rNr$rrVrrwrZmappersrr@r@rArP sV          z_MapperEntity.__init__TcCs|jjSra)rwrrr@r@rAr^ sz_MapperEntity.typecCs|jSra)rrr@r@rArob sz'_MapperEntity.entity_zero_or_selectablecCs t|j|Sra)rrrNrr@r@rArrf sz_MapperEntity.corresponds_tocCsRd}|js"|jr*|j|jd}n|jj}|rH|jrB||j}qN|}n|j}|Sra)rrr{rwrrrwrap)rNr$rretr@r@rA_get_entity_clausesi sz!_MapperEntity._get_entity_clausesc Cs|j}||}|jr(|r(||j}n |s2|j}|j|krL|jj}|j}nd}}tj ||j |||j ||||j d }||j |jfS)N)only_load_propsr/polymorphic_discriminator)r$rrrrrr[r/rZ_instance_processorrwrrrr)rNrrr$rrr/Z _instancer@r@rA row_processor s,    z_MapperEntity.row_processorc Cs||}|jj}|dk s*d|jf|jkrJ|j}||jr>|jndf|j|<tj ||j||j ||j |j |j j|jd |j|jdS)Nr~)rurr)rrwrrrrrrrZ_setup_entity_queryrrrrr[rrrFr)rNr$rsingle_table_critrr@r@rAr s0   z!_MapperEntity.setup_compile_stateN)r6r7r8rrQrPsupports_single_entityrrrrrorrrrrr@r@r@rAr s >  rc@sZeZdZdZdZdddZeddZed d Zd d Z ed dZ ddZ ddZ dS)rr@)rrrrrrTNcCsd|_|jd}|r"|j|n ||t|tjtjfrH| }n|}||_ |_ t ||_ |j |_g|_|r|jD]R}d|jkrt||||dqzt|trt||||dqztj||g|d|dqz|j j|_|jr|jjstddS)NTr parent_bundlezKThe Bundle.single_entity flag has no effect when using 2.0 style execution.)rr rrFrrrSrrZ__clause_element__rrrrjrexprsrr _ORMColumnEntityrZ single_entityrrrSrr2)rNr$rrVZsetup_entitiesrrr@r@rArP s\          z_BundleEntity.__init__cCs|j}|dk r|jSdSdSra)rrw)rNrr@r@rArw sz_BundleEntity.mappercCs&|jD]}|j}|dk r|SqdSra)rrrNrrr@r@rAr s   z_BundleEntity.entity_zerocCsdSrr@rr@r@rArr sz_BundleEntity.corresponds_tocCs&|jD]}|j}|dk r|SqdSra)rrorr@r@rAro s   z'_BundleEntity.entity_zero_or_selectablecCs|jD]}||qdSra)rr)rNr$rr@r@rAr& s z!_BundleEntity.setup_compile_statecs@tfdd|jD\}}}|jj||}||j|jfS)Ncsg|]}|qSr@)rrrrr@rAr, sz/_BundleEntity.row_processor..)ziprrZcreate_row_processorr%rr)rNrrZprocslabelsextraprocr@rrAr* s  z_BundleEntity.row_processor)TN) r6r7r8rrQrPrrwrrrrorrr@r@r@rAr s ?   rc@sJeZdZdZed ddZeddZeddZed d Z d d Z dS)r) _fetch_column_row_processorraw_column_indextranslate_raw_columnNc Cs~|D]t}|j}d|kr |d}n t|d}|rfd|jkrPt||||||dqxt||||||dqt|||||dqdS)Nrr2r)r rZextract_first_column_annotation_IdentityTokenEntityr_RawColumnEntity) rlr$columnsrVrrcolumn annotations_entityr@r@rAr< sB     z_ColumnEntity._for_columnscCs|jjSra)rrrr@r@rArj sz_ColumnEntity.typecCs |jjj Sra)rrZhashablerr@r@rArn sz!_ColumnEntity._non_hashable_valuecCs |jjjSra)rrZ_isnullrr@r@rArr sz_ColumnEntity._null_column_typec Cs|j}|jdk rB|j\}}}|jr8||jjj|jf7}|||fS|jdk rT|j}n&|j}|j rl|j j |}|j rz| }|j r|j j |}||}||j|jf}||_|jr|j|jjj|jf}||j|fS|SdSra)r$rrrZinvoked_statementrrrrrrr  _deannotaterZ_getterrr) rNrrr$getterZ label_nameZextra_entitiesrrr@r@rArv s<        z_ColumnEntity.row_processor)N) r6r7r8rQrrrrrrrr@r@r@rAr4 s -   rc@s6eZdZdZdZdZdZd ddZddZdd Z dS) rNF)rrrrorcCs||_||_|dk |_|jr$d|_n |||_|rB|j|n ||||_|jj rf|jj dnd|_ |j|jf|_ d|_ |_ dS)Nr)rrrZ_is_text_clauserrrrFr _from_objectsrorrr)rNr$rrVrrr@r@rArP s   z_RawColumnEntity.__init__cCsdSrr@rr@r@rArr sz_RawColumnEntity.corresponds_tocCsD|}|r||jd}n|j}|jr.|}|j|||_dSr)rrr rrrFr)rNr$rrr@r@rAr s z$_RawColumnEntity.setup_compile_state)N) r6r7r8rrwrrQrPrrrr@r@r@rAr s rc@s2eZdZdZdZdZd ddZddZd d ZdS) rzColumn/expression based entity.F)rrwrrrorrNc Cs|j}|}|dd} |d|} | r.getter)rr)rNrrrr@rrAro s z"_IdentityTokenEntity.row_processorN)r6r7r8rrrr@r@r@rAri sr)NF)?rrrbaserrZ path_registryrrrr r r r rrKrrrrrrrrZsql.baserrrrrZsql.selectablerrrrZ sql.visitorsr r!rootr_rrGsymbolr"objectr#ryrRZ plugin_forrrrrrrrrrrrrrrr@r@r@rAs                                 S_t  C;1yz<