[Zope-CVS] CVS: Products/RecentItemsIndex - index.py:1.4 test.py:1.4

Casey Duncan casey at zope.com
Mon Aug 9 12:23:49 EDT 2004


Update of /cvs-repository/Products/RecentItemsIndex
In directory cvs.zope.org:/tmp/cvs-serv25307

Modified Files:
	index.py test.py 
Log Message:
Allow field classifier name to be omitted so that one recent item list can be kept for the entire catalog.
Also, the value may be omitted from queries. When a classifier is specified for the index, this allows the application to easily query for all values. When no classifier is indexed, no value is needed since there is only one list to query.


=== Products/RecentItemsIndex/index.py 1.3 => 1.4 ===
--- Products/RecentItemsIndex/index.py:1.3	Wed Aug  4 16:41:17 2004
+++ Products/RecentItemsIndex/index.py	Mon Aug  9 12:23:18 2004
@@ -69,6 +69,8 @@
         
         field_name -- Name of attribute used to classify the objects. A
         recent item list is created for each value of this field indexed.
+        If this value is omitted, then a single recent item list for all
+        cataloged objects is created.
         
         date_name -- Name of attribute containing a date which specifies the
         object's age.
@@ -81,13 +83,13 @@
         
         guard_permission -- The permission that must be granted to the
         guard roles for an object in order for it to be indexed. Ignored if
-        not guard_roles value is given.
+        no guard_roles value is given.
         
         extra and caller are used by the wonderous ZCatalog addIndex 
         machinery. You can ignore them, unfortunately I can't 8^/
         """
         self.id = id
-        self.field_name = field_name or extra.field_name
+        self.field_name = field_name or getattr(extra, 'field_name', None)
         self.date_name = date_name or extra.date_name
         self.max_length = max_length or extra.max_length
         assert self.max_length > 0, 'Max item length value must be 1 or greater'
@@ -111,15 +113,19 @@
             counts[value] = len(items)
         return counts
         
-    def query(self, value, limit=None, merge=1):
+    def query(self, value=None, limit=None, merge=1):
         """Return a lazy sequence of catalog brains like a catalog search
-        that coorespond to the most recent items for the value(s) given. 
+        that coorespond to the most recent items for the value(s) given.
+        If value is omitted, then the most recent for all values are returned.
         The result are returned in order, newest first. An integer value
         can be specified in limit which restricts the maximum number of
         results if desired. If no limit is specified, the indexes'
         maximum length is used as the limit
         """
         catalog = aq_parent(aq_inner(self))
+        if value is None and self.field_name is not None:
+            # Query all values
+            value = list(self._value2items.keys())
         if isinstance(value, (types.TupleType, types.ListType)):
             # Query for multiple values
             results = []
@@ -173,7 +179,10 @@
                 self.unindex_object(docid)
                 return 0
         try:
-            fieldvalue = _getSourceValue(obj, self.field_name)
+            if self.field_name is not None:
+                fieldvalue = _getSourceValue(obj, self.field_name)
+            else:
+                fieldvalue = None
             datevalue = _getSourceValue(obj, self.date_name)
         except AttributeError:
             # One or the other source attributes is missing


=== Products/RecentItemsIndex/test.py 1.3 => 1.4 ===
--- Products/RecentItemsIndex/test.py:1.3	Wed Aug  4 16:41:17 2004
+++ Products/RecentItemsIndex/test.py	Mon Aug  9 12:23:18 2004
@@ -69,6 +69,17 @@
         self.assertEqual(index.max_length, 25)
         self.assertEqual(tuple(index.guard_roles), ('Anonymous',))
         self.assertEqual(index.guard_permission, 'View')
+        
+    def test_construct_with_no_classifier_or_guard(self):
+        # Simulate instantiating from ZCatalog
+        from Products.RecentItemsIndex.index import RecentItemsIndex
+        class extra:
+            date_name = 'modified'
+            max_length = 30
+        index = RecentItemsIndex('nuttin', extra=extra)
+        self.assertEqual(index.getId(), 'nuttin')
+        self.assertEqual(index.date_name, 'modified')
+        self.assertEqual(index.max_length, 30)
     
     def test_construct_with_bogus_max_length(self):
         from Products.RecentItemsIndex.index import RecentItemsIndex
@@ -121,6 +132,26 @@
         self.test.docs = docs
         return docs
     
+    def test_index_many_no_classifier(self):
+        from Products.RecentItemsIndex.index import RecentItemsIndex
+        self.test.index = RecentItemsIndex('test', None, 'date', 10)
+        self.index = self.test.index
+        types = ['huey', 'dooey', 'looey', 'dooey'] * 15
+        date = DateTime('1/1/2004')
+        docs = {}
+        for docid, typ in zip(range(len(types)), types):
+            if not docid % 3:
+                date = date + 1
+            if not docid % 7:
+                date = date - (docid % 3)
+            doc = docs[docid] = Doc(docid=docid, type=typ, date=date)
+            self.index.index_object(docid, doc)
+        maxlen = self.index.max_length
+        self.assertEqual(self.index.getItemCounts(), {None: maxlen,})
+        self.assertEqual(self.index.numObjects(), maxlen)
+        self.test.docs = docs
+        return docs
+    
     def test_unindex_one_type(self):
         docs = self.test_index_many()
         for docid, doc in docs.items():
@@ -276,6 +307,27 @@
         expected.reverse()
         self.assertEqual([doc.docid for doc in result], expected)
         return expected
+    
+    def test_query_all_values(self):
+        docs = self.test_index_many()
+        top = self._get_top_docs(docs)
+        result = self.index.query()
+        expected = top['huey'] + top['dooey'] + top['looey']
+        expected.sort()
+        expected = [docid for nil, docid in expected]
+        expected.reverse()
+        self.assertEqual([doc.docid for doc in result], expected)
+        return expected
+
+    def test_query_no_classifier(self):
+        docs = self.test_index_many_no_classifier()
+        top = self._get_top_docs(docs)
+        result = self.index.query()
+        expected = top['huey'] + top['dooey'] + top['looey']
+        expected.sort()
+        expected = [docid for nil, docid in expected]
+        expected.reverse()
+        self.assertEqual([doc.docid for doc in result], expected[:10])
         
     def test_query_multiple_with_tuple(self):
         expected = self.test_query_multiple_values()



More information about the Zope-CVS mailing list