Commit 4b8d55f9 authored by Tres Seaver's avatar Tres Seaver

weightedIntersection must work even when merging is impossible (e.g. two sets).

parent 990678ff
......@@ -1286,7 +1286,6 @@ def weightedIntersection(set_type, o1, o2, w1=1, w2=1):
MERGE_DEFAULT = getattr(o1, 'MERGE_DEFAULT', None)
i1 = _SetIteration(o1, True, MERGE_DEFAULT)
i2 = _SetIteration(o2, True, MERGE_DEFAULT)
result = o1._mapping_type()
MERGE = getattr(o1, 'MERGE', None)
if MERGE is None and i1.useValues and i2.useValues:
raise TypeError("invalid set operation")
......@@ -1300,15 +1299,23 @@ def weightedIntersection(set_type, o1, o2, w1=1, w2=1):
raise TypeError("invalid set operation")
else:
raise TypeError("invalid set operation")
_merging = i1.useValues or i2.useValues
if _merging:
result = o1._mapping_type()
def copy(i, w):
result._keys.append(i.key)
result._values.append(MERGE_WEIGHT(i.value, w))
else:
result = o1._set_type()
def copy(i, w):
result._keys.append(i.key)
while i1.active and i2.active:
cmp_ = cmp(i1.key, i2.key)
if cmp_ < 0:
i1.advance()
elif cmp_ == 0:
result._keys.append(i1.key)
if _merging:
result._values.append(MERGE(i1.value, w1, i2.value, w2))
i1.advance()
i2.advance()
......
......@@ -2653,6 +2653,14 @@ class Test_weightedUnion(unittest.TestCase, _SetObBase):
self.assertEqual(result['d'], 33)
self.assertEqual(result['e'], 11)
def test_w_lhs_Set_rhs_Set(self):
from BTrees.IIBTree import IISetPy
lhs = IISetPy([1, 2, 3])
rhs = IISetPy([1, 4])
weight, result = self._callFUT(lhs.__class__, lhs, rhs)
self.assertEqual(weight, 1)
self.assertEqual(list(result), [1, 2, 3, 4])
class Test_weightedIntersection(unittest.TestCase, _SetObBase):
......@@ -2695,6 +2703,14 @@ class Test_weightedIntersection(unittest.TestCase, _SetObBase):
self.assertEqual(list(result), ['a'])
self.assertEqual(result['a'], 23)
def test_w_lhs_Set_rhs_Set(self):
from BTrees.IIBTree import IISetPy
lhs = IISetPy([1, 2, 3])
rhs = IISetPy([1, 4])
weight, result = self._callFUT(lhs.__class__, lhs, rhs)
self.assertEqual(weight, 2)
self.assertEqual(list(result), [1])
class Test_multiunion(unittest.TestCase, _SetObBase):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment