zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
U
¸ý°d–ƒã@sDddlmZddlZddlmZddlZddlmZddlmZddlmZddlm    Z    ddlm
Z
dd    lm Z dd
lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZejr\ddl m!Z!ddl m"Z"ddlm#Z#ddl$m%Z%Gdd „d eƒZ&Gd!d"„d"ej'ƒZ(e(j)Z)ed#ee(j)edfZ*Gd$d%„d%ej'ƒZ+e,e+ƒ\Z-Z.Z/Z0Z1Gd&d'„d'ƒZ2Gd(d)„d)ee2ƒZ3Gd*d+„d+e2eƒZ4Gd,d-„d-e2ej5ƒZ6Gd.d/„d/e ƒZ7d0d1d2d0d3œd4d5„Z8Gd6d7„d7eƒZ9e9ƒZ:dS)8é)Ú annotationsN)Ú zip_longest)ÚAny)ÚDict)ÚIterable)ÚIterator)ÚList)ÚMutableMapping)Ú
NamedTuple)ÚOptional)ÚSequence)ÚTuple)ÚUnioné)Úanon_map)ÚHasTraversalDispatch)ÚHasTraverseInternals)ÚInternalTraversal)Úprefix_anon_mapé)Úutil©Úinspect)Ú HasMemoized)ÚLiteral)ÚProtocol)Ú BindParameter)Ú ClauseElement)Ú_TraverseInternalsType)Ú_CoreSingleExecuteParamsc@seZdZddddœdd„ZdS)Ú_CacheKeyTraversalDispatchTypeÚ HasCacheKeyÚ_CacheKeyTraversalÚCacheKey)ÚselfÚvisitorÚreturncCsdS©N©)Úsr$r%r(r(úOd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/sql/cache_key.pyÚ__call__,sz'_CacheKeyTraversalDispatchType.__call__N)Ú__name__Ú
__module__Ú __qualname__r+r(r(r(r*r +sr c@seZdZdZdS)Ú
CacheConstrN)r,r-r.ÚNO_CACHEr(r(r(r*r/2sr/rc@s eZdZdZdZdZdZdZdS)ÚCacheTraverseTargetrrrééN)r,r-r.ÚCACHE_IN_PLACEÚCALL_GEN_CACHE_KEYÚSTATIC_CACHE_KEYÚPROPAGATE_ATTRSÚ    ANON_NAMEr(r(r(r*r1>s
r1c@s’eZdZUdZdZeZded<dZdZ    dZ
ded<dZd    ed
<e d d œd d„ƒZ e  d¡ddddœdd„ƒZdd œdd„Ze dddœdd„ƒZdS)r!apMixin for objects which can produce a cache key.
 
    This class is usually in a hierarchy that starts with the
    :class:`.HasTraverseInternals` base, but this is optional.  Currently,
    the class should be able to work on its own without including
    :class:`.HasTraverseInternals`.
 
    .. seealso::
 
        :class:`.CacheKey`
 
        :ref:`sql_caching`
 
    r(Ú_CacheKeyTraversalTypeÚ_cache_key_traversalTNzOptional[bool]Ú inherit_cacherÚ_generated_cache_key_traversalzCUnion[_CacheKeyTraversalDispatchType, Literal[CacheConst.NO_CACHE]]©r&cCsö|j dd¡}t|ƒ}|rŒt|ddƒ}|dkrfzt|tƒs>t‚|j}Wntk
rdt    |_
t    YSX|t    k    s~td|›dƒ‚t   ||d¡S|j dd¡}|dkrä|j dd¡}|dkrät    |_
|dkrà|j ràtjd|jd    d
t    St   ||d¡SdS) zµgenerate cache key dispatcher for a new class.
 
        This sets the _generated_cache_key_traversal attribute once called
        so should only be called once per class.
 
        r;Nr:zclass zK has _cache_key_traversal=NO_CACHE, which conflicts with inherit_cache=Truer<Ú_traverse_internalsaµClass %s will not make use of SQL compilation caching as it does not set the 'inherit_cache' attribute to ``True``.  This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions.  Set this attribute to True if this object can make use of the cache key generated by the superclass.  Alternatively, this attribute may be set to False which will disable this warning.Zcprf)Úcode)Ú__dict__ÚgetÚboolÚgetattrÚ
