diff --git a/sqlalchemy_utils/types/range.py b/sqlalchemy_utils/types/range.py index 87ad619..9acd7b1 100644 --- a/sqlalchemy_utils/types/range.py +++ b/sqlalchemy_utils/types/range.py @@ -162,6 +162,14 @@ class RangeComparator(types.TypeEngine.Comparator): other = map(self.coerce_arg, other) return super(RangeComparator, self).notin_(other) + def __rshift__(self, other, **kwargs): + other = self.coerce_arg(other) + return self.op('>>')(other) + + def __lshift__(self, other, **kwargs): + other = self.coerce_arg(other) + return self.op('<<')(other) + def contains(self, other, **kwargs): other = self.coerce_arg(other) return self.op('@>')(other) diff --git a/tests/types/test_int_range.py b/tests/types/test_int_range.py index ae7d50f..d153ac1 100644 --- a/tests/types/test_int_range.py +++ b/tests/types/test_int_range.py @@ -114,6 +114,38 @@ class TestIntRangeTypeOnPostgres(NumberRangeTestCase): ) assert query.count() + @mark.parametrize( + 'number_range', + ( + [1, 3], + '1 - 3', + (0, 4), + ) + ) + def test_rshift_operator(self, number_range): + self.create_building([5, 6]) + query = ( + self.session.query(self.Building) + .filter(self.Building.persons_at_night >> number_range) + ) + assert query.count() + + @mark.parametrize( + 'number_range', + ( + [1, 3], + '1 - 3', + (0, 4), + ) + ) + def test_lshift_operator(self, number_range): + self.create_building([-1, 0]) + query = ( + self.session.query(self.Building) + .filter(self.Building.persons_at_night << number_range) + ) + assert query.count() + @mark.parametrize( 'number_range', (