Ë
    V.jOC  ã                  óœ  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl!m#Z# er`ddl$m%Z% ddl$m&Z& ddl$m'Z' ddl(m)Z) dd l(m*Z* dd!lm+Z+ dd"lm,Z, dd#l-m.Z. dd$l/m0Z0 dd%lm1Z1 dd&lm2Z2 dd'lm3Z3 dd(l4m5Z5 dd)l6m7Z7 dd*l8m9Z9 dd+l:m;Z; d,d-gZ< ed.e¬/«      Z=e>Z? G d0„ d1e"«      Z@ G d2„ d3e"«      ZA G d4„ d-ee=   «      ZB G d5„ d,e «      ZC G d6„ d7e«      ZD	 	 	 	 d:d8„ZEy9);aË  Horizontal sharding support.

Defines a rudimental 'horizontal sharding' system which allows a Session to
distribute queries and persistence operations across multiple databases.

For a usage example, see the :ref:`examples_sharding` example included in
the source distribution.

.. deepalchemy:: The horizontal sharding extension is an advanced feature,
   involving a complex statement -> database interaction as well as
   use of semi-public APIs for non-trivial cases.   Simpler approaches to
   refering to multiple database "shards", most commonly using a distinct
   :class:`_orm.Session` per "shard", should always be considered first
   before using this more complex and less-production-tested system.



é    )Úannotations)ÚAny)ÚCallable)ÚDict)ÚIterable)ÚOptional)ÚTuple)ÚType)ÚTYPE_CHECKING)ÚTypeVar)ÚUnioné   )Úevent)Úexc)Úinspect)Úutil)ÚPassiveFlag)ÚOrmExecuteOptionsParameter)Ú	ORMOption)ÚMapper)ÚQuery)Ú_BindArguments)Ú_PKIdentityArgument)ÚSession)ÚProtocol)ÚSelf)Ú
Connection)ÚEngine)ÚOptionEngine)ÚIteratorResult)ÚResult)ÚLoaderCallableStatus)Ú_O)ÚBulkUDCompileState)ÚQueryContext)Ú_EntityBindKey)Ú_SessionBind)ÚORMExecuteState)ÚInstanceState)Ú
Executable)Ú_TP)ÚClauseElementÚShardedSessionÚShardedQueryÚ_T)Úboundc                  ó$   — e Zd Z	 	 	 	 	 	 	 	 dd„Zy)ÚShardChooserc                 ó   — y ©N© )ÚselfÚmapperÚinstanceÚclauses       úaC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\sqlalchemy/ext/horizontal_shard.pyÚ__call__zShardChooser.__call__Q   s   € ð
 ó    N)r7   úOptional[Mapper[_T]]r8   r   r9   úOptional[ClauseElement]Úreturnr   ©Ú__name__Ú
__module__Ú__qualname__r;   r5   r<   r:   r2   r2   P   s-   „ ðà$ðð ðð (ð	ð
 
ôr<   r2   c                  ó0   — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚIdentityChooserc                ó   — y r4   r5   )r6   r7   Úprimary_keyÚlazy_loaded_fromÚexecution_optionsÚbind_argumentsÚkws          r:   r;   zIdentityChooser.__call__Z   s   € ð r<   N©r7   z
Mapper[_T]rG   r   rH   úOptional[InstanceState[Any]]rI   r   rJ   r   rK   r   r?   r   r@   r5   r<   r:   rE   rE   Y   sK   „ ð	àð	ð )ð	ð
 7ð	ð 6ð	ð 'ð	ð ð	ð 
ô	r<   rE   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )r.   a  Query class used with :class:`.ShardedSession`.

    .. legacy:: The :class:`.ShardedQuery` is a subclass of the legacy
       :class:`.Query` class.   The :class:`.ShardedSession` now supports
       2.0 style execution via the :meth:`.ShardedSession.execute` method.

    c                óÖ   •— t        ‰| �  |i |¤Ž t        | j                  t        «      sJ ‚| j                  j
                  | _        | j                  j                  | _        d | _        y r4   )ÚsuperÚ__init__Ú
