comparison test/test_mysql.py @ 4472:34dce76bb202

Multilink fixes and optimizations: - Optimisation: Late evaluation of Multilinks (only in rdbms backends): previously we materialized each multilink in a Node -- this creates an SQL query for each multilink (e.g. 'files' and 'messages' for each line in the issue index display) -- even if the multilinks aren't displayed. Now we compute multilinks only if they're accessed (and keep them cached). - Add a filter_iter similar to the existing filter call. This feature is considered experimental. This is currently not used in the web-interface but passes all tests for the filter call except sorting by Multilinks (which isn't supported by SQL and isn't a sane concept anyway). When using filter_iter instead of filter this saves a *lot* of SQL queries: Filter returns only the IDs of Nodes in the database, the additional content of a Node has to be fetched in a separate SQL call. The new filter_iter also returns the IDs of Nodes (one by one, it's an iterator) but pre-seeds the cache with the content of the Node. The information needed for seeding the cache is retrieved in the same SQL query as the ids.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Mon, 21 Mar 2011 20:44:39 +0000
parents 2784c239e6c8
children 6e3e4f24c753
comparison
equal deleted inserted replaced
4471:4f353d71d716 4472:34dce76bb202
21 21
22 from roundup.hyperdb import DatabaseError 22 from roundup.hyperdb import DatabaseError
23 from roundup.backends import get_backend, have_backend 23 from roundup.backends import get_backend, have_backend
24 24
25 from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest 25 from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest
26 from db_test_base import ConcurrentDBTest 26 from db_test_base import ConcurrentDBTest, FilterCacheTest
27 27
28 28
29 class mysqlOpener: 29 class mysqlOpener:
30 if have_backend('mysql'): 30 if have_backend('mysql'):
31 module = get_backend('mysql') 31 module = get_backend('mysql')
66 66
67 class mysqlConcurrencyTest(mysqlOpener, ConcurrentDBTest): 67 class mysqlConcurrencyTest(mysqlOpener, ConcurrentDBTest):
68 backend = 'mysql' 68 backend = 'mysql'
69 def setUp(self): 69 def setUp(self):
70 mysqlOpener.setUp(self) 70 mysqlOpener.setUp(self)
71 ClassicInitTest.setUp(self) 71 ConcurrentDBTest.setUp(self)
72 def tearDown(self): 72 def tearDown(self):
73 ClassicInitTest.tearDown(self) 73 ConcurrentDBTest.tearDown(self)
74 self.nuke_database()
75
76 class mysqlFilterCacheTest(mysqlOpener, FilterCacheTest):
77 backend = 'mysql'
78 def setUp(self):
79 mysqlOpener.setUp(self)
80 FilterCacheTest.setUp(self)
81 def tearDown(self):
82 FilterCacheTest.tearDown(self)
74 self.nuke_database() 83 self.nuke_database()
75 84
76 from session_common import RDBMSTest 85 from session_common import RDBMSTest
77 class mysqlSessionTest(mysqlOpener, RDBMSTest): 86 class mysqlSessionTest(mysqlOpener, RDBMSTest):
78 def setUp(self): 87 def setUp(self):
101 suite.addTest(unittest.makeSuite(mysqlROTest)) 110 suite.addTest(unittest.makeSuite(mysqlROTest))
102 suite.addTest(unittest.makeSuite(mysqlSchemaTest)) 111 suite.addTest(unittest.makeSuite(mysqlSchemaTest))
103 suite.addTest(unittest.makeSuite(mysqlClassicInitTest)) 112 suite.addTest(unittest.makeSuite(mysqlClassicInitTest))
104 suite.addTest(unittest.makeSuite(mysqlSessionTest)) 113 suite.addTest(unittest.makeSuite(mysqlSessionTest))
105 suite.addTest(unittest.makeSuite(mysqlConcurrencyTest)) 114 suite.addTest(unittest.makeSuite(mysqlConcurrencyTest))
115 suite.addTest(unittest.makeSuite(mysqlFilterCacheTest))
106 return suite 116 return suite
107 117
108 if __name__ == '__main__': 118 if __name__ == '__main__':
109 runner = unittest.TextTestRunner() 119 runner = unittest.TextTestRunner()
110 unittest.main(testRunner=runner) 120 unittest.main(testRunner=runner)

Roundup Issue Tracker: http://roundup-tracker.org/