You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					139 lines
				
				4.6 KiB
			
		
		
			
		
	
	
					139 lines
				
				4.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# Copyright (C) 2013-2022 the SQLAlchemy authors and contributors
							 | 
						||
| 
								 | 
							
								# <see AUTHORS file>
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This module is part of SQLAlchemy and is released under
							 | 
						||
| 
								 | 
							
								# the MIT License: https://www.opensource.org/licenses/mit-license.php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ... import types as sqltypes
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__all__ = ("INT4RANGE", "INT8RANGE", "NUMRANGE")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class RangeOperators(object):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    This mixin provides functionality for the Range Operators
							 | 
						||
| 
								 | 
							
								    listed in the Range Operators table of the `PostgreSQL documentation`__
							 | 
						||
| 
								 | 
							
								    for Range Functions and Operators. It is used by all the range types
							 | 
						||
| 
								 | 
							
								    provided in the ``postgres`` dialect and can likely be used for
							 | 
						||
| 
								 | 
							
								    any range types you create yourself.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __ https://www.postgresql.org/docs/devel/static/functions-range.html
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    No extra support is provided for the Range Functions listed in the Range
							 | 
						||
| 
								 | 
							
								    Functions table of the PostgreSQL documentation. For these, the normal
							 | 
						||
| 
								 | 
							
								    :func:`~sqlalchemy.sql.expression.func` object should be used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class comparator_factory(sqltypes.Concatenable.Comparator):
							 | 
						||
| 
								 | 
							
								        """Define comparison operations for range types."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def __ne__(self, other):
							 | 
						||
| 
								 | 
							
								            "Boolean expression. Returns true if two ranges are not equal"
							 | 
						||
| 
								 | 
							
								            if other is None:
							 | 
						||
| 
								 | 
							
								                return super(RangeOperators.comparator_factory, self).__ne__(
							 | 
						||
| 
								 | 
							
								                    other
							 | 
						||
| 
								 | 
							
								                )
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                return self.expr.op("<>", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def contains(self, other, **kw):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the right hand operand,
							 | 
						||
| 
								 | 
							
								            which can be an element or a range, is contained within the
							 | 
						||
| 
								 | 
							
								            column.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            kwargs may be ignored by this operator but are required for API
							 | 
						||
| 
								 | 
							
								            conformance.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("@>", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def contained_by(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the column is contained
							 | 
						||
| 
								 | 
							
								            within the right hand operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("<@", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def overlaps(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the column overlaps
							 | 
						||
| 
								 | 
							
								            (has points in common with) the right hand operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("&&", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def strictly_left_of(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the column is strictly
							 | 
						||
| 
								 | 
							
								            left of the right hand operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("<<", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        __lshift__ = strictly_left_of
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def strictly_right_of(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the column is strictly
							 | 
						||
| 
								 | 
							
								            right of the right hand operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op(">>", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        __rshift__ = strictly_right_of
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def not_extend_right_of(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the range in the column
							 | 
						||
| 
								 | 
							
								            does not extend right of the range in the operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("&<", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def not_extend_left_of(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the range in the column
							 | 
						||
| 
								 | 
							
								            does not extend left of the range in the operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("&>", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def adjacent_to(self, other):
							 | 
						||
| 
								 | 
							
								            """Boolean expression. Returns true if the range in the column
							 | 
						||
| 
								 | 
							
								            is adjacent to the range in the operand.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("-|-", is_comparison=True)(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def __add__(self, other):
							 | 
						||
| 
								 | 
							
								            """Range expression. Returns the union of the two ranges.
							 | 
						||
| 
								 | 
							
								            Will raise an exception if the resulting range is not
							 | 
						||
| 
								 | 
							
								            contiguous.
							 | 
						||
| 
								 | 
							
								            """
							 | 
						||
| 
								 | 
							
								            return self.expr.op("+")(other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class INT4RANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL INT4RANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "INT4RANGE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class INT8RANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL INT8RANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "INT8RANGE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class NUMRANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL NUMRANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "NUMRANGE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class DATERANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL DATERANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "DATERANGE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TSRANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL TSRANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "TSRANGE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TSTZRANGE(RangeOperators, sqltypes.TypeEngine):
							 | 
						||
| 
								 | 
							
								    """Represent the PostgreSQL TSTZRANGE type."""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    __visit_name__ = "TSTZRANGE"
							 |