isinstanceÚsessionr-   Úidentity_chooserÚexecute_chooserÚ	_shard_id)r6   ÚargsÚkwargsÚ	__class__s      €r:   rQ   zShardedQuery.__init__o   sT   ø€ Ü‰Ñ˜$Ð) &Ò)Ü˜$Ÿ,™,¬Ô7Ð7Ð7à $§¡× =Ñ =ˆÔØ#Ÿ|™|×;Ñ;ˆÔØˆ�r<   c                ó&   — | j                  |¬«      S )aÃ  Return a new query, limited to a single shard ID.

        All subsequent operations with the returned query will
        be against the single shard regardless of other state.

        The shard_id can be passed for a 2.0 style execution to the
        bind_arguments dictionary of :meth:`.Session.execute`::

            results = session.execute(
                stmt,
                bind_arguments={"shard_id": "my_shard"}
            )

        )Ú_sa_shard_id)rI   )r6   Úshard_ids     r:   Ú	set_shardzShardedQuery.set_shardw   s   € ð ×%Ñ%°8Ð%Ó<Ð<r<   )rW   r   rX   r   r?   ÚNone)r\   ÚShardIdentifierr?   r   )rA   rB   rC   Ú__doc__rQ   r]   Ú__classcell__©rY   s   @r:   r.   r.   f   s   ø„ ñõ÷=r<   c                  óP  ‡ — e Zd ZU ded<   ded<   ded<   dddefdddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd	„Zdej                  dej                  df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd
„Z
	 	 	 	 	 	 	 	 dd„Z	 	 	 d	 	 	 	 	 	 	 	 	 dd„Z	 dddddœ	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zˆ xZS )r-   r2   Úshard_chooserrE   rT   z*Callable[[ORMExecuteState], Iterable[Any]]rU   N)Ú
id_chooserÚquery_chooserc               ó(  •‡ ‡‡— t        ‰‰ �  dd|i|¤Ž t        j                  ‰ dt        d¬«       |‰ _        |r5|Št        j                  dd«       	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆˆ fd„}	|	‰ _        n|r|‰ _        nt        j                  d«      ‚|r=|Št        j                  d	d
«       |rt        j                  d«      ‚	 	 	 	 dˆfd„}
|€|
}|€t        j                  d«      ‚|‰ _        i ‰ _        |�|D ]  }‰ j                  |||   «       Œ yy)aî  Construct a ShardedSession.

        :param shard_chooser: A callable which, passed a Mapper, a mapped
          instance, and possibly a SQL clause, returns a shard ID.  This id
          may be based off of the attributes present within the object, or on
          some round-robin scheme. If the scheme is based on a selection, it
          should set whatever state on the instance to mark it in the future as
          participating in that shard.

        :param identity_chooser: A callable, passed a Mapper and primary key
         argument, which should return a list of shard ids where this
         primary key might reside.

          .. versionchanged:: 2.0  The ``identity_chooser`` parameter
             supersedes the ``id_chooser`` parameter.

        :param execute_chooser: For a given :class:`.ORMExecuteState`,
          returns the list of shard_ids
          where the query should be issued.  Results from all shards returned
          will be combined together into a single listing.

          .. versionchanged:: 1.4  The ``execute_chooser`` parameter
             supersedes the ``query_chooser`` parameter.

        :param shards: A dictionary of string shard names
          to :class:`~sqlalchemy.engine.Engine` objects.

        Ú	query_clsÚdo_orm_executeT)ÚretvalzLThe ``id_chooser`` parameter is deprecated; please use ``identity_chooser``.z2.0c               ó^   •— ‰j                  | «      }|r|j                  |«      } ‰||«      S r4   )ÚqueryÚ_set_lazyload_from)	r7   rG   rH   rI   rJ   rK   ÚqÚ_id_chooserr6   s	          €€r:   Ú_legacy_identity_chooserz9ShardedSession.__init__.<locals>._legacy_identity_chooserÉ   s4   ø€ ð —J‘J˜vÓ&�Ù#Ø×,Ñ,Ð-=Ó>�AÙ" 1 kÓ2Ð2r<   z*identity_chooser or id_chooser is requiredzNThe ``query_chooser`` parameter is deprecated; please use ``execute_chooser``.z1.4z>Can't pass query_chooser and execute_chooser at the same time.c                ó(   •—  ‰| j                   «      S r4   )Ú	statement)Úorm_contextÚ_query_choosers    €r:   Ú_default_execute_chooserz9ShardedSession.__init__.<locals>._default_execute_chooserì   s   ø€ ñ & k×&;Ñ&;Ó<Ð<r<   Nz,execute_chooser or query_chooser is requiredr5   rL   )rs   r(   r?   zIterable[Any])rP   rQ   r   ÚlistenÚexecute_and_instancesrd   r   Úwarn_deprecatedrT   r   ÚArgumentErrorrU   Ú_ShardedSession__shardsÚ
