ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@sdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZd_e!ej"e#fd_dZ$e!d_d Z%e!d_d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,d(Z-d)Z.d*Z/d+Z0d,Z1i1e'fd-6e'fd.6e,fd/6e&fd06e&fd16e&fd26e&fd36e&fd46e&fd56e%fd66e&fd76e&fd86e&fd96e(ej2fd:6e(ej3fd;6e$ej4fd<6e$ej5fd=6e$ej6fd>6e$ej7fd?6e$ej8fd@6e$ej9fdA6e$ej:fdB6e$ej;fdC6e$ej<fdD6e$ej=fdE6e$ej>fdF6e$ej?fdG6e$ej@fdH6e$ejAfdI6e$ejBfdJ6e(ejCfdK6e(ejDfdL6e(ejEfdM6e(ejFfdN6e)ejGfdO6e)ejHfdP6e$ejIfdQ6e$ejJfdR6e1fdS6e.fdT6e.fdU6e/fdV6e0fdW6e0fdX6e-fdY6e*fdZ6e+fd[6e+fd\6e+fd]6ZKd_d^ZLd_S(`s5Default implementation of SQL comparison operations. i(t operators(ttype_api(t_clause_element_as_expr(t _const_expr(t _is_literal(t_literal_as_text(tand_(tBinaryExpression(t BindParameter(t ClauseElement(t ClauseList(tcollate(tCollectionAggregate(t ColumnElement(tFalse_(tNull(tor_(t TextClause(tTrue_(tTuple(tUnaryExpression(t Visitable(tAlias(t ScalarSelect(t Selectable(t SelectBasei(texc(tutilc Ks|dkrtj}nt||tttfr^|tjtj fkrt|t ttfrt |t ||d|d|d|S|tj tjfkrt |t ||d|d|d|S|tjtjfkr t |t|tjdtjd|S|tj tjfkrLt |t|tjdtjd|Stjdnt|||}|rt |||d|d|d|St |||d|d|d|SdS(Nttype_tnegatet modifierss|Only '=', '!=', 'is_()', 'isnot()', 'is_distinct_from()', 'isnot_distinct_from()' operators can be used with None/True/False(tNoneRt BOOLEANTYPEt isinstanceRRRRteqtnetboolRRtis_distinct_fromtisnot_distinct_fromtis_RtisnotRt ArgumentErrort_check_literal(texprtoptobjRtreverset_python_is_typest result_typetkwargs((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_boolean_compare)sT           c KsX|dkr9|jr!|j}q9|jr9tj}q9nt|||d|d||S(NR.R0(Rt return_typet is_comparisonRR t_binary_operate(R+R,R-R.R0tkw((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_custom_op_operateus    cKs~t|||}|r(||}}n ||}}|dkrb|jj||j\}}nt|||d|d|S(NRR(R*Rt comparatort_adapt_expressionR(R+R,R-R.R0R6tlefttright((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyR5s   cKsE|tjkrt||S|tjkr8t||StdS(N(RRRtNotImplementedError(R+R,totherR6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_conjunction_operates   cKs ||S(N((R+R,tfnR6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_scalarscKs!t|}t|tr1t|||d|St|tr_t|||jd||St|ttfrt|||d||St|trt|t r|j rt|t r|j g|D]}|j ^q}nt|||d|Stjd|ng}x||D]t}t|sat|tjstjd|qn*|dkryt}n|j||}|j|q$Wt|dkr|tjkrtjtjfntjtjf\}}nt||tdt|t |jd|d|S(NRs_in_() accepts either a list of expressions, a selectable, or an "expanding" bound parameter: %rit _tuple_valuestagainst(RR!RR2Rt as_scalarRRR Rt expandingRt_with_expanding_in_typesttypeRtInvalidRequestErrorRRtColumnOperatorsRRt _bind_paramtappendtlentin_opt empty_in_optempty_notin_opR t self_group(R+R,tseq_or_selectablet negate_opR6telemtargsto((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_in_implsP  "     ! cKsQt|jtjr:t|||}t||||St||||dS(N(R!RFRt INDEXABLER*R5t_unsupported_impl(R+R,R=R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _getitem_implscOstd|jdS(Ns1Operator '%s' is not supported on this expression(R<t__name__(R+R,targR6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyRWscKs$t|dr|jS|jSdS(s%See :meth:`.ColumnOperators.__inv__`.tnegation_clauseN(thasattrR[t_negate(R+R,R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _inv_implscKst|dtjd|jS(s%See :meth:`.ColumnOperators.__neg__`.toperatorR(RRtnegRF(R+R,R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _neg_implsc KsOt|tjt|tj|dtjd|tjkrBtjntj|S(s#See :meth:`.ColumnOperators.match`.R0R(R2Rtmatch_opR*Rt MATCHTYPEt notmatch_op(R+R,R=R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _match_impls cKst|dtjd|jS(s&See :meth:`.ColumnOperators.distinct`.R_R(RRt distinct_opRF(R+R,R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt_distinct_implsc Ksst|tt|tj|t|tj|dtjdtdt|d|tjkrctjntjd|S(s%See :meth:`.ColumnOperators.between`.R_tgrouptgroup_contentsRR(RR R*RRtFalset between_opt notbetween_op(R+R,tclefttcrightR6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _between_impls  cKs t||S(N(R (R+R,R=R6((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt _collate_impl,sRRtinvtaddtmultsubtdivtmodttruedivt custom_optjson_path_getitem_optjson_getitem_opt concat_optany_optall_optlttleR#tgttgeR"R%R&tlike_optilike_opt notlike_opt notilike_opt contains_opt startswith_opt endswith_optdesc_optasc_opt nullsfirst_opt nullslast_opRLtnotin_opR'R(R RbRdRfRkRlR`tgetitemtlshifttrshifttcontainscCst|ttfrOt|trK|jjrK|j}|j|_n|St|drm|j}n!t|t j j r|j }nt|t tfr|jSt|ts|j||d|S|SdS(Nt__clause_element__R(R!R RRRFt_isnullt_cloneR\RRt TypeEnginet ComparatorR+RRRCRRI(R+R_R=tbindparam_type((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyR*gs   N(Mt__doc__tRRtelementsRRRRRRRR R R R R RRRRRRRRt selectableRRRRRRRRjtNoneTypeR$R2R7R5R>R@RURXRWR^RaReRgRoRpt _create_anyt _create_allRRR"RR~R#R&R%RRRRtnotcontains_optnotstartswith_optnotendswith_opt _create_desct _create_asct_create_nullsfirstt_create_nullslastRRLR'R(toperator_lookupR*(((sT/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/sql/default_comparator.pyt s  E   J