L iX&ndZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z d dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZddlmZddl m!Z!e r0d dlm"Z"d dl#m$Z$d dlm%Z%d dlm&Z&d dl'm(Z(d d lm)Z)dd!l*m+Z+dd"l,m-Z-e d#e$Z.Gd%d&ee.Z/Gd'd(eZ0ejbjed)*Gd+d,eZ3Gd-d.ee.Z4Gd/d0e4e.ee.Z5d3d1Z6y2)4zDynamic collection API. Dynamic collections act like Query() objects for read operations and support basic add/delete mutation. .. legacy:: the "dynamic" loader is a legacy feature, superseded by the "write_only" loader. ) annotations)Any)Iterable)Iterator)List)Optional)Tuple)Type) TYPE_CHECKING)TypeVar)Union) attributes)exc) relationships)util) PassiveFlag)Query)object_session)AbstractCollectionWriter)WriteOnlyAttributeImpl)WriteOnlyHistory)WriteOnlyLoader)result)QueryableAttribute)Mapper)_RelationshipOrderByArg)Session) InstanceState) AliasedClass) _Dispatch) ColumnElement_T)boundc*eZdZ d ddZy)DynamicCollectionHistoryNcj|r_t||jd}tj||_|j |_|j |_d|_ytj|_tj|_tj|_d|_y)NFT) AppenderQuery autoflushrOrderedIdentitySetunchanged_items added_items deleted_items_reconcile_collection)selfattrstatepassiveapply_tocolls \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sqlalchemy/orm/dynamic.py__init__z!DynamicCollectionHistory.__init__>s  u-77>D#'#:#:4#@D '33D !)!7!7D )-D &!%!8!8!:D #668D #'#:#:#r?r@_supports_dynamic_iterationr'rcollection_history_cls__annotations__r7rAr8r6r:r:Rsq"&5c:)):>=3==5 = " = * =7== =r8r:dynamic)lazyceZdZeZy) DynaLoaderN)r>r?r@r: impl_classrAr8r6rWrWos%Jr8rWceZdZUdZdZded<ded< dfd ZeddZejdd Zdd Z e rdd Z dd Z dd Z d ddZddZddZddZddZddZxZS)rIzTA mixin that expects to be mixing in a Query class with AbstractAppender. NzOptional[Type[Query[_T]]]rCzTuple[ColumnElement[Any], ...]_order_by_clauseschtj||jdt|||yr9)rr7rFsuper)r0r1r2 __class__s r6r7zAppenderMixin.__init__~s1       u%r8ct|j}|*|jr|j|vr|jt j |jsy|Sr9)rinstancer*flushorm_util has_identityr0sesss r6sessionzAppenderMixin.sessionsJdmm,  4==D3H JJL$$T]]3Kr8c||_yr9)rd)r0res r6rezAppenderMixin.sessions  r8c j|j}|tj|j}|jr+t j dtj|ztjtj|jjjgt|jj!tj|jt"j$j&dj)S|j+|j-S)NzInstance %s is detached, dynamic relationship cannot return a correct result. This warning will become a DetachedInstanceError in a future release.T)_source_supports_scalars)rerinstance_stater_detachedrwarnra state_strrIteratorResultSimpleResultMetaDatar1rLr>iter_get_collection_historyrPASSIVE_NO_INITIALIZEr-scalars _generate_iter)r0rdr2s r6rtzAppenderMixin._iters|| <--dmm>$'--/ /r8cyr9rA)r0s r6__iter__zAppenderMixin.__iter__sr8c |j}|V|jjtj|j t jj|S|j|j|Sr9) rer1rprrir_rrqindexedrs __getitem__)r0indexrds r6ryzAppenderMixin.__getitem__si|| <9944))$--811gen  >>$'33E: :r8c|j}|Zt|jjt j |j tjjS|j|jSr9) relenr1rprrir_rrqr-rscountrcs r6r}zAppenderMixin.countsk|| < 11--dmm<55+  >>$'--/ /r8c|j}|Pt|}|Ctjdt j |d|j jd|jr(|j|j j|}n%|j|j j}|j|_ |j|_ |j|_ |S)NzParent instance zh is not bound to a Session, and no contextual session is established; lazy load operation of attribute 'z' cannot proceed)re)r_rorm_excDetachedInstanceErrorra instance_strr1rMrCrFquery_where_criteria _from_objrZ)r0rdr_rs r6rszAppenderMixin._generates== <!(+D|33 ,,X6 G   $$TYY%<%r?r@__doc__rCrSr7propertyresetterrtr rvryr}rsrrrrr __classcell__)r]s@r6rIrIts .2K*155&(&1B& & ^^02/; 0#' : % #%# r8rIceZdZdZy)r)zA dynamic query that supports basic collection storage operations. Methods on :class:`.AppenderQuery` include all methods of :class:`_orm.Query`, plus additional methods used for collection persistence. N)r>r?r@rrAr8r6r)r)sr8r)cJd|jz}t|t|fd|iS)zAReturn a new class with AppenderQuery functionality layered over.AppenderrC)r>typerI)clsnames r6rKrK)s)  $D }c*]C,@ AAr8N)rrr<ztype[AppenderMixin[Any]])7r __future__rtypingrrrrrr r r r r rrrrrrabaserrrrer writeonlyrrrrenginerrmapperrrrr2r r!eventr" sql.elementsr#r$r'r:RelationshipProperty strategy_forrWrIr)rKrAr8r6rs # #/-'&$6 $"!, T//3/*=1=:##00i0@&&A&g ,R0g TM"%uRyBr8