(
expr: ColumnElement[Any],
op: OperatorType,
obj: Any,
*,
negate_op: Optional[OperatorType] = None,
reverse: bool = False,
_python_is_types: Tuple[Type[Any], ...] = (type(None), bool),
result_type: Optional[TypeEngine[bool]] = None,
**kwargs: Any,
)
| 48 | |
| 49 | |
| 50 | def _boolean_compare( |
| 51 | expr: ColumnElement[Any], |
| 52 | op: OperatorType, |
| 53 | obj: Any, |
| 54 | *, |
| 55 | negate_op: Optional[OperatorType] = None, |
| 56 | reverse: bool = False, |
| 57 | _python_is_types: Tuple[Type[Any], ...] = (type(None), bool), |
| 58 | result_type: Optional[TypeEngine[bool]] = None, |
| 59 | **kwargs: Any, |
| 60 | ) -> OperatorExpression[bool]: |
| 61 | if result_type is None: |
| 62 | result_type = type_api.BOOLEANTYPE |
| 63 | |
| 64 | if isinstance(obj, _python_is_types + (Null, True_, False_)): |
| 65 | # allow x ==/!= True/False to be treated as a literal. |
| 66 | # this comes out to "== / != true/false" or "1/0" if those |
| 67 | # constants aren't supported and works on all platforms |
| 68 | if op in (operators.eq, operators.ne) and isinstance( |
| 69 | obj, (bool, True_, False_) |
| 70 | ): |
| 71 | return OperatorExpression._construct_for_op( |
| 72 | expr, |
| 73 | coercions.expect(roles.ConstExprRole, obj), |
| 74 | op, |
| 75 | type_=result_type, |
| 76 | negate=negate_op, |
| 77 | modifiers=kwargs, |
| 78 | ) |
| 79 | elif op in ( |
| 80 | operators.is_distinct_from, |
| 81 | operators.is_not_distinct_from, |
| 82 | ): |
| 83 | return OperatorExpression._construct_for_op( |
| 84 | expr, |
| 85 | coercions.expect(roles.ConstExprRole, obj), |
| 86 | op, |
| 87 | type_=result_type, |
| 88 | negate=negate_op, |
| 89 | modifiers=kwargs, |
| 90 | ) |
| 91 | elif expr._is_collection_aggregate: |
| 92 | obj = coercions.expect( |
| 93 | roles.ConstExprRole, element=obj, operator=op, expr=expr |
| 94 | ) |
| 95 | else: |
| 96 | # all other None uses IS, IS NOT |
| 97 | if op in (operators.eq, operators.is_): |
| 98 | return OperatorExpression._construct_for_op( |
| 99 | expr, |
| 100 | coercions.expect(roles.ConstExprRole, obj), |
| 101 | operators.is_, |
| 102 | negate=operators.is_not, |
| 103 | type_=result_type, |
| 104 | ) |
| 105 | elif op in (operators.ne, operators.is_not): |
| 106 | return OperatorExpression._construct_for_op( |
| 107 | expr, |
no test coverage detected