issubclassrÚAssertionErrorr>ÚAttributeErrorr0r<Ú_cache_key_traversal_visitorZgenerate_dispatchÚ_hierarchy_supports_cachingrÚwarnr,)Úclsr;Zinheritr:r(r(r*Ú_generate_cache_attrs‡s\
 
 
 
 
ÿ
ýÿÿÿþ    ÷
õ ýz!HasCacheKey._generate_cache_attrszsqlalchemy.sql.elementsrúList[BindParameter[Any]]zOptional[Tuple[Any, ...]])rÚ
bindparamsr&c sð|j}ˆ |¡\}}|r ||fSz|jd}Wntk
rJ| ¡}YnX|tkr`dˆt<dS||f}||tƒD]v\}}    }
|    dk    rr|
tkr¸|    j} | tkrªdˆt<dS||| f7}qr|
t    krìt
j j } t |    | jƒrÞ|     ˆ¡}    |||    f7}qr|
tkr |||     ˆˆ¡f7}qr|    rr|
tkr(|||    f7}qr|
tkr`|||    d|    drV|    d ˆˆ¡ndf7}qr|
tjkr|jr€||j7}n|| ˆ¡7}qr|
tjks´|
tjks´|
tjkrÖ||t‡‡fdd„|    Dƒƒf7}qr||
||    |ˆˆƒ7}qr|S)aBreturn an optional cache key.
 
        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.
 
        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.
 
        If a structure cannot produce a useful cache key, the NO_CACHE
        symbol should be added to the anon_map and the method should
        return None.
 
        r<TNZcompile_state_pluginZplugin_subjectcsg|]}| ˆˆ¡‘qSr(©Ú_gen_cache_key©Ú.0Úelem©rrMr(r*Ú
<listcomp>@sÿz.HasCacheKey._gen_cache_key.<locals>.<listcomp>)Ú    __class__Zget_anonr@ÚKeyErrorrKr0rGr6Z_static_cache_keyr8rZ    preloadedZ sql_elementsÚ
isinstanceZ_anonymous_labelZ    apply_mapr5rOr4r7rÚdp_annotations_keyZ!_gen_static_annotations_cache_keyZ_annotations_cache_keyZ_gen_annotations_cache_keyÚdp_clauseelement_listÚdp_clauseelement_tupleÚdp_memoized_select_entitiesÚtuple) r$rrMrJÚid_ÚfoundÚ
dispatcherÚresultÚattrnameÚobjÚmethZsckÚelementsr(rSr*rOÐs–ÿ 
 
 
þ
 
ý ÿù      ÿþÿý þÿþ
ÿzHasCacheKey._gen_cache_keyúOptional[CacheKey]cCs<g}tƒ}| ||¡}t|kr"dS|dk    s.t‚t||ƒSdS)apreturn a cache key.
 
        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.
 
        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.
 
        The cache key returned by this method is an instance of
        :class:`.CacheKey`, which consists of a tuple representing the
        cache key, as well as a list of :class:`.BindParameter` objects
        which are extracted from the expression.   While two expressions
        that produce identical cache key tuples will themselves generate
        identical SQL strings, the list of :class:`.BindParameter` objects
        indicates the bound values which may have different values in
        each one; these bound parameters must be consulted in order to
        execute the statement with the correct parameters.
 
        a :class:`_expression.ClauseElement` structure that does not implement
        a :meth:`._gen_cache_key` method and does not implement a
        :attr:`.traverse_internals` attribute will not be cacheable; when
        such an element is embedded into a larger structure, this method
        will return None, indicating no cache key is available.
 
        N©rrOr0rEr#)r$rMÚ    _anon_mapÚkeyr(r(r*Ú_generate_cache_keyLs   zHasCacheKey._generate_cache_key)rbr&cCs<g}tƒ}| ||¡}t|kr"dS|dk    s.t‚t||ƒSdSr'rf)rJrbrMrgrhr(r(r*Ú_generate_cache_key_for_objectvs  z*HasCacheKey._generate_cache_key_for_object)r,r-r.Ú__doc__Ú    __slots__r0r:Ú__annotations__Ú_is_has_cache_keyrHr;Ú classmethodrKrZpreload_modulerOrirjr(r(r(r*r!Os
      H{*r!c@s eZdZdS)ÚHasCacheKeyTraverseN)r,r-r.r(r(r(r*rp…srpc@s$eZdZdZejddœdd„ƒZdS)ÚMemoizedHasCacheKeyr(rer=cCs
t |¡Sr'©r!ri©r$r(r(r*riŒsz'MemoizedHasCacheKey._generate_cache_keyN)r,r-r.rlrZmemoized_instancemethodrir(r(r(r*rq‰srqc@seZdZdZddœdd„ZdS)ÚSlotsMemoizedHasCacheKeyr(rer=cCs
t |¡Sr'rrrsr(r(r*Ú$_memoized_method__generate_cache_key”sz=SlotsMemoizedHasCacheKey._memoized_method__generate_cache_keyN)r,r-r.rlrur(r(r(r*rt‘srtc@s¸eZdZUdZded<ded<ddœdd    „Zd
d d d dœdd„Zdddœdd„Zeddd dœdd„ƒZ    dddœdd„Z
dd dœdd„Z d dœdd„Z d dœd!d"„Z dd d d#œd$d%„Zd&S)'r#zˆThe key used to identify a SQL statement construct in the
    SQL compilation cache.
 
    .. seealso::
 
        :ref:`sql_caching`
 
    úTuple[Any, ...]rhzSequence[BindParameter[Any]]rMz Optional[int]r=cCsdS)z7CacheKey itself is not hashable - hash the .key portionNr(rsr(r(r*Ú__hash__©szCacheKey.__hash__zMutableMapping[Any, str]rrÚstr)Ústatement_cacheÚ    statementÚ
parametersr&csn|j|krt|ƒ||j<}n
||j}|jsJt‡fdd„tˆƒDƒƒ}nt‡fdd„|jDƒƒ}t||fƒS)aµGenerate an "offline string" form of this :class:`.CacheKey`
 
        The "offline string" is basically the string SQL for the
        statement plus a repr of the bound parameter values in series.
        Whereas the :class:`.CacheKey` object is dependent on in-memory
        identities in order to work as a cache key, the "offline" version
        is suitable for a cache that will work for other processes as well.
 
        The given ``statement_cache`` is a dictionary-like object where the
        string form of the statement itself will be cached.  This dictionary
        should be in a longer lived scope in order to reduce the time spent
        stringifying statements.
 
 
        c3s|]}ˆ|VqdSr'r(©rQrh©r{r(r*Ú    <genexpr>Èsz-CacheKey.to_offline_string.<locals>.<genexpr>c3s|]}ˆ |j|j¡VqdSr')rArhÚvalue)rQZ    bindparamr}r(r*r~Êsÿ)rhrxrMr\ÚsortedÚrepr)r$ryrzr{Zsql_strZ param_tupler(r}r*Úto_offline_string­s
 
 þzCacheKey.to_offline_stringrrB)Úotherr&cCst|j|jkƒSr')rBrh©r$rƒr(r(r*Ú__eq__ÑszCacheKey.__eq__)ÚleftÚrightr&cCst|gƒ}t|gƒ}| |¡Sr')r#Ú_diff)rJr†r‡Zck1Zck2r(r(r*Ú _diff_tuplesÔs
 
