Ñò ‰„[Jc@sdZddkiZddklZlZlZddklZ ddkl Z l Z l Z ddk lZlZlZddklZlZlZlZlZlZlZddk lZddk lZdddeeddedd „ Zd efd „ƒYZd efd „ƒYZ ei!e ƒde fd„ƒYZ"ei!e"ƒdefd„ƒYZ#ei!e#ƒde$fd„ƒYZ%defd„ƒYZ&defd„ƒYZ'defd„ƒYZ(de(fd„ƒYZ)ei!e)ƒde(fd„ƒYZ*ei!e*ƒde$fd„ƒYZ+d e(fd!„ƒYZ,ei!e,ƒd"efd#„ƒYZ-d$efd%„ƒYZ.d&ei/fd'„ƒYZ0dS((sTsqlalchemy.orm.interfaces.LoaderStrategy implementations, and related MapperOptions.iÿÿÿÿN(tsqltutiltlog(R(tvisitorst expressiont operators(tmappert attributest interfaces(tLoaderStrategytStrategizedOptiont MapperOptiontPropertyOptiontserialize_pathtdeserialize_pathtStrategizedProperty(tsessionc Ks‰|i} ti| iƒpg}|o!| io|it| ƒƒnt| ddƒo|i| i iƒn| i | i i jo-|it i| i | i i | i ƒƒn|o|iti| i ƒƒnx§|iƒD]™}|| i jp |i ox|i| i ƒoeti|i| i d| d|d|d|d|d|d|d |d |d |d | d | |  qèqèWdS(Ntbackreft parent_tokentmutable_scalarstuselistt copy_functiontcompare_functiont useobjectt extensiont trackparentt typecallablet callable_tactive_historyt impl_class(tparent_propertyRtto_listRt single_parenttappendt_SingleParentValidatortgetattrtNoneRtkeytparentt _validatorst mapperutilt Validatort sessionlibtUOWEventHandlertpolymorphic_iteratortconcretet has_propertyRtregister_attribute_impltclass_(tstrategyRRRRRRRRtproxy_propertyRRtkwtpropt attribute_exttm((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt_register_attributes: - . tUninstrumentedColumnLoadercBs,eZdZd„Zdd„Zd„ZRS(sàRepresent the strategy for a MapperProperty that doesn't instrument the class. The polymorphic_on argument of mapper() often results in this, if the argument is against the with_polymorphic selectable. cCs|ii|_dS(N(Rtcolumns(tself((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytinitLscKs=x6|iD]+}|o|i|}n|i|ƒq WdS(N(R9R!(R:tcontexttentitytpathtadaptertcolumn_collectiontkwargstc((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt setup_queryOs  cCsdS(N(NN(R$(R:t selectcontextR>RtrowR?((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytcreate_row_processorUsN(t__name__t __module__t__doc__R;R$RCRF(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR8Es  t ColumnLoadercBs5eZdZd„Zdd„Zd„Zd„ZRS(s>Strategize the loading of a plain column-based MapperProperty.cCs(|ii|_t|idƒ|_dS(Ntcomposite_class(RR9thasattrt is_composite(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR;[scKs=x6|iD]+}|o|i|}n|i|ƒq WdS(N(R9R!(R:R<R=R>R?R@RARB((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRC_s  c Csnt|_|idi}|idi}t||dtd|id|id|idii ƒd|ƒdS(NiRRRRR( tTruetis_class_levelR9ttypet primary_keyR7tFalsetcompare_valuest copy_valuet is_mutable(R:RtcoltypeR((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytinit_class_attributees   csшiˆid‰‰|o|iˆ‰nˆ|joV‡‡fd†}ˆio/ˆi|ˆidˆ‡‡fd†ƒ}n|dfS‡fd†}ˆioˆiidˆƒn|dfSdS(Nics|ˆ|ˆ|scs|o|iˆgƒndS(N(texpire_attributes(RXRYREtisnewRZ(R%(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\€ss%s deferring load(R%R9t_should_log_debugtdebug_callabletloggerR$tdebug(R:RDR>RRER?R\((R:R[R%s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRFqs    N(RGRHRIR;R$RCRWRF(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRJXs    tCompositeColumnLoadercBs eZdZd„Zd„ZRS(sBStrategize the loading of a composite column-based MapperProperty.c sdtˆ_ˆiidˆƒ‡fd†}‡fd†}tˆ|dtd|d|dtƒdS(Ns'%s register managed composite attributecs(|djodSˆii|iƒŒS(N(R$RRKt__composite_values__(tobj(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytcopys cs}|djp |djo ||jSxQtˆi|iƒ|iƒƒD]*\}}}|ii||ƒptSqGWtSdS(N(R$tzipR9RfRPRSRRRN(tatbR[taproptbprop(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytcompare•s     RRRR(RNRORctinfoR7RR(R:RRhRn((R:s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRWŒs  c s|i|i|ii‰‰‰|o,g}ˆD]}||i|q2~‰nx¬ˆD]O}||jo<‡fd†}|io|iid|ƒn|dfSqZW‡‡‡fd†}|io,|i||id|‡fd†ƒ}n|dfSdS(Ncs|o|iˆgƒndS(N(R_(RXRYRER`RZ(R%(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\®ss%s deferring loadcs3ˆg}ˆD]}|||q~Œ|ˆRRER?RpRBR\((RKR%R9s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRF¨s  ,   (RGRHRIRWRF(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRe‰s tDeferredColumnLoadercBs>eZdZd„Zd„Zd„Zdd„Zd„ZRS(sAStrategize the loading of a deferred column-based MapperProperty.csÀˆid}|o|i|}n||jo&ˆiitƒi|||||ƒSˆip‡fd†}n‡fd†}ˆio(ˆi|ˆid‡fd†ƒ}n|dfS(Nics#|iˆit|ˆiƒƒdS(N(t set_callableR%tLoadDeferredColumns(RXRYRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\Íscs|iˆi|ƒdS(N(tresetR%(RXRYRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\Ðscsdti|ˆiƒS(sset deferred callable on %s(R(R]R%(RXRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR^×s( R9Rt _get_strategyRJRFRORaRbRcR$(R:RDR>RRER?R[R\((R:s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRFÅs  &  cCsEt|idƒotdƒ‚n|ii|_|ii|_dS(NRKs8Deferred loading for composite types not implemented yet(RLRtNotImplementedErrorR9tgroup(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR;ÛscCskt|_t||dtd|idiid|idiid|idiiƒd|i dtƒdS(NRRiRRRtdont_expire_missing( RNROR7RRR9RPRSRTRUt_class_level_loader(R:R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRWás  cKss|idj o|iid|iftƒp|o9|i|jo)|iitƒi |||||ndS(Ntundefer( RwR$RtgetRRR%RRuRJRC(R:R<R=R>R?tonly_load_propsRA((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRCìs/cCs%ti|ƒpdSt||iƒS(N(R(t_state_has_identityR$RsR%(R:RX((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRyósN( RGRHRIRFR;RWR$RCRy(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRqÂs    RscBs eZdZd„Zd„ZRS(s7serializable loader object used by DeferredColumnLoadercCs|||_|_dS(N(RXR%(R:RXR%((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt__init__ÿsc Cs¾|i}ti|ƒ}|i|iƒ}|itƒ}|ioeg}|iD]J}t |t ƒo4t |i tƒo!|i|ijo||iqQqQ~}n |ig}g}|D]!} | |i jo || q¿q¿~} |i oD|iidti||iƒ| odi| ƒpdfƒnti|ƒ} | djo)tidti|ƒ|ifƒ‚n| i|ƒ} |id} | idd| d| d|ƒtiS( Nsdeferred load %s group %st,R$sfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceeditidentR|t refresh_state(RXRt _state_mappert get_propertyR%RuRqRwtiterate_propertiest isinstanceRR1t unmodifiedRaRcRdR(R]tjoinR*t_state_sessionR$tsa_exctUnboundExecutionErrort state_strtqueryt_getRt ATTR_WAS_SET(R:RXt localparentR4R1Rptpttoloadt_[2]tkRwRRŒR€((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt__call__s2   . 5  8   (RGRHRIR~R”(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRsüs tDeferredOptioncBseZed„Zd„ZRS(cCs#tt|ƒi|ƒ||_dS(N(tsuperR•R~tdefer(R:R%R—((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR~-scCs|iotStSdS(N(R—RqRJ(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytget_strategy_class1s (RGRHRRR~R˜(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR•,s tUndeferGroupOptioncBseZd„Zd„ZRS(cCs ||_dS(N(Rw(R:Rw((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR~8scCst|id|ifRRER?R\((R:s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRFVs  (RGRHRIRWRF(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR£Js t LazyLoadercBskeZdZd„Zd„Zeedd„Zedd„Zd„Z d„Z ed„Z e e ƒZ RS( s7Strategize a relation() that loads when first accessed.cCs¤tt|ƒiƒ|i|iƒ\|_|_|_|ii d||ifƒ|i o|i i di |iƒ|_|io|ii d|ƒndS(Ns%s lazy loading clause %sis2%s will use query.get() to optimize instance loads(R–R¥R;t_create_lazy_clauseRt_LazyLoader__lazywheret_LazyLoader__bind_to_colt_equated_columnsRcRoRRt _get_clauseRntuse_get(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR;es $* c CsAt|_t||dtd|id|iid|iiƒdS(NRRRR(RNROR7RyRRR¤(R:R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRWrs   csõˆdjoˆiˆd|ƒSˆp!ˆiˆiˆi}‰}n"tiˆidˆƒ\}‰}‡‡‡‡fd†}ˆiio/|o(t i ˆiii ƒƒi |ƒ}nt i|hh|d6ƒ}|o||ƒ}n|S(Nt adapt_sourcetreverse_directioncs_ˆo ˆiip ˆii‰ˆiˆjo+ˆiƒ‰‡‡‡‡fd†ˆ_ndS(NcsˆiˆˆˆiƒS((t_get_committed_attr_by_columnR%((Rt bind_to_colt bindparamto(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR^Žs(RRR&R%Rgtvalue(R°(R:R­RXR¯(RR±R°s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pytvisit_bindparam‡s  R°(R$t_lazy_none_clauseR§R¨R©R¥R¦Rt secondarytsql_utilt ClauseAdaptertaliasttraverseRtcloned_traverse(R:RXR­talias_secondaryR¬t criteriontrevR³((R:R­RXR¯s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt lazy_clause~s !! (cs•ˆp!ˆiˆiˆi}‰}n"tiˆidˆƒ\}‰}‡‡‡fd†}ti|hh|d6ƒ}|o||ƒ}n|S(NR­cs؈o ˆiip ˆii}t|itiƒoJ|iiˆjo7|i|_ti ƒ|_t i |_ t i |_nUt|itiƒo>|iiˆjo+ti ƒ|_t i |_ t i |_ndS(N(RRR&R…tleftRt_BindParamClauseR%trighttnullRtis_toperatortisnottnegate(tbinaryR(R¯R:R­(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt visit_binaryžs )  ) RÇ(R§R¨R©R¥R¦RRRº(R:R­R¬R¼R½RÈ((R:R­R¯s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR´˜s!! cCs%ti|ƒpdSt||iƒS(N(R(R}R$tLoadLazyAttributeR%(R:RX((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRy°scs¥ˆipL‡fd†}ˆio(ˆi|ˆid‡fd†ƒ}n|dfS‡fd†}ˆio(ˆi|ˆid‡fd†ƒ}n|dfSdS(Ncs#ˆi|dt|ˆiƒƒdS(NR(R¢RÉR%(RXRYRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\¸scsdti|ˆiƒS(s$set instance-level lazy loader on %s(R(R]R%(RXRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR^Áscs|iˆi|ƒdS(N(RtR%(RXRYRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR\Æscsdti|ˆiƒS(s!set class-level lazy loader on %s(R(R]R%(RXRERZ(R:(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR^Îs(RORaRbRcR$(R:RDR>RRER?R\((R:s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRF¶s    c s‹tiƒ‰tiƒ‰tiƒ}|oX|i oMx“|iD];\}}ˆi|gƒ}|i||fƒ|||øs ( Rt column_dictt secondaryjointlocal_remote_pairst setdefaultR!t primaryjoinRtreplacement_traverseR$Rtand_tdict( tclsR4R­tequated_columnstltrt_listRÏt lazywhereRÒR¯((RÍRÎs=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR¦Ós2       N( RGRHRIR;RWRRR$R¾R´RyRFR¦t classmethod(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR¥bs    (RÉcBs2eZdZd„Zd„Zd„Zd„ZRS(s-serializable loader object used by LazyLoadercCs|||_|_dS(N(RXR%(R:RXR%((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR~scCs|i|ifS(N(RXR%(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt __getstate__scCs|\|_|_dS(N(RXR%(R:RX((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt __setstate__sc Cs%|i}ti|ƒ}|i|iƒ}|itƒ}|io'|ii dt i ||iƒƒnt i |ƒ}|djo)tidt i|ƒ|ifƒ‚n|i|iƒiƒ}|io |i|i|ifƒ}n|io–g}t}xM|iiD]?} |i||i| ƒ} |o | dj}|i| ƒqW|odS|io|i|iŒ}n|i|ƒS|io|it i!|iƒŒ}n|io|i|iŒ}n|i"|i#|ƒƒ}|i$ƒ} |i%o| S| o | dSdSdS(Ns loading %ssbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceedi(&RXRR‚RƒR%RuR¥RaRcRdR(R]R*RˆR$R‰RŠR‹RŒt_adapt_all_clausest load_patht_with_current_pathR«RNRQt#_get_committed_state_attr_by_columnR©R!t load_optionst_conditional_optionsR{torder_byRRtfilterR¾tallR( R:RXtinstance_mapperR4R1RtqR€tallnullsRQtvaltresult((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR” sL  '            (RGRHRIR~RàRáR”(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRÉÿs    t EagerLoadercBsJeZdZd„Zd„Zddd„Zd„Zd„Zd„Z RS(sZStrategize a relation() that loads within the process of the parent object being selected.cCs&tt|ƒiƒ|ii|_dS(N(R–RðR;Rt join_depth(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR;DscCs|iitƒi|ƒdS(N(RRuR¥RW(R:R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRWHsc KsQ|ipdS||if}d|f|ijo‰|id|f}|i|i|ƒ}|o+|o$|i|ƒ|id|f<}n#|o||id|f<}n|i} nD|i|||||ƒ}|pdS||id|f<|i} xI|i i ƒD]8} | i ||||i i f|d|i d| ƒqWdS(s?Add a left outer join to the statement thats being constructed.Nt user_defined_eager_row_processorteager_row_processort parentmapperR@( tenable_eagerloadsR%Rt_get_entity_clausesRŒtwraptprimary_columnst_create_eager_jointsecondary_columnsRt_iterate_polymorphic_propertiestsetupt base_mapper( R:R<R=R>R?R@RôRAtclausestadd_to_collectionR²((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRCKs& $  cCsäd|f|ijoI|io#t|ƒd|ijodSq_|ii|jodSn|djo |i}n|}|ii}||ijo||i }} nm|p |i o||i }} nGt i |i |i ƒ\} } | o| | }} n||i }} |ii || ƒ} titi|iƒd|iiƒ} t}|ozt|ddƒot|i|i|iƒ}n+tti|i|i ƒ|i|iƒ}||ijo t}qçn |i}ti| | i|d|ƒ|i|<}|i |_|ii o{|iion| ofxct i|iiƒD]H}|iii |ƒo,|o|i!|}n|i"i#|ƒqUqUWn|ii$o.|i%|i&i't(i)|ii$ƒƒ7_%n| S(Ntloaderstrategyit equivalentst aliased_classt join_to_left(*RRñtlenRRýR$RŒt_should_nest_selectablet eager_joinst selectablet from_clauseR¶tfind_join_sourceRÔR(t ORMAdaptert AliasedClasst_equivalent_columnsRRR#RR%RR&RNt outerjointstop_onRµt find_columnsRÕt mapped_tableRBtcontains_columnR9RøR!Rèteager_order_byt_target_adaptertcopy_and_processRR(R:R<R=R>R?RôRtshould_nest_selectablet entity_keytdefault_towraptindextclausettowrapRþRtonclauset eagerjoinR[((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRùksR      * ) # .cCs d|f|ijoU|id|f}|io|o|i|iƒ}qÄ|io |i}qÄnZd|f|ijo|id|f}n-|io|iidt|ƒƒntSy|ii ||ƒ}|SWn8t j o,}|io|iid|ƒntSXdS(NRòRós*Could not locate aliased clauses for key: s;could not locate identity key from row; missing column '%s'( RR?R÷RaRcRdtstrRRRtidentity_key_from_rowtKeyError(R:R<RER?R>t decoratort identity_keyR“((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt_create_eager_adapter¿s$   cs$|ˆif}ˆiˆ|||ƒ}|tj o¤ˆi‰ˆiiˆ|ˆiif|ƒ‰ˆip‡‡fd†}n‡‡‡fd†}ˆio,ˆi|ˆi dˆ‡fd†ƒ}n||fSˆioˆi i dˆƒnˆi i t ƒiˆ||||ƒSdS(Ncs/|oˆ|dƒ|ˆti||ˆƒ}ti|dƒ}|ˆi|ˆfRRER?t eager_adapterR$((R%R#R:R<s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRFØs   %     N( RGRHRIR;RWR$RCRùR"RF(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyRðAs   T tEagerLazyOptioncBs8eZeeded„Zd„Zd„Zd„ZRS(cCs8tt|ƒi||ƒ||_||_||_dS(N(R–R-R~tlazytchainedt _only_on_lead(R:R%R.R/RR0((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR~ s  cCs"|ipti||ƒndS(N(R0R tprocess_query_conditionally(R:RŒ((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR1s cCs|i o|iS(N(R.R/(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyt is_chainedscCs=|iotS|itjotS|idjotSdS(N(R.R¥RRRðR$R£(R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR˜s  N( RGRHRNRRR$R~R1R2R˜(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR- s  tLoadEagerFromAliasOptioncBs&eZdd„Zd„Zd„ZRS(cCsZtt|ƒi|ƒ|o0t|tƒpti|ƒ\}}}qMn||_dS(N(R–R3R~R…t basestringR(t _entity_infoR¸(R:R%R¸R6tis_aliased_class((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR~!s  cCsdS(N((R:RŒ((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/strategies.pyR1(scCs¤|iot|itƒoE|dd\}}|i|dtƒ}|ii|iƒ|_nti|iƒ|id|dfsL4 '/ 7 8 0   › BÇ