ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@sdZddlmZddlmZddlmZddlmZddlm Z ddlm Z ddl m Z dd l m Z dd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZdee fdYZdefdYZdefdYZ e e!dZ"e"j#dZ"e dZ$e$j#dZ$e e!dZ%e%j#d Z%e%j&d!Z'e d"Z(e(j#d#Z(e(j&d$Z)e d%Z*e*j#d&Z*e*j&d'Z+e d(Z,e,j#d)Z,e,j&d*Z-e d+Z.e.j#d,Z.e d-Z/e/j#d.Z/e e0d/Z1e1j#d0Z1e d1Z2e2j#d2Z2e d3Z3e3j#d4Z3e d5Z4e4j#d6Z4e d7Z5e5j#d8Z5e d9Z6e6j#d:Z6e d;Z7e7j#d<Z7d=S(>s i(tutil(tQueryableAttribute(t_class_to_mapper(t_is_aliased_class(t_is_mapped_class(tInspectionAttr(t MapperOption(tPropComparator(t_DEFAULT_TOKEN(t_WILDCARD_TOKEN(t PathRegistry(t TokenRegistry(t_orm_full_deannotatei(texc(tinspect(t expression(t _generative(t GenerativetLoadcBseZdZdZedZdZdZeZ eZ dZ eZ dZdZdZedZd Zd Zd Zed Zeed ZededZedZedZeedZdZdZdZdZ RS(sqRepresents loader options which modify the state of a :class:`.Query` in order to affect how various mapped attributes are loaded. The :class:`.Load` object is in most cases used implicitly behind the scenes when one makes use of a query option like :func:`.joinedload`, :func:`.defer`, or similar. However, the :class:`.Load` object can also be used directly, and in some cases can be useful. To use :class:`.Load` directly, instantiate it with the target mapped class as the argument. This style of usage is useful when dealing with a :class:`.Query` that has multiple entities:: myopt = Load(MyClass).joinedload("widgets") The above ``myopt`` can now be used with :meth:`.Query.options`, where it will only take effect for the ``MyClass`` entity:: session.query(MyClass, MyOtherClass).options(myopt) One case where :class:`.Load` is useful as public API is when specifying "wildcard" options that only take effect for a certain class:: session.query(Order).options(Load(Order).lazyload('*')) Above, all relationships on ``Order`` will be lazy-loaded, but other attributes on those descendant objects will load using their normal loader strategy. .. seealso:: :ref:`deferred_options` :ref:`deferred_loading_w_multiple` :ref:`relationship_loader_options` cCsFt|}|j|_tj|_i|_d|_t |_ dS(N( Rt_path_registrytpathRt OrderedDicttcontextt local_optstNonet_of_typetFalsetis_class_strategy(tselftentitytinsp((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt__init__Hs     cCs7|j|}||_i|_i|_d|_|S(N(t__new__RRRRR(tclsRtload((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytfor_existing_pathRs     c Cs|jdjrtSg}x|jjD]\\}}}|dkrNq*nxt|jj|D]\}}||k rdPqdqdW|jp|jjd}|j||} | dks*| r|j rq*ng} xx| D]p} t | t j r| j | q| jrtS| j r0| j | jq| js?t| j | jqW| sj|| dkr|jr| j |jq|jrtSn|j t| |jpd|jrtgt|jD]}||j|f^qndq*W|sdSt|SdS(Nitloaderi(((Rtis_aliased_classRRtitemstzipRt _chop_pathRt isinstanceRt string_typestappendt is_propertytkeyt is_mappertAssertionErrortclass_ttupletstrategyRtsorted( RRt serializedR-t loader_pathtobjt local_elemtobj_elemtendpointtchoppedtserialized_pathttoken((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt_generate_cache_key[sL" "        > cCs"tt|j}i|_|S(N(tsuperRt _generateR(Rtcloned((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR?s cCs|j|tdS(N(t_processtTrue(Rtquery((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt process_queryscCs|j|tdS(N(RAR(RRC((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytprocess_query_conditionallyscCs|j}|rlxm|jjD]F\\}}}|j||}|dk r||j||f|rtjd||jfqdSq>nf|j} } tj|j|dsq|rjtjd||jt|dkrZ|jjrZ|jjrZd |d |jjfnd fqqdSnt|d dr4|j} t| } } |j| j |j!d }| jstj"| j#j$| j#dt%dt%d|} t| } n|j| j&|j!d | || | }| |_n || }|dk rZ| j'|n|jro|j}n||_|S(Ns3Wildcard token cannot be followed by another entitys7Mapped attribute '%s' does not refer to a mapped entitys%s:%ss3Can't find property named "%s" on %s in this Query.is.Attribute '%s' does not link from element '%s's1Attribute "%s" does not link from element "%s".%sis% Did you mean to use %s.of_type(%s)?itRtpath_with_polymorphictaliasedt_use_mapper_patht_existing_alias((RRt has_entityR)R tsa_exct ArgumentErrortpropRR*tendswithRR Rtpropagate_to_loadersR%tparentR<RRRtgetattrR0tAttributeErrortpropertyRtorm_utilt$_entity_corresponds_to_use_path_impltlenR.t__name__t entity_pathtgetRtwith_polymorphictmappert base_mapperRBtsett _get_strategy(RRtattrt for_strategyt wildcard_keyRItexisting_of_typet default_tokententtfound_propertyRUtactext_infot of_type_infotexisting((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt_generate_paths             &             cCsd|jfS(NsLoad(strategy=%r)(R2(R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt__str__>scCs+|dk r'tt|j}n|S(N(RR1R3R&(RR2((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt _coerce_stratAs cCstddS(NsHOnly 'unbound' loader options may be used with the Load.options() method(tNotImplementedError(RRXtappliedtbound((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt_apply_to_parentFscGsSi}t|t }|r+tdnx!|D]}|j|||q2WdS(smApply a series of options as sub-options to this :class:`.Load` object. E.g.:: query = session.query(Author) query = query.options( joinedload(Author.book).options( load_only("summary", "excerpt"), joinedload(Book.citations).options( joinedload(Citation.author) ) ) ) :param \*opts: A series of loader option objects (ultimately :class:`.Load` objects) which should be applied to the path specified by this :class:`.Load` object. .. versionadded:: 1.3.6 .. seealso:: :func:`.defaultload` :ref:`relationship_loader_options` :ref:`deferred_loading_w_multiple` sMThe options() method is currently only supported for 'unbound' loader optionsN(R)t _UnboundLoadRuRx(Rtoptst apply_cacheRwtopt((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytoptionsLs   cCs`|j|}t|_||_|j|j||d||_|dk r\|jndS(Nt relationship( RtRRRWRrRR2Rt_set_path_strategy(RRgR2RW((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytset_relationship_strategyvs    cCs|j|}t|_xz|D]r}|j}||_|j|j||dt|_|ru|j j |n|rt|_ n|j qWt|_dS(Ntcolumn( RtRRR?R2RrRRBRWRRHt is_opts_onlyR(RtattrsR2Rzt opts_onlyRgR@((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytset_column_strategys      cCsp|j|}xZ|D]R}|j|j||d}|j}||_||_t|_|jqWdS(N( RtRrRRR?R2RBRWR(RRR2RgRR@((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytset_generic_strategys     cCsx|j|}|j}t|_|j|jd|d}||_||_t|_|j |j j |dS(N( RtR?RBRRrRRR2RWRRRH(RR2RzR@R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytset_class_strategys      cCs|s | r]|j|jd}|rG|rZ|jj|jqZq|j|d|nM|j|jd}|j|d||r|jr|jj|jndS(NR$(RaRRRHReR(RRRtreplacet merge_optsRq((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt _set_for_paths cCs|j r%|jjr%|jj}n |j}|jrsx[|jD](}|j|j|dtd|j qDWn"|j|j|dtd|j dS(NRR( RRRRRXtis_tokentgenerate_for_superclassesRRRBR(Rteffective_pathR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRs  cCs&|jj}|jj|d<|S(NR(t__dict__tcopyRt serialize(Rtd((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt __getstate__scCs)|jj|tj|j|_dS(N(RRHR t deserializeR(Rtstate((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt __setstate__scCsd}xtt||jD]\}\}}t|tjr|dkrf|jdtrf|S|dtfkr||j krdSn||krqqt|t r|j r|j r|j |rqqdSqW||dS(Niit:srelationship:%si(t enumerateR'RR)RR*RVRR R-RRR.tisa(Rtto_chopRtitc_tokentp_token((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR(s"+   N(!R_t __module__t__doc__Rt classmethodR#R=R?RRRRR2RWRDRERARBRrRsRtRxRR}RRRRRRRRR((((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR s8&  F      *      RycBseZdZdZeZdZdZdZdZ dZ dZ dZ e d Zd Zed Zd Zd ZdZRS(s2Represent a loader option that isn't tied to a root entity. The loader option will produce an entity-linked :class:`.Load` object when it is passed :meth:`.Query.options`. This provides compatibility with the traditional system of freestanding options, e.g. ``joinedload('x.y.z')``. cCsd|_g|_i|_dS(N((Rt_to_bindR(R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRs  cCsd}x|jD]}xt|j|jD]\}}||k r,Pq,q,W|j|jdgddt}|r|j|}|tkrtS|r||7}qqqW|sdS|SdS(Ni((RR'Rt _bind_loaderRRR=(RRR4tvalR7tval_elemR|tc_key((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR= s" " cCs|jj|dS(N(RR+(R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRscsR|kr|S|j}||<|j|_|jr|jd}t|tjr|jtr|jdddt }n|j j|jdd!||jdn|j |j kst |j|jkst |j|jkst fd|jD}j|_|jj||jj|j|S(NiRics%h|]}|jqS((Rx(t.0telem(RvRwRX(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pys :s (R?R2RR)RR*RVRtsplitR RrRRWR/RRRtextendRRH(RRXRvRwR@Rgt new_to_bind((RvRwRXsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRx s*       '  cCs|rUt|tjrU|ttfkrU|tkrBt|_nd||f}n|rt|dr|j r|dd!}n|r||f}n||_ |S(Ns%s:%sii( R)RR*R RRRWRRR(RRRgRhRi((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRrCs    cCs/|jj}|j|jdt|d<|S(Ntfilter_aliased_classR(RRt_serialize_pathRRB(RR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRSscCsg}x|dD]}t|trt|dkrM|\}}d}n|\}}}t||}|r|j|}n|j|q|j|qWt||d<||_dS(NRi(R)R1R^RRYtof_typeR+R(RRtretR-R!tpropkeyRRU((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRXs  cCsv|jd}xb|jD]W}||kr|j||jg|jD]}|j^qF|j|j|qqWdS(Nt_unbound_load_dedupes(RGRtaddRt_mapper_entitiest entity_zeroRF(RRCRItdedupesRRl((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRAks   c Cst}d}g|D]}||D] }|^q)q} xH| dd!D]9}|rm||||}n|j|}t|_qLW||| d|}t|_|S(NcSs]t|tjrR|tkr%tfS|jdtrE|d}n|jdS|fSdS(Nt.i(R)RR*R Rt startswithR(R-((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt _split_key{s   ii(Ryt defaultloadRBt_is_chain_linkR( R!tmethtkeystchainedtkwR|RR-R<t all_tokens((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt _from_keysws  ,  cCsd}xtt||jD]\}\}\}}t|tjr|dkro|jdtro|S|dtfkr||j krdSq"t|t r"|j |k s|j |k r|j j s|j j| rdSq"q"W|d7}||S(NiiRsrelationship:%si(RR'tpairsR)RR*RVRR R-RRR[t _parententityR.R(RRRRRtp_entitytp_prop((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR(s".   cCsg}x|D]}t|tr|re|jret|jjre|j|jj|jdfq|j|jj|j|jfq t|t r|j|jj|jdfq |j|q W|S(N( R)RRRR%R+t _parentmapperR0R-RR(RRRRR<((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRs  ""cCs|j}|jr,|r,||df7}n|rG|j||}n|sQdS|d}t|tjr|j|||}n~t|tr|j }|j |||j |}nH|jrt |rt |}||krd}qntjd|s dS|} t| } |dk r7|| _n | j}|j| _|j| _|j| _| j} | jsx^t|D]M\} }| j| j|| t|dkr|jndd|sdSqWn| jj|j| j r| jjr| jj} n | j} | jr^x]| jD])} | j|| d|j d|jq.Wn#| j|| d|j d|j| S(s]Convert from an _UnboundLoad() object into a Load() object. The _UnboundLoad() uses an informal "path" and does not necessarily refer to a lead entity as it may use string tokens. The Load() OTOH refers to a complete path. This method reconciles from a given Query into a Load. Example:: query = session.query(User).options( joinedload("orders").joinedload("items")) The above options will be an _UnboundLoad object along the lines of (note this is not the exact API of _UnboundLoad):: _UnboundLoad( _to_bind=[ _UnboundLoad(["orders"], {"lazy": "joined"}), _UnboundLoad(["orders", "items"], {"lazy": "joined"}), ] ) After this method, we get something more like this (again this is not exact API):: Load( User, (User, User.orders.property)) Load( User, (User, User.orders.property, Order, Order.items.property)) is6mapper option expects string key or list of attributesNiRR(RRR(RR)RR*t_find_entity_basestringRR[t_find_entity_prop_comparatorRRRRSRTRRR2RRRrR^RRHRRRXRRRR(RtentitiesRJRRIRKR<RRUt path_elementR$RtidxR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRsr$                "       cCst|r|}n t|}x|D]}tj||r(|Sq(W|rt|stjdtjt ||fqtjd|dj d|DfndSdS(NsGQuery has only expression-based entities, which do not apply to %s "%s"sMapped attribute "%s" does not apply to any of the root entities in this query, e.g. %s. Please specify the full path from one of the root entities to the target attribute. s, css|]}t|VqdS(N(tstr(Rtx((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pys ^s( RRR\t_entity_corresponds_totlistRSRTRtclsname_as_plain_namettypetjoinR(RRRURcRIt searchforRl((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRGs     "&cCs|jdtrytt|dkr|rvtjddjd|Ddjd|Dfqvqn|jtrt}nx2|D]}|SW|rtjd|fndSdS(NRisCan't apply wildcard ('*') or load_only() loader option to multiple entities %s. Specify loader options for each entity individually, such as %s.s, css|]}t|VqdS(N(R(RRl((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pys mscss|]}d|VqdS(sLoad(%s).some_option('*')N((RRl((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pys ossJQuery has only expression-based entities - can't find property named "%s".( RVR R^RRSRTRRRR(RRR<RIRl((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRcs$  (R_RRRRRR=RRxRrRRRARRR(RRRR(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRys      #       t loader_optioncBs,eZdZdZdZdZRS(cCsdS(N((R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRscCsO|j|_}||_tt|r;td|ntt|||S(Ns#Load class already has a %s method.(R_tnametfnthasattrRt TypeErrortsetattr(RRR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt__call__s  cCs<||_|jj}di|jd6|j_||_|S(NsProduce a new :class:`.Load` object with the :func:`.orm.%(name)s` option applied. See :func:`.orm.%(name)s` for usage examples. R(t _unbound_fnRRR(RRtfn_doc((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt_add_unbound_fns    cCsPdi|jd6|_tjddi|jd6dt|}||_|S(NsuProduce a standalone "all" option for :func:`.orm.%(name)s`. .. deprecated:: 0.9 The :func:`.%(name)s_all` function is deprecated, and will be removed in a future release. Please use method chaining with :func:`.%(name)s` instead, as in:: session.query(MyClass).options( %(name)s("someattribute").%(name)s("anotherattribute") ) Rs0.9sThe :func:`.%(name)s_all` function is deprecated, and will be removed in a future release. Please use method chaining with :func:`.%(name)s` insteadtadd_deprecation_to_docstring(RRRt deprecatedRt_unbound_all_fn(RR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt_add_unbound_all_fns   (R_RRRRR(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRs  cCs|dk r6t|tsct|}|j}qcn-t|ddrct|j}|j}n|j|idd6dt}||j d<|S(snIndicate that the given attribute should be eagerly loaded from columns stated manually in the query. This function is part of the :class:`.Load` interface and supports both method-chained and standalone operation. The option is used in conjunction with an explicit join that loads the desired rows, i.e.:: sess.query(Order).\ join(Order.user).\ options(contains_eager(Order.user)) The above query would join from the ``Order`` entity to its related ``User`` entity, and the returned ``Order`` objects would have the ``Order.user`` attribute pre-populated. :func:`.contains_eager` also accepts an `alias` argument, which is the string name of an alias, an :func:`~sqlalchemy.sql.expression.alias` construct, or an :func:`~sqlalchemy.orm.aliased` construct. Use this when the eagerly-loaded rows are to come from an aliased table:: user_alias = aliased(User) sess.query(Order).\ join((user_alias, Order.user)).\ options(contains_eager(Order.user, alias=user_alias)) When using :func:`.contains_eager` in conjunction with inherited subclasses, the :meth:`.RelationshipProperty.of_type` modifier should also be used in order to set up the pathing properly:: sess.query(Company).\ outerjoin(Company.employees.of_type(Manager)).\ options( contains_eager( Company.employees.of_type(Manager), alias=Manager) ) .. seealso:: :ref:`loading_toplevel` :ref:`contains_eager` RtjoinedtlazyRWteager_from_aliasN( RR)RRt selectableRYRRRR(tloadoptRgtaliastinfototR@((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytcontains_eagers0    cOstjtj|t|S(N(RyRRRB(RR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyRs cGsL|j|itd6td6}|jditd6td6itd6|S(sIndicate that for a particular entity, only the given list of column-based attribute names should be loaded; all others will be deferred. This function is part of the :class:`.Load` interface and supports both method-chained and standalone operation. Example - given a class ``User``, load only the ``name`` and ``fullname`` attributes:: session.query(User).options(load_only("name", "fullname")) Example - given a relationship ``User.addresses -> Address``, specify subquery loading for the ``User.addresses`` collection, but on each ``Address`` object load only the ``email_address`` attribute:: session.query(User).options( subqueryload("addresses").load_only("email_address") ) For a :class:`.Query` that has multiple entities, the lead entity can be specifically referred to using the :class:`.Load` constructor:: session.query(User, Address).join(User.addresses).options( Load(User).load_only("name", "fullname"), Load(Address).load_only("email_addres") ) .. versionadded:: 0.9.0 tdeferredt instrumentt*t undefer_pks(RRRB(RRR@((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt load_onlys ""cGstj|S(N(RyR(R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR0scCs9|j|idd6}|dk r5||jdsR-R(RRBR1R3tid(Rtclasses((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pytselectin_polymorphicrs  $cCs5t}t|_t|f|_|j||S(N(RyRBRRRR (tbase_clsR tul((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyR s    N(8RRMRR\t attributesRtbaseRRRRt interfacesRRt path_registryRR R R R R RSRtsqlRRtsql.baseRRRRytobjectRRRRRRRRRRRRRRRRRRRRRRRR (((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/strategy_options.pyt sz8?+[!"$%? 1 $"