Mercurial > p > roundup > code
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) |