zCacheKey._diff_tuplesz Iterator[str]c cs¾|j}|j}g}d}||}}|D]}||}||}q"tt||ƒƒD]d\}\}    }
||kr\qF|    |
krFt|    tƒrˆt|
tƒrˆ| |¡qqFdd dd„|Dƒ¡||    |
fVqF| d¡}qºqdS)Nrzkey%s[%d]:  %s != %sÚcss|]}d|VqdS)z[%d]Nr()rQr]r(r(r*r~ðsz,CacheKey._whats_different.<locals>.<genexpr>éÿÿÿÿ)rhÚ    enumeraterrWr\ÚappendÚjoinÚpop) r$rƒZk1Zk2ÚstackZ pickup_indexÚs1Ús2ÚidxÚe1Úe2r(r(r*Ú_whats_differentÚs.
 
 
ü
 
zCacheKey._whats_differentcCsd | |¡¡S)Nú, )rŽr–r„r(r(r*rˆùszCacheKey._diffcCs|jg}g}tƒ}d}|rö| d¡}||krL| d|dd¡|d8}qt|tƒr¨|sv| d|ddd¡qô|d7}t|ƒ|g|}| d|dd¡qt|tƒrÎd    t|ƒj    t
t |ƒƒf}nt |ƒ}| d|dd
|d ¡qd d   |¡fS)Nr‹rú rz),rz()ú(z<%s object at %s>z  r—zCacheKey(key=%s)Ú
)rhÚobjectrrrWr\Úlistr!Útyper,ÚhexÚidrrŽ)r$rÚoutputÚsentinelÚindentrRÚrepr_r(r(r*Ú__str__üs.
 
 
 
 
þ zCacheKey.__str__zDict[str, Any]cstƒ‰‡fdd„|jDƒS)zused for testingcsi|]}|jˆ|j“qSr()rhZeffective_value)rQÚb©rgr(r*Ú
<dictcomp>sz1CacheKey._generate_param_dict.<locals>.<dictcomp>)rrMrsr(r¦r*Ú_generate_param_dictszCacheKey._generate_param_dict)Úoriginal_cache_keyÚtarget_elementr&cCs"dd„t|j|jƒDƒ}| |¡S)NcSsi|]\}}|j|j“qSr()rhr)rQÚkÚvr(r(r*r§#sÿz5CacheKey._apply_params_to_element.<locals>.<dictcomp>)ÚziprMÚparams)r$r©rªÚ    translater(r(r*Ú_apply_params_to_element s þz!CacheKey._apply_params_to_elementN)r,r-r.rkrmrwr‚r…ror‰r–rˆr¤r¨r°r(r(r(r*r#˜s
    $r#rvz'Iterable[Tuple[str, InternalTraversal]]z Iterable[Any])ÚtokensÚ traverse_argsÚargsr&c Cs¨g}tƒ}|}t||ƒD]Š\\}}}|j}    |     dd¡}
