diff --git a/docs/range_data_types.rst b/docs/range_data_types.rst index ccac51c..4cd0a47 100644 --- a/docs/range_data_types.rst +++ b/docs/range_data_types.rst @@ -5,6 +5,7 @@ Range data types + DateRangeType ^^^^^^^^^^^^^ @@ -28,3 +29,9 @@ NumericRangeType .. autoclass:: NumericRangeType + +RangeComparator +^^^^^^^^^^^^^^^ + +.. autoclass:: RangeComparator + :members: diff --git a/sqlalchemy_utils/__init__.py b/sqlalchemy_utils/__init__.py index 8d19a12..ed484ba 100644 --- a/sqlalchemy_utils/__init__.py +++ b/sqlalchemy_utils/__init__.py @@ -49,10 +49,6 @@ from .types import ( TSVectorType, URLType, UUIDType, - INT4RANGE, - INT8RANGE, - DATERANGE, - NUMRANGE, ) @@ -111,8 +107,4 @@ __all__ = ( TSVectorType, URLType, UUIDType, - INT4RANGE, - INT8RANGE, - DATERANGE, - NUMRANGE, ) diff --git a/sqlalchemy_utils/types/__init__.py b/sqlalchemy_utils/types/__init__.py index 7506e4b..14344db 100644 --- a/sqlalchemy_utils/types/__init__.py +++ b/sqlalchemy_utils/types/__init__.py @@ -9,10 +9,6 @@ from .ip_address import IPAddressType from .json import JSONType from .locale import LocaleType from .range import ( - INT4RANGE, - INT8RANGE, - DATERANGE, - NUMRANGE, DateRangeType, DateTimeRangeType, IntRangeType, @@ -56,10 +52,6 @@ __all__ = ( WeekDay, WeekDays, WeekDaysType, - INT4RANGE, - INT8RANGE, - DATERANGE, - NUMRANGE, ) diff --git a/sqlalchemy_utils/types/range.py b/sqlalchemy_utils/types/range.py index 9acd7b1..62b932a 100644 --- a/sqlalchemy_utils/types/range.py +++ b/sqlalchemy_utils/types/range.py @@ -35,9 +35,6 @@ It is essentially the same as: session.query(Car).filter(Car.price_range == DecimalInterval([300, 300])) -The coercion is provided for convenience. - - Comparison operators ^^^^^^^^^^^^^^^^^^^^ @@ -78,53 +75,17 @@ except ImportError: pass import six import sqlalchemy as sa -from sqlalchemy.dialects.postgresql.base import ischema_names +from sqlalchemy.dialects.postgresql import ( + INT4RANGE, + DATERANGE, + NUMRANGE, + TSRANGE, +) from sqlalchemy import types from ..exceptions import ImproperlyConfigured from .scalar_coercible import ScalarCoercible -class INT4RANGE(types.UserDefinedType): - """ - Raw number range type, only supports PostgreSQL for now. - """ - def get_col_spec(self): - return 'int4range' - - -class INT8RANGE(types.UserDefinedType): - def get_col_spec(self): - return 'int8range' - - -class NUMRANGE(types.UserDefinedType): - def get_col_spec(self): - return 'numrange' - - -class DATERANGE(types.UserDefinedType): - def get_col_spec(self): - return 'daterange' - - -class TSRANGE(types.UserDefinedType): - def get_col_spec(self): - return 'tsrange' - - -class TSTZRANGE(types.UserDefinedType): - def get_col_spec(self): - return 'tstzrange' - - -ischema_names['int4range'] = INT4RANGE -ischema_names['int8range'] = INT8RANGE -ischema_names['numrange'] = NUMRANGE -ischema_names['daterange'] = DATERANGE -ischema_names['tsrange'] = TSRANGE -ischema_names['tstzrange'] = TSTZRANGE - - class RangeComparator(types.TypeEngine.Comparator): @classmethod def coerced_func(cls, func): @@ -163,10 +124,22 @@ class RangeComparator(types.TypeEngine.Comparator): return super(RangeComparator, self).notin_(other) def __rshift__(self, other, **kwargs): + """ + Returns whether or not given interval is strictly right of another + interval. + + [a, b] >> [c, d] True, if a > d + """ other = self.coerce_arg(other) return self.op('>>')(other) def __lshift__(self, other, **kwargs): + """ + Returns whether or not given interval is strictly left of another + interval. + + [a, b] << [c, d] True, if b < c + """ other = self.coerce_arg(other) return self.op('<<')(other)