[Zope-Checkins] CVS: Zope/lib/python/Products/ZCTextIndex/tests - testIndex.py:1.11.74.3

Casey Duncan casey@zope.com
Thu, 5 Jun 2003 15:02:21 -0400


Update of /cvs-repository/Zope/lib/python/Products/ZCTextIndex/tests
In directory cvs.zope.org:/tmp/cvs-serv14371/tests

Modified Files:
      Tag: casey-zctextindex-fewer-conflicts-branch
	testIndex.py 
Log Message:
Fix flaw in query mechanism by removing a len(BTree) and replacing it with a cached length lookup. This should improve performance and scalability.
Add document_count method for this purpose. This method is overridden by a BTree.Length.Length object in instances.
Added code to opportunistically cache the length when the index is changed
Added tests for length, and upgrade code
Updated interface


=== Zope/lib/python/Products/ZCTextIndex/tests/testIndex.py 1.11.74.2 => 1.11.74.3 ===
--- Zope/lib/python/Products/ZCTextIndex/tests/testIndex.py:1.11.74.2	Thu Jun  5 00:41:58 2003
+++ Zope/lib/python/Products/ZCTextIndex/tests/testIndex.py	Thu Jun  5 15:02:20 2003
@@ -15,6 +15,7 @@
 import os
 from unittest import TestCase, TestSuite, main, makeSuite
 
+from BTrees.Length import Length
 from Products.ZCTextIndex.Lexicon import Lexicon, Splitter
 from Products.ZCTextIndex.CosineIndex import CosineIndex
 from Products.ZCTextIndex.OkapiIndex import OkapiIndex
@@ -35,6 +36,8 @@
         self.assert_(self.index.has_doc(DOCID))
         self.assert_(self.index._docweight[DOCID])
         self.assertEqual(len(self.index._docweight), 1)
+        self.assertEqual(
+            len(self.index._docweight), self.index.document_count())
         self.assertEqual(len(self.index._wordinfo), 5)
         self.assertEqual(len(self.index._docwords), 1)
         self.assertEqual(len(self.index.get_words(DOCID)), 5)
@@ -49,6 +52,8 @@
         self.test_index_document(DOCID)
         self.index.unindex_doc(DOCID)
         self.assertEqual(len(self.index._docweight), 0)
+        self.assertEqual(
+            len(self.index._docweight), self.index.document_count())
         self.assertEqual(len(self.index._wordinfo), 0)
         self.assertEqual(len(self.index._docwords), 0)
         self.assertEqual(len(self.index._wordinfo),
@@ -61,6 +66,8 @@
         self.index.index_doc(DOCID, doc)
         self.assert_(self.index._docweight[DOCID])
         self.assertEqual(len(self.index._docweight), 2)
+        self.assertEqual(
+            len(self.index._docweight), self.index.document_count())
         self.assertEqual(len(self.index._wordinfo), 8)
         self.assertEqual(len(self.index._docwords), 2)
         self.assertEqual(len(self.index.get_words(DOCID)), 4)
@@ -83,6 +90,8 @@
         self.index.unindex_doc(1)
         DOCID = 2
         self.assertEqual(len(self.index._docweight), 1)
+        self.assertEqual(
+            len(self.index._docweight), self.index.document_count())
         self.assert_(self.index._docweight[DOCID])
         self.assertEqual(len(self.index._wordinfo), 4)
         self.assertEqual(len(self.index._docwords), 1)
@@ -102,6 +111,8 @@
         self.assertEqual(len(self.index.get_words(DOCID)), 7)
         self.assertEqual(len(self.index._wordinfo),
                          self.index.length())
+        self.assertEqual(
+            len(self.index._docweight), self.index.document_count())
         wids = self.lexicon.termToWordIds("repeat")
         self.assertEqual(len(wids), 1)
         repititive_wid = wids[0]
@@ -211,9 +222,9 @@
         copy.index_doc(1, 'Then again, who asked you?')
         get_transaction().commit()
         
-class TestTotalDocLenUpgrade(TestCase):
+class TestUpgrade(TestCase):
 
-    def test_query_before_upgrade(self):
+    def test_query_before_totaldoclen_upgrade(self):
         self.index1 = OkapiIndex(Lexicon(Splitter()))
         self.index1.index_doc(0, 'The quiet of night')
         # Revert index1 back to a long to simulate an older index instance
@@ -236,13 +247,40 @@
         self.index2.unindex_doc(0)
         self.assertEqual(
             self.index1._totaldoclen(), self.index2._totaldoclen())
+
+    def test_query_before_document_count_upgrade(self):
+        self.index1 = OkapiIndex(Lexicon(Splitter()))
+        self.index1.index_doc(0, 'The quiet of night')
+        # Revert index1 back to a long to simulate an older index instance
+        del self.index1.document_count
+        self.assertEqual(len(self.index1.search('night')), 1)
+    
+    def test_upgrade_document_count(self):
+        self.index1 = OkapiIndex(Lexicon())
+        self.index2 = OkapiIndex(Lexicon())
+        self.index1.index_doc(0, 'The quiet of night')
+        self.index2.index_doc(0, 'The quiet of night')
+        # Revert index1 back to simulate an older index instance
+        del self.index1.document_count
+        self.index1.index_doc(1, 'gazes upon my shadow')
+        self.index2.index_doc(1, 'gazes upon my shadow')
+        self.assert_(self.index1.document_count.__class__ is Length)
+        self.assertEqual(
+            self.index1.document_count(), self.index2.document_count())
+        del self.index1.document_count
+        self.index1.unindex_doc(0)
+        self.index2.unindex_doc(0)
+        self.assert_(self.index1.document_count.__class__ is Length)
+        self.assertEqual(
+            self.index1.document_count(), self.index2.document_count())
+        
         
         
 def test_suite():
     return TestSuite((makeSuite(CosineIndexTest),
                       makeSuite(OkapiIndexTest),
                       makeSuite(TestIndexConflict),
-                      makeSuite(TestTotalDocLenUpgrade),
+                      makeSuite(TestUpgrade),
                     ))
 
 if __name__=='__main__':