|dkrL||df7}qtt|
ƒ} | tkrl|||f7}q| ttt    t
fkrŽt d| ›dƒ‚q|| ||d||ƒ7}q|S)z;a quick cache key generator used by reflection.flexi_cache.Zdp_Zvisit_NzHaven't implemented symbol z for ad-hoc key from args) rr­ÚnameÚreplacerCrGr4r5r6r8r7ÚNotImplementedError) r±r²r³rMrgÚtupraÚsymÚargrhZ    visit_keyrcr(r(r*Ú_ad_hoc_cache_key_from_args+s.  
ü
ÿrºc@s¤eZdZeZZejZej    Z
ej Z ej ZeZZZZeZeZeZeZdddddddœdd„Zdddddddœd    d
„Zdddddddœd d „Zdddddddœd d„Zdddddddœdd„Zdddddddœdd„Z dddddddœdd„Z!dddddddœdd„Z"dddddddœdd„Z#dddddddœdd„Z$dddddddœdd„Z%dddddddœdd„Z&dddddddœdd „Z'dddddddœd!d"„Z(dddddddœd#d$„Z)dddddddœd%d&„Z*dddddddœd'd(„Z+dddddddœd)d*„Z,dddddddœd+d,„Z-dddddddœd-d.„Z.dddddddœd/d0„Z/dddddddœd1d2„Z0dddddddœd3d4„Z1dddddddœd5d6„Z2dddddddœd7d8„Z3d9S):r"rxrrrLrv)rarbÚparentrrMr&cCstdd„|DƒƒS)Ncss|]\}}|j|fVqdSr')Ú__code__)rQÚfnZc_keyr(r(r*r~msz@_CacheKeyTraversal.visit_with_context_options.<locals>.<genexpr>©r\©r$rarbr»rrMr(r(r*Úvisit_with_context_optionsesz-_CacheKeyTraversal.visit_with_context_optionscCs|t|ƒ ||¡fSr')rrOr¿r(r(r*Úvisit_inspectableosz$_CacheKeyTraversal.visit_inspectablecCst|ƒSr'r¾r¿r(r(r*Úvisit_string_listysz$_CacheKeyTraversal.visit_string_listcCs|t|tƒr| ||¡n|fSr'©rWr!rOr¿r(r(r*Ú visit_multiƒs
    ÿüz_CacheKeyTraversal.visit_multics|t‡‡fdd„|DƒƒfS)Nc3s(|] }t|tƒr| ˆˆ¡n|VqdSr'rÃrPrSr(r*r~œsþÿz6_CacheKeyTraversal.visit_multi_list.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_multi_list’s
    üþz#_CacheKeyTraversal.visit_multi_listcs$|sdS|t‡‡fdd„|DƒƒfS)Nr(c3s&|]}t‡‡fdd„|DƒƒVqdS)c3s|]}| ˆˆ¡VqdSr'rNrPrSr(r*r~±sÿzJ_CacheKeyTraversal.visit_has_cache_key_tuples.<locals>.<genexpr>.<genexpr>Nr¾)rQZtup_elemrSr(r*r~°süþz@_CacheKeyTraversal.visit_has_cache_key_tuples.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_has_cache_key_tuples¤sûþz-_CacheKeyTraversal.visit_has_cache_key_tuplescs$|sdS|t‡‡fdd„|DƒƒfS)Nr(c3s|]}| ˆˆ¡VqdSr'rNrPrSr(r*r~Åsz>_CacheKeyTraversal.visit_has_cache_key_list.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_has_cache_key_list¹s