bind_shard)r6   rd   rT   rU   Úshardsrh   re   rf   rX   rp   ru   Úkro   rt   rY   s   `           @@€r:   rQ   zShardedSession.__init__Ž   s  û€ ôX 	‰ÑÑ7 9Ð7°Ò7ä�‰ØÐ"Ô$9À$õ	
ð +ˆÔáØ$ˆKÜ× Ñ ð3àôð3Ø"ð3à0ð3ð #?ð	3ð
 $>ð3ð !/ð3ð ð3ð ö3ð %=ˆDÕ!ÙØ$4ˆDÕ!ä×#Ñ#Ø<óð ñ Ø*ˆNÜ× Ñ ð2àôñ
 Ü×'Ñ'ð(óð ð
=Ø,ð=àõ=ð
 Ð&Ø":�àÐ"Ü×#Ñ#Ø>óð ð  /ˆÔØ=?ˆŒØÐÛ�Ø—‘  6¨!¡9Õ-ñ ð r<   c           	     ó¸   •— |�t        ‰| �  ||fd|i|¤Ž}	|	S | j                  |||||rt        |«      ni ¬«      D ]  }
t        ‰| �  ||f|
|dœ|¤Ž}|€Œ|c S  y)a_  override the default :meth:`.Session._identity_lookup` method so
        that we search for a given non-token primary key identity across all
        possible identity tokens (e.g. shard ids).

        .. versionchanged:: 1.4  Moved :meth:`.Session._identity_lookup` from
           the :class:`_query.Query` object to the :class:`.Session`.

        NÚidentity_token)rH   rI   rJ   )r   rH   )rP   Ú_identity_lookuprT   Údict)r6   r7   Úprimary_key_identityr   ÚpassiverH   rI   rJ   rK   Úobjr\   Úobj2rY   s               €r:   r€   zShardedSession._identity_lookupþ   s­   ø€ ð( Ð%Ü‘'Ñ*ØØ$ñð  .ðð ñ	ˆCð ˆJà ×1Ñ1ØØ$Ø!1Ø"3Ù7Eœt NÔ3È2ð 2ö �ô ‘wÑ/ØØ(ðð $,Ø%5ñ	ð
 ñ�ð Ñ#Ø’Kðð" r<   c                óð   — |�Dt        |«      }|j                  r|j                  d   }|€J ‚|S |j                  r|j                  S t        |t        «      sJ ‚ | j
                  ||fi |¤Ž}|�|_        |S )Nr   )r   Úkeyr   rR   r   rd   )r6   r7   r8   rK   ÚstateÚtokenr\   s          r:   Ú_choose_shard_and_assignz'ShardedSession._choose_shard_and_assign/  sŠ   € ð ÐÜ˜HÓ%ˆEØ�yŠyØŸ	™	 !™�ØÐ(Ð(Ð(Ø�Ø×%Ò%Ø×+Ñ+Ð+ä˜&¤&Ô)Ð)Ð)Ø%�4×%Ñ% f¨hÑ=¸"Ñ=ˆØÐØ#+ˆEÔ Øˆr<   c                ó,  — |€| j                  ||«      }| j                  «       r'| j                  «       }|€J ‚|j                  ||¬«      S | j	                  |||¬«      }t        |t        «      r |j                  di |¤ŽS t        |t        «      sJ ‚|S )zaProvide a :class:`_engine.Connection` to use in the unit of work
        flush process.

        )r\   )r7   r\   r8   r5   )	rŠ   Úin_transactionÚget_transactionÚ
connectionÚget_bindrR   r   Úconnectr   )r6   r7   r8   r\   rK   ÚtransÚbinds          r:   Úconnection_callablez"ShardedSession.connection_callableD  s§   € ð ÐØ×4Ñ4°V¸XÓFˆHà×ÑÔ Ø×(Ñ(Ó*ˆEØÐ$Ð$Ð$Ø×#Ñ# F°XÐ#Ó>Ð>à—=‘=Ø¨¸8ð !ó ˆDô ˜$¤Ô'Ø#�t—|‘|Ñ) bÑ)Ð)ä! $¬
Ô3Ð3Ð3Ø�r<   )r\   r8   r9   c               óT   — |€| j                  |||¬«      }|€J ‚| j                  |   S )N)r8   r9   )rŠ   rz   )r6   r7   r\   r8   r9   rK   s         r:   r�   zShardedSession.get_bindb  sC   € ð ÐØ×4Ñ4Ø °&ð 5ó ˆHð Ð'Ð'Ð'Ø�}‰}˜XÑ&Ð&r<   c                ó"   — || j                   |<   y r4   )rz   )r6   r\   r’   s      r:   r{   zShardedSession.bind_shardr  s   € ð #'ˆ�‰�hÒr<   )rd   r2   rT   zOptional[IdentityChooser]rU   z4Optional[Callable[[ORMExecuteState], Iterable[Any]]]r|   zOptional[Dict[str, Any]]rh   zType[Query[_T]]re   z<Optional[Callable[[Query[_T], Iterable[_T]], Iterable[Any]]]rf   z/Optional[Callable[[Executable], Iterable[Any]]]rX   r   r?   r^   )r7   z
Mapper[_O]r‚   zUnion[Any, Tuple[Any, ...]]r   úOptional[Any]rƒ   r   rH   rM   rI   r   rJ   zOptional[_BindArguments]rK   r   r?   z)Union[Optional[_O], LoaderCallableStatus])r7   úOptional[_EntityBindKey[_O]]r8   r   rK   r   r?   r   )NNN)
r7   r=   r8   r–   r\   úOptional[ShardIdentifier]rK   r   r?   r   r4   )r7   r—   r\   r˜   r8   r–   r9   r>   rK   r   r?   r'   )r\   r_   r’   zUnion[Engine, OptionEngine]r?   r^   )rA   rB   rC   Ú__annotations__r.   rQ   r   ÚPASSIVE_OFFr   Ú
EMPTY_DICTr€   rŠ   r“   r�   r{   ra   rb   s   @r:   r-   r-   ‰   sò  ø… ØÓØ%Ó%Ø?Ó?ð
 7;ð Ø+/Ø%1ðn.ð ØIMñn.à#ðn.ð 4ðn.ð
ð	n.ð )ðn.ð #ðn.ð
ðn.ð Gðn.ð ðn.ð 
õn.ðh )-Ø*×6Ñ6Ø9=Ø8<¿¹Ø37ð/àð/ð :ð/ð &ð	/ð
 ð/ð 7ð/ð 6ð/ð 1ð/ð ð/ð 
3õ/ðbà,ðð ðð ð	ð
 
óð. (,Ø"&Ø.2ð	à$ðð  ðð ,ð	ð
 ðð 
óð@ 04ð'ð /3Ø"&Ø*.ñ'à,ð'ð ,ð	'ð
  ð'ð (ð'ð ð'ð 
ó'ð 'Ø'ð'Ø/Jð'à	÷'r<   c                  ó&   — e Zd ZdZdZ	 d	 	 	 dd„Zy)Úset_shard_ida  a loader option for statements to apply a specific shard id to the
    primary query as well as for additional relationship and column
    loaders.

    The :class:`_horizontal.set_shard_id` option may be applied using
    the :meth:`_sql.Executable.options` method of any executable statement::

        stmt = (
            select(MyObject).
            where(MyObject.name == 'some name').
            options(set_shard_id("shard1"))
        )

    Above, the statement when invoked will limit to the "shard1" shard
    identifier for the primary query as well as for all relationship and
    column loading strategies, including eager loaders such as
    :func:`_orm.selectinload`, deferred column loaders like :func:`_orm.defer`,
    and the lazy relationship loader :func:`_orm.lazyload`.

    In this way, the :class:`_horizontal.set_shard_id` option has much wider
    scope than using the "shard_id" argument within the
    :paramref:`_orm.Session.execute.bind_arguments` dictionary.


    .. versionadded:: 2.0.0

    ©r\   Úpropagate_to_loadersc                ó    — || _         || _        y)aH  Construct a :class:`_horizontal.set_shard_id` option.

        :param shard_id: shard identifier
        :param propagate_to_loaders: if left at its default of ``True``, the
         shard option will take place for lazy loaders such as
         :func:`_orm.lazyload` and :func:`_orm.defer`; if False, the option
         will not be propagated to loaded objects. Note that :func:`_orm.defer`
         always limits to the shard_id of the parent row in any case, so the
         parameter only has a net effect on the behavior of the
         :func:`_orm.lazyload` strategy.

        Nrž   )r6   r\   rŸ   s      r:   rQ   zset_shard_id.__init__—  s   € ð !ˆŒØ$8ˆÕ!r<   N)T)r\   r_   rŸ   Úbool)rA   rB   rC   r`   Ú	__slots__rQ   r5   r<   r:   r�   r�   x  s*   „ ñð8 5€Ið GKð9Ø'ð9Ø?Cô9r<   r�   c                ó„  ‡ — ‰ j                   r‰ j                  }n'‰ j                  s‰ j                  r‰ j                  }nd }‰ j
                  }t        |t        «      sJ ‚	 	 	 	 dˆ fd„}‰ j                  D ]   }t        |t        «      sŒ|j                  } nZ |r|j                  �|j                  }n>d‰ j                  v r‰ j                  d   }n d‰ j                  v r‰ j                  d   }nd }|� ||«      S g }|j                  ‰ «      D ]  } ||«      }|j                  |«       Œ  |d   j                   |dd  Ž S )Nr\   c                ó€   •— t        ‰j                  «      }| |d<   ‰j                  | ¬«       ‰j                  |¬«      S )Nr\   )r   )rJ   )r�   rJ   Úupdate_execution_optionsÚinvoke_statement)r\   rJ   rs   s     €r:   Úiter_for_shardz-execute_and_instances.<locals>.iter_for_shardÀ  sD   ø€ ô ˜k×8Ñ8Ó9ˆØ%-ˆ�zÑ"à×,Ñ,¸HÐ,ÔEØ×+Ñ+¸>Ð+ÓJÐJr<   r[   r   é   )r\   r_   r?   ú&Union[Result[_T], IteratorResult[_TP]])Ú	is_selectÚload_optionsÚ	is_updateÚ	is_deleteÚupdate_delete_optionsrS   rR   r-   Ú_non_compile_orm_optionsr�   r\   Ú_identity_tokenrI   rJ   rU   ÚappendÚmerge)rs   Úactive_optionsrS   r§   Úorm_optr\   ÚpartialÚresult_s   `       r:   rw   rw   ª  sU  ø€ ð ×ÒØ$×1Ñ1‰à	×	Ò	 +×"7Ò"7Ø$×:Ñ:‰àˆà×!Ñ!€GÜ�gœ~Ô.Ð.Ð.ðKØ!ðKà	/õKð ×7Ô7ˆô �gœ|Õ,Ø×'Ñ'ˆHÙð 8ñ ˜n×<Ñ<ÐHØ%×5Ñ5‰HØ˜{×<Ñ<Ñ<Ø"×4Ñ4°^ÑD‰HØ˜;×5Ñ5Ñ5Ø"×1Ñ1°*Ñ=‰HàˆHàÐÙ˜hÓ'Ð'àˆØ×/Ñ/°Ö<ˆHÙ$ XÓ.ˆGØ�N‰N˜7Õ#ð =ð  ˆw�q‰z×Ñ ¨¨ Ð-Ð-r<   N)rs   r(   r?   r©   )Fr`   Ú
