]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Reimplement contained_by() on top of new _compare_edges()
authorLele Gaifax <lele@metapensiero.it>
Mon, 7 Nov 2022 08:01:11 +0000 (09:01 +0100)
committerLele Gaifax <lele@metapensiero.it>
Mon, 7 Nov 2022 08:01:11 +0000 (09:01 +0100)
Although (maybe) slightly less efficient that the previous
implementation, this one is far simpler and clearer.

lib/sqlalchemy/dialects/postgresql/ranges.py

index c241f08072cdfe31f426bdf5b298f302cd315b68..44472ab32d33477b4d802c555c72191f1c510988 100644 (file)
@@ -225,72 +225,23 @@ class Range(Generic[_T]):
         if other.empty:
             return False
 
+        slower = self.lower
+        slower_b = self.bounds[0]
         olower = other.lower
-        oupper = other.upper
+        olower_b = other.bounds[0]
 
-        # A bilateral unbound range contains any other range
-        if olower is oupper is None:
-            return True
+        if self._compare_edges(slower, slower_b, olower, olower_b) < 0:
+            return False
 
-        slower = self.lower
         supper = self.upper
+        supper_b = self.bounds[1]
+        oupper = other.upper
+        oupper_b = other.bounds[1]
 
-        # A lower-bound range cannot contain a lower-unbound range
-        if slower is None and olower is not None:
-            return False
-
-        # Likewise on the right side
-        if supper is None and oupper is not None:
+        if self._compare_edges(supper, supper_b, oupper, oupper_b) > 0:
             return False
 
-        slower_inc = self.bounds[0] == "["
-        supper_inc = self.bounds[1] == "]"
-        olower_inc = other.bounds[0] == "["
-        oupper_inc = other.bounds[1] == "]"
-
-        # Check the lower end
-        step = -1
-        if slower is not None and olower is not None:
-            lside = olower < slower
-            if not lside:
-                if not slower_inc or olower_inc:
-                    lside = olower == slower
-            if not lside:
-                # Cover (1,x] vs [2,x) and (0,x] vs [1,x)
-                if not slower_inc and olower_inc and slower < olower:
-                    step = self._get_discrete_step()
-                    if step is not None:
-                        lside = olower == (slower + step)
-                elif slower_inc and not olower_inc and slower > olower:
-                    step = self._get_discrete_step()
-                    if step is not None:
-                        lside = (olower + step) == slower
-            if not lside:
-                return False
-
-        # Lower end already considered, an upper-unbound range surely contains
-        # this
-        if oupper is None:
-            return True
-
-        # Check the upper end
-        uside = oupper > supper
-        if not uside:
-            if not supper_inc or oupper_inc:
-                uside = oupper == supper
-            if not uside:
-                # Cover (x,2] vs [x,3) and (x,1] vs [x,2)
-                if supper_inc and not oupper_inc and supper < oupper:
-                    if step == -1:
-                        step = self._get_discrete_step()
-                    if step is not None:
-                        uside = oupper == (supper + step)
-                elif not supper_inc and oupper_inc and supper > oupper:
-                    if step == -1:
-                        step = self._get_discrete_step()
-                    if step is not None:
-                        uside = (oupper + step) == supper
-        return uside
+        return True
 
     def contains(self, value: Union[_T, Range]) -> bool:
         "Determine whether this range contains `value`."