B 4].$@sdZddlmZddlZddlmZddlmZddlmZdd lm Z e e Z d d Z d Zd ZGdddeZGdddeZee_GdddeZGdddeZGdddeeZdS)z@Path tracking utilities, representing mapper graph traversals. )chainN) class_mapper)exc) inspection)utilcCs t|S)N) PathRegistry deserialize)pathr O/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/path_registry.py_unreduce_pathsr*Z _sa_defaultc@seZdZdZdZdZddZddZddZd&d d Z d d Z e ddZ ddZ ddZddZddZddZeddZeddZeddZd d!Zd"d#Zd$d%Zd S)'r aRepresent query load paths and registry functions. Basically represents structures like: (, "orders", , "items", ) These structures are generated by things like query options (joinedload(), subqueryload(), etc.) and are used to compose keys stored in the query._attributes dictionary for various options. They are then re-composed at query compile/result row time as the query is formed and as rows are fetched, where they again serve to compose keys to look up options in the context.attributes dictionary, which is copied from query._attributes. The path structure has a limited amount of caching, where each "root" ultimately pulls from a fixed registry associated with the first mapper, that also contains elements for each of its property keys. However paths longer than two elements, which are the exception rather than the rule, are generated on an as-needed basis. FcCs|dk o|j|jkS)N)r )selfotherr r r __eq__<szPathRegistry.__eq__cCs"td|||||||jf<dS)Nzset '%s' on path '%s' to '%s')logdebug natural_path)r attributeskeyvaluer r r set?szPathRegistry.setcCs&td||||||jf|dS)Nz$setdefault '%s' on path '%s' to '%s')rr setdefaultr)rrrrr r r rCszPathRegistry.setdefaultNcCs"||jf}||kr||S|SdS)N)r)rrrrr r r getGs zPathRegistry.getcCs t|jS)N)lenr )rr r r __len__NszPathRegistry.__len__cCs t|jS)N)rr )rr r r lengthQszPathRegistry.lengthccs:|j}x.tdt|dD]}||||dfVqWdS)Nrrr)r ranger)rr ir r r pairsUszPathRegistry.pairscsFx@fddtdtjdDD]}|jr"||r"dSq"WdSdS)Ncsg|]}j|qSr )r ).0r )rr r [sz0PathRegistry.contains_mapper..rrTF)rrr Z is_mapperisa)rmapperZ path_mapperr )rr contains_mapperZs&zPathRegistry.contains_mappercCs||jf|kS)N)r )rrrr r r containsaszPathRegistry.containscCst|ffS)N)r serialize)rr r r __reduce__dszPathRegistry.__reduce__csX|jttddfddtdtdDDfddtdtdDdgS)NcSsg|] }|jqSr )Zclass_)r"mr r r r#ksz*PathRegistry.serialize..csg|] }|qSr r )r"r )r r r r#ksrrcsg|]}|jqSr )r)r"r )r r r r#lsr)r listziprr)rr )r r r(gs &zPathRegistry.serializecCsH|dkr dSttdd|D}|r>|ddkr>|dd}||S)NcSs2g|]*\}}t||dk r(t|j|ndfqS)N)rZattrs)r"mclsrr r r r#xsz,PathRegistry.deserialize..r)tuplercoerce)clsr pr r r r ps  zPathRegistry.deserializecCs t|j|S)N)EntityRegistryroot)r1r%r r r per_mapperszPathRegistry.per_mappercCstdd||jS)NcSs||S)Nr )prevnextr r r z%PathRegistry.coerce..)rreducer4)r1rawr r r r0szPathRegistry.coercecCsD|dtrt||S|dtr2t|j|Std|dS)N:zinvalid token: %s)endswith_WILDCARD_TOKEN TokenRegistry_DEFAULT_TOKENr4rZ ArgumentError)rtokenr r r rAs   zPathRegistry.tokencCstdd|j|S)NcSs||S)Nr )r6r7r r r r8r9z&PathRegistry.__add__..)rr:r )rrr r r __add__szPathRegistry.__add__cCsd|jj|jfS)Nz%s(%r)) __class____name__r )rr r r __repr__szPathRegistry.__repr__)N)rD __module__ __qualname____doc__is_tokenis_rootrrrrrpropertyrr!r&r'r)r( classmethodr r5r0rArBrEr r r r r s(     r c@s,eZdZdZdZZdZdZdZddZ dS) RootRegistryzXRoot registry, defers to mappers so that paths are maintained per-root-mapper. r FTcCs|jS)N)Z_path_registry)rentityr r r __getitem__szRootRegistry.__getitem__N) rDrFrGrHr r has_entityis_aliased_classrJrOr r r r rMs rMc@s,eZdZddZdZdZddZddZd S) r?cCs,||_||_|j|f|_|j|f|_dS)N)rAparentr r)rrRrAr r r __init__szTokenRegistry.__init__FTccs|jjs>|jjs>xv|jjD]}t|jj||jVqWnJ|jjr|jjjr|Vx0|jjj D]}t|jj||jVqbWn|VdS)N) rRrQrJr%Ziterate_to_rootr?rArNZ_is_with_polymorphicZ_with_polymorphic_entities)rZentr r r generate_for_superclassess z'TokenRegistry.generate_for_superclassescCs tdS)N)NotImplementedError)rrNr r r rOszTokenRegistry.__getitem__N)rDrFrGrSrPrIrTrOr r r r r?s r?c@sXeZdZddZddZejddZejddZe d d Z e d d Z d dZ dS) PropRegistrycCst|d}|jr|jr(|j|j}n>|jrf|jrf|j|jk rf|j|jkrf|d|j}|j|}||_||_|j |f|_ |j |f|_ d|jj |jj f|_ |jj |_ d|j f|_dS)Nr.loader)rinspectrQZ_use_mapper_pathrRZwith_polymorphic_mappersr%Z_entity_for_mapperpropr rZ_wildcard_tokenZ_wildcard_path_loader_keyZ_default_path_loader_keyZ _loader_key)rrRrYZinspZsubclass_entityr r r rSs       zPropRegistry.__init__cCsddd|jDS)Nz -> css|]}t|VqdS)N)str)r"elemr r r sz'PropRegistry.__str__..)joinr )rr r r __str__szPropRegistry.__str__cCs t|jdS)Nr%)hasattrrY)rr r r rPszPropRegistry.has_entitycCs|jjS)N)rYr%)rr r r rNszPropRegistry.entitycCs|jS)N)rN)rr r r r%szPropRegistry.mappercCs ||jS)N)rN)rr r r entity_pathszPropRegistry.entity_pathcCs&t|ttfr|j|St||SdS)N) isinstanceintslicer r3)rrNr r r rOs zPropRegistry.__getitem__N) rDrFrGrSr^rZmemoized_propertyrPrNrKr%r`rOr r r r rVs  rVc@sDeZdZdZdZddZeddZddZeZ d d Z d d Z d S)r3FTcCs||_||_|j|_||_|j|f|_|jrr|jrr|j|jdjrZ|j|jf|_qz|j|jdjf|_n|j|_||_dS)Nr.) rrRrQrNr r%r$rr`)rrRrNr r r rSs zEntityRegistry.__init__cCst|jjS)N)rrXrNr%)rr r r r%szEntityRegistry.mappercCsdS)NTr )rr r r __bool__#szEntityRegistry.__bool__cCs(t|ttfr|j|St||SdS)N)rarbrcr dictrO)rrNr r r rO(s zEntityRegistry.__getitem__cCst||||<}|S)N)rV)rritemr r r __missing__.szEntityRegistry.__missing__N) rDrFrGrQrPrSrKr%rdZ __nonzero__rOrgr r r r r3s r3)rH itertoolsrZloggingbaserrrrZ getLoggerrDrrr>r@objectr rMr4r?rVrer3r r r r  s       ~5