__future__r   Útypingr   r   r   r   r   r	   r
   r   r   r   Ú r   r   r   r   Úormr   Úorm._typingr   Úorm.interfacesr   Ú
orm.mapperr   Ú	orm.queryr   Úorm.sessionr   r   r   Úutil.typingr   r   Úengine.baser   r   r   Úengine.resultr    r!   r"   r#   Úorm.bulk_persistencer$   Úorm.contextr%   r&   r'   r(   Ú	orm.stater)   Úsqlr*   Úsql._typingr+   Úsql.elementsr,   Ú__all__r/   Ústrr_   r2   rE   r.   r-   r�   rw   r5   r<   r:   Ú<module>rË      s  ðñõ$ #å Ý Ý Ý Ý Ý Ý Ý  Ý Ý å Ý Ý Ý Ý Ý 4Ý &Ý Ý Ý (Ý -Ý !Ý "Ý áÝ(Ý$Ý*Ý.Ý&Ý*Ý Ý9Ý*Ý,Ý*Ý-Ý)Ý Ý!Ý,à˜^Ð
,€áˆT˜Ô€ð €ô�8ô ô
�hô 
ô =�5˜‘9ô  =ôFl'�Wô l'ô^/9�9ô /9ðd7.Ø ð7.à+ô7.r<   