þz+_CacheKeyTraversal.visit_has_cache_key_listcs$|sdS|t‡‡fdd„|DƒƒfS)Nr(c3s |]}|jr| ˆˆ¡VqdSr')rnrOrPrSr(r*r~Ôsþz>_CacheKeyTraversal.visit_executable_options.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_executable_optionsÈsþþz+_CacheKeyTraversal.visit_executable_optionscCs| |dd„|Dƒ|||¡S)NcSsg|] }t|ƒ‘qSr(r)rQÚor(r(r*rTäsz=_CacheKeyTraversal.visit_inspectable_list.<locals>.<listcomp>)rÇr¿r(r(r*Úvisit_inspectable_listÛs ÿz)_CacheKeyTraversal.visit_inspectable_listcCs| |||||¡Sr')rÆr¿r(r(r*Úvisit_clauseelement_tuplesçsÿz-_CacheKeyTraversal.visit_clauseelement_tuplescs$|sdS|t‡‡fdd„|DƒƒfS)Nr(csg|]}| ˆˆ¡‘qSr(rNrPrSr(r*rTÿszC_CacheKeyTraversal.visit_fromclause_ordered_set.<locals>.<listcomp>r¾r¿r(rSr*Úvisit_fromclause_ordered_setós
þz/_CacheKeyTraversal.visit_fromclause_ordered_setcs,|sdS‡‡fdd„|Dƒ}|tt|ƒƒfS)Nr(csg|]}| ˆˆ¡‘qSr(rNrPrSr(r*rT szH_CacheKeyTraversal.visit_clauseelement_unordered_set.<locals>.<listcomp>©r\r€)r$rarbr»rrMZ
cache_keysr(rSr*Ú!visit_clauseelement_unordered_sets ÿÿþz4_CacheKeyTraversal.visit_clauseelement_unordered_setcCs
||jfSr')r´r¿r(r(r*Úvisit_named_ddl_elementsz*_CacheKeyTraversal.visit_named_ddl_elementcs$|sdS|t‡‡fdd„|DƒƒfS)Nr(cs g|]\}}| ˆˆ¡|f‘qSr(rN)rQÚclauseÚstrvalrSr(r*rT.sÿz<_CacheKeyTraversal.visit_prefix_sequence.<locals>.<listcomp>r¾r¿r(rSr*Úvisit_prefix_sequence s þÿþz(_CacheKeyTraversal.visit_prefix_sequencecst‡‡fdd„|DƒƒS)Nc3sh|]`\}}}‰| ˆˆ¡|dk    r,| ˆˆ¡nd|dk    rB| ˆˆ¡ndt‡fdd„tˆƒDƒƒfVqdS)Ncsg|]}|ˆ|f‘qSr(r(r|©Úflagsr(r*rTFszG_CacheKeyTraversal.visit_setup_join_tuple.<locals>.<genexpr>.<listcomp>)rOr\r€)rQÚtargetZonclauseÚfrom_rSrÓr*r~=s
÷
ÿÿøz<_CacheKeyTraversal.visit_setup_join_tuple.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_setup_join_tuple5s õz)_CacheKeyTraversal.visit_setup_join_tuplecs(|sdS|t‡‡fdd„| ¡DƒƒfS)Nr(cs&g|]\\}}}| ˆˆ¡||f‘qSr(rN)rQrÐÚ dialect_nameÚtextrSr(r*rTYs
 
ü
ýz<_CacheKeyTraversal.visit_table_hint_list.<locals>.<listcomp>)r\Úitemsr¿r(rSr*Úvisit_table_hint_listKs úÿþz(_CacheKeyTraversal.visit_table_hint_listcs|t‡fdd„tˆƒDƒƒfS)Ncsg|]}|ˆ|f‘qSr(r(r|©rbr(r*rTlsz7_CacheKeyTraversal.visit_plain_dict.<locals>.<listcomp>rÍr¿r(rÜr*Úvisit_plain_dictdsz#_CacheKeyTraversal.visit_plain_dictcs|t‡fdd„tˆƒDƒƒfS)Nc3s2|]*‰ˆt‡‡fdd„tˆˆƒDƒƒfVqdS)csg|]}|ˆˆ|f‘qSr(r(r|)rØrbr(r*rT|sÿzF_CacheKeyTraversal.visit_dialect_options.<locals>.<genexpr>.<listcomp>NrÍ)rQrÜ)rØr*r~xs
ø 
þÿþz;_CacheKeyTraversal.visit_dialect_options.<locals>.<genexpr>rÍr¿r(rÜr*Úvisit_dialect_optionsns
    
öþz(_CacheKeyTraversal.visit_dialect_optionscs"|t‡‡‡fdd„tˆƒDƒƒfS)Nc3s"|]}|ˆ| ˆˆ¡fVqdSr'rNr|©rrMrbr(r*r~sÿzE_CacheKeyTraversal.visit_string_clauseelement_dict.<locals>.<genexpr>rÍr¿r(rßr*Úvisit_string_clauseelement_dict†s
    þþz2_CacheKeyTraversal.visit_string_clauseelement_dictcs.|t‡‡fdd„‡fdd„tˆƒDƒDƒƒfS)Nc3s0|](\}}|t|tƒr"| ˆˆ¡n|fVqdSr'rérQrhrrSr(r*r~ s ûÿüz=_CacheKeyTraversal.visit_string_multi_dict.<locals>.<genexpr>csg|]}|ˆ|f‘qSr(r(r|rÜr(r*rT§sz>_CacheKeyTraversal.visit_string_multi_dict.<locals>.<listcomp>rÍr¿r(rßr*Úvisit_string_multi_dict–s
    ùþz*_CacheKeyTraversal.visit_string_multi_dictcs|t‡‡fdd„|jDƒƒfS)Nc3s |]\}}}| ˆˆ¡VqdSr'rN)rQr«ÚcolÚ_rSr(r*r~¶sÿzR_CacheKeyTraversal.visit_fromclause_canonical_column_collection.<locals>.<genexpr>)r\Z _collectionr¿r(rSr*Ú,visit_fromclause_canonical_column_collection«s
 
