B 4]/2@sdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZdd ej e!fdfd!d"Z"d@d#d$Z#dAd%d&Z$d'd(Z%d)d*Z&d+d,Z'd-d.Z(d/d0Z)d1d2Z*d3d4Z+d5d6Z,d7d8Z-d9d:Z.d;d<Z/e%fe%fe*fe$fe$fe$fe$fe$fe$fe#fe$fe$fe$fe&ej0fe&ej1fe"ej2fe"ej3fe"ej4fe"ej5fe"ej6fe"ej7fe"ej8fe"ej9fe"ej:fe"ej;fe"ejfe"ej?fe"ej@fe&ejAfe&ejBfe&ejCfe&ejDfe'ejEfe'ejFfe"ejGfe"ejHfe/fe,fe,fe-fe.fe.fe+fe(fe)fe)fe)fd=1ZIdBd>d?ZJdS)Cz5Default implementation of SQL comparison operations. ) operators)type_api)_clause_element_as_expr) _const_expr) _is_literal)_literal_as_text)and_)BinaryExpression) BindParameter) ClauseElement) ClauseList)collate)CollectionAggregate) ColumnElement)False_)Null)or_) TextClause)True_)Tuple)UnaryExpression) Visitable)Alias) ScalarSelect) Selectable) SelectBase)exc)utilNFcKs |dkrtj}t||tttfr|tjtjfkrZt|t ttfrZt |t |||||dS|tj tj fkrt |t |||||dS|tjtjfkrt |t|tjtj|dS|tjtjfkrt |t|tjtj|dStdn t|||}|rt ||||||dSt ||||||dSdS)N)type_negate modifiers)r rz|Only '=', '!=', 'is_()', 'isnot()', 'is_distinct_from()', 'isnot_distinct_from()' operators can be used with None/True/False)r BOOLEANTYPE isinstancerrrreqneboolr ris_distinct_fromisnot_distinct_fromis_risnotrZ ArgumentError_check_literal)expropobjr reverseZ_python_is_types result_typekwargsr2T/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/sql/default_comparator.py_boolean_compare)sT  r4cKs<|dkr"|jr|j}n |jr"tj}t|||f||d|S)N)r/r0)Z return_typeZ is_comparisonrr"_binary_operate)r,r-r.r/r0kwr2r2r3_custom_op_operateusr7cKsTt|||}|r||}}n ||}}|dkrB|j||j\}}t|||||dS)N)rr!)r+Z comparatorZ_adapt_expressionr )r,r-r.r/r0r6leftrightr2r2r3r5s   r5cKs2|tjkrt||S|tjkr(t||StdS)N)rrrNotImplementedError)r,r-otherr6r2r2r3_conjunction_operates     r<cKs||S)Nr2)r,r-fnr6r2r2r3_scalarsr>c Kst|}t|tr"t||||dSt|trHt|||fd|i|St|ttfrnt|||fd|i|St|trt|t r|j rt|t r| dd|D}t||||dSt d|g}xX|D]P}t|st|tjst d|n|dkrt}n |||}||qWt|dkrX|tjkrHtjtjfn tjtjf\}}t||t|dt|t ij|d|dS) N)r r cSsg|] }|jqSr2)type).0elemr2r2r3 sz_in_impl..z_in_() accepts either a list of expressions, a selectable, or an "expanding" bound parameter: %rZ _tuple_values)Zagainst)rr#rr4r as_scalarrrr r Z expandingrZ_with_expanding_in_typesrZInvalidRequestErrorrrZColumnOperatorsr _bind_paramappendlenin_opZ empty_in_opZempty_notin_opr Z self_group)r,r-Zseq_or_selectableZ negate_opr6argsor2r2r3_in_implsP          rKcKs>t|jtjr*t|||}t|||f|St|||f|dS)N)r#r?rZ INDEXABLEr+r5_unsupported_impl)r,r-r;r6r2r2r3 _getitem_impls rMcOstd|jdS)Nz1Operator '%s' is not supported on this expression)r:__name__)r,r-argr6r2r2r3rLsrLcKst|dr|jS|SdS)z%See :meth:`.ColumnOperators.__inv__`.negation_clauseN)hasattrrPZ_negate)r,r-r6r2r2r3 _inv_impls rRcKst|tj|jdS)z%See :meth:`.ColumnOperators.__neg__`.)operatorr)rrnegr?)r,r-r6r2r2r3 _neg_implsrUcKs:t|tjt|tj|ftj|tjkr*tjntjd|S)z#See :meth:`.ColumnOperators.match`.)r0r )r4rmatch_opr+rZ MATCHTYPE notmatch_op)r,r-r;r6r2r2r3 _match_implsrXcKst|tj|jdS)z&See :meth:`.ColumnOperators.distinct`.)rSr)rr distinct_opr?)r,r-r6r2r2r3_distinct_implsrZc KsHt|tt|tj|t|tj|tjddd||tjkrrKrMrLrRrUrXrZr^r_Z _create_anyZ _create_allrirhr$rgrfr%r(r'rlrmrjrkZnotcontains_opZnotstartswith_opZnotendswith_opZ _create_descZ _create_ascZ_create_nullsfirstZ_create_nullslastrnrHr)r*Zoperator_lookupr+r2r2r2r3 s                             E  J