[Checkins] SVN: Products.ZCatalog/trunk/ Made sure `actual_result_count` is available on all lazy classes and falls back to `__len__` if not explicitly provided.

Hanno Schlichting hannosch at hannosch.eu
Sun Dec 26 14:03:17 EST 2010


Log message for revision 119145:
  Made sure `actual_result_count` is available on all lazy classes and falls back to `__len__` if not explicitly provided.
  

Changed:
  U   Products.ZCatalog/trunk/CHANGES.txt
  U   Products.ZCatalog/trunk/src/Products/ZCatalog/Lazy.py
  U   Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_lazy.py

-=-
Modified: Products.ZCatalog/trunk/CHANGES.txt
===================================================================
--- Products.ZCatalog/trunk/CHANGES.txt	2010-12-26 18:40:10 UTC (rev 119144)
+++ Products.ZCatalog/trunk/CHANGES.txt	2010-12-26 19:03:16 UTC (rev 119145)
@@ -4,8 +4,10 @@
 2.13.2 (unreleased)
 -------------------
 
+- Made sure `actual_result_count` is available on all lazy classes and falls
+  back to `__len__` if not explicitly provided.
+
 - Optimized length calculation of Lazy classes.
-  [hannosch]
 
 2.13.1 (2010-12-25)
 -------------------

Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/Lazy.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/Lazy.py	2010-12-26 18:40:10 UTC (rev 119144)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/Lazy.py	2010-12-26 19:03:16 UTC (rev 119145)
@@ -21,7 +21,19 @@
     # Allow (reluctantly) access to unprotected attributes
     __allow_access_to_unprotected_subobjects__ = True
     _len = _marker
+    _rlen = _marker
 
+    @property
+    def actual_result_count(self):
+        if self._rlen is not _marker:
+            return self._rlen
+        self._rlen = len(self)
+        return self._rlen
+
+    @actual_result_count.setter
+    def actual_result_count(self, value):
+        self._rlen = value
+
     def __repr__(self):
         return repr(list(self))
 
@@ -61,7 +73,7 @@
     for accessing small parts of big searches.
     """
 
-    def __init__(self, sequences, length=None):
+    def __init__(self, sequences, length=None, actual_result_count=None):
         if len(sequences) < 100:
             # Optimize structure of LazyCats to avoid nesting
             # We don't do this for large numbers of input sequences
@@ -81,6 +93,8 @@
         self._eindex = -1
         if length is not None:
             self._len = length
+        if actual_result_count is not None:
+            self.actual_result_count = actual_result_count
 
     def __getitem__(self, index):
         data = self._data
@@ -145,7 +159,7 @@
     Don't access data until necessary
     """
 
-    def __init__(self, func, seq, length=None):
+    def __init__(self, func, seq, length=None, actual_result_count=None):
         self._seq = seq
         self._data = {}
         self._func = func
@@ -153,7 +167,10 @@
             self._len = length
         else:
             self._len = len(seq)
-        self.actual_result_count = self._len
+        if actual_result_count is not None:
+            self.actual_result_count = actual_result_count
+        else:
+            self.actual_result_count = self._len
 
     def __getitem__(self, index):
         data = self._data

Modified: Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_lazy.py
===================================================================
--- Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_lazy.py	2010-12-26 18:40:10 UTC (rev 119144)
+++ Products.ZCatalog/trunk/src/Products/ZCatalog/tests/test_lazy.py	2010-12-26 19:03:16 UTC (rev 119145)
@@ -22,7 +22,16 @@
         self.assertEqual(len(lseq), len(seq))
         self.assertEqual(list(lseq), seq)
 
+    def test_actual_result_count(self):
+        lcat = self._createLSeq(range(10))
+        self.assertEqual(len(lcat), 10)
+        self.assertEqual(lcat.actual_result_count, 10)
 
+        lcat.actual_result_count = 20
+        self.assertEqual(len(lcat), 10)
+        self.assertEqual(lcat.actual_result_count, 20)
+
+
 class TestLazyCat(BaseSequenceTest):
 
     def _createLSeq(self, *sequences):
@@ -32,6 +41,7 @@
     def test_empty(self):
         lcat = self._createLSeq([])
         self._compare(lcat, [])
+        self.assertEqual(lcat.actual_result_count, 0)
 
     def test_repr(self):
         lcat = self._createLSeq([0, 1])
@@ -41,6 +51,7 @@
         seq = range(10)
         lcat = self._createLSeq(seq)
         self._compare(lcat, seq)
+        self.assertEqual(lcat.actual_result_count, 10)
 
     def test_add(self):
         seq1 = range(10)
@@ -49,6 +60,7 @@
         lcat2 = self._createLSeq(seq2)
         lcat = lcat1 + lcat2
         self._compare(lcat, range(20))
+        self.assertEqual(lcat.actual_result_count, 20)
 
     def test_init_multiple(self):
         from string import hexdigits, letters
@@ -80,16 +92,19 @@
         # Unaccessed length
         lcat = self._createLSeq(range(10))
         self.assertEqual(len(lcat), 10)
+        self.assertEqual(lcat.actual_result_count, 10)
 
         # Accessed in the middle
         lcat = self._createLSeq(range(10))
         lcat[4]
         self.assertEqual(len(lcat), 10)
+        self.assertEqual(lcat.actual_result_count, 10)
 
         # Accessed after the lcat is accessed over the whole range
         lcat = self._createLSeq(range(10))
         lcat[:]
         self.assertEqual(len(lcat), 10)
+        self.assertEqual(lcat.actual_result_count, 10)
 
 
 class TestLazyMap(TestLazyCat):
@@ -213,24 +228,24 @@
 
 class TestLazyValues(BaseSequenceTest):
 
-    def _createLValues(self, seq):
+    def _createLSeq(self, seq):
         from Products.ZCatalog.Lazy import LazyValues
         return LazyValues(seq)
 
     def test_empty(self):
-        lvals = self._createLValues([])
+        lvals = self._createLSeq([])
         self._compare(lvals, [])
 
     def test_values(self):
         from string import letters
         seq = zip(letters, range(10))
-        lvals = self._createLValues(seq)
+        lvals = self._createLSeq(seq)
         self._compare(lvals, range(10))
 
     def test_slicing(self):
         from string import letters
         seq = zip(letters, range(10))
-        lvals = self._createLValues(seq)
+        lvals = self._createLSeq(seq)
         self._compare(lvals[2:-2], range(2, 8))
 
 



More information about the checkins mailing list