þþz?_CacheKeyTraversal.visit_fromclause_canonical_column_collectioncCs d|t<dS©NTr(©r0r¿r(r(r*Úvisit_unknown_structure¼sz*_CacheKeyTraversal.visit_unknown_structurecs|t‡‡fdd„|DƒƒfS)Nc3s8|]0\}}t|dƒr | ˆˆ¡n|| ˆˆ¡fVqdS©Z__clause_element__N©ÚhasattrrOrárSr(r*r~Ñs üÿ
üz>_CacheKeyTraversal.visit_dml_ordered_values.<locals>.<genexpr>r¾r¿r(rSr*Úvisit_dml_ordered_valuesÇs
    ùþz+_CacheKeyTraversal.visit_dml_ordered_valuescs|t‡‡‡fdd„ˆDƒƒfS)Nc3s8|]0}t|dƒr| ˆˆ¡n|ˆ| ˆˆ¡fVqdSrérê)rQr«rßr(r*r~ès üÿüz6_CacheKeyTraversal.visit_dml_values.<locals>.<genexpr>r¾r¿r(rßr*Úvisit_dml_valuesÜs
ùþz#_CacheKeyTraversal.visit_dml_valuescCs d|t<dSrærçr¿r(r(r*Úvisit_dml_multi_valuesós    z)_CacheKeyTraversal.visit_dml_multi_valuesN)4r,r-r.r5Zvisit_has_cache_keyZvisit_clauseelementrrYZvisit_clauseelement_listrXZvisit_annotations_keyrZZvisit_clauseelement_tupler[Zvisit_memoized_select_entitiesr4Z visit_stringZ visit_booleanZvisit_operatorZvisit_plain_objZvisit_statement_hint_listr6Z
visit_typer8Zvisit_anon_namer7Zvisit_propagate_attrsrÀrÁrÂrÄrÅrÆrÇrÈrÊrËrÌrÎrÏrÒr×rÛrÝrÞràrârårèrìrírîr(r(r(r*r"PsRÿþÿ
 
 
 
 
 r");Ú
__future__rÚenumÚ    itertoolsrÚtypingrrrrrr    r
r r r rZvisitorsrrrrrrŠrZ
inspectionrrZ util.typingrrÚ TYPE_CHECKINGrdrrrZengine.interfacesrr ÚEnumr/r0r9r1r\r4r5r6r7r8r!rprqZ MemoizedSlotsrtr#rºr"rGr(r(r(r*Ú<module>sr                           ÿú8%3