|
16 | 16 | from . import TestLayerDB |
17 | 17 |
|
18 | 18 |
|
19 | | -class Test_Query_Approaches(TestLayerDB): |
20 | | - __test_calcs_dir__ = EXAMPLE_DIR |
21 | | - |
22 | | - _work = API() |
23 | | - searched_category = (80, 'plane waves') # defined in /init-data.sql |
| 19 | +class Hierarchy_Params(object): |
| 20 | + work = API() |
| 21 | + searched_category = (80, 'gaussians') # defined in /init-data.sql |
24 | 22 | searched_category_num = None # defined in hierarchy |
25 | 23 | space_grp_topic_source = 'ng' # defined in parsers and set in API.classify() |
26 | | - _categ_found = False |
27 | | - for cid, series in _work.hierarchy_values.iteritems(): |
28 | | - if _categ_found: break |
| 24 | + categ_found = False |
| 25 | + for cid, series in work.hierarchy_values.iteritems(): |
| 26 | + if categ_found: break |
29 | 27 | elif cid == searched_category[0]: |
30 | 28 | for num, name in series.iteritems(): |
31 | 29 | if name == searched_category[1]: |
32 | | - _categ_found, searched_category_num = True, num |
| 30 | + categ_found, searched_category_num = True, num |
33 | 31 | break |
34 | 32 | else: raise RuntimeError("Cannot determine the category number!") |
35 | 33 |
|
| 34 | +def get_serialized_results(sess_handle, topic_cid, topic_num, topic_src): |
| 35 | + serialized_results = {} |
| 36 | + for checksum, grid_json in sess_handle.query(model.Grid.checksum, model.Grid.info).join(model.tags, model.Grid.checksum == model.tags.c.checksum).join(model.Topic, model.tags.c.tid == model.Topic.tid).filter(model.Topic.cid == topic_cid, model.Topic.topic == topic_num).all(): |
| 37 | + grid_json = json.loads(grid_json) |
| 38 | + try: serialized_results[checksum] = grid_json[topic_src] |
| 39 | + except KeyError: pass # no such property in JSON |
| 40 | + return serialized_results |
| 41 | + |
| 42 | +def get_relational_results(sess_handle, topic_num): |
| 43 | + relational_results = {} |
| 44 | + for checksum, space_grp in sess_handle.query(model.Calculation.checksum, model.Spacegroup.n).join(model.Spacegroup, model.Calculation.checksum == model.Spacegroup.checksum).join(model.Basis, model.Calculation.checksum == model.Basis.checksum).filter(model.Basis.kind == topic_num).all(): |
| 45 | + relational_results[checksum] = space_grp |
| 46 | + return relational_results |
| 47 | + |
| 48 | +class Test_Query_Approaches(TestLayerDB): |
| 49 | + __test_calcs_dir__ = EXAMPLE_DIR |
| 50 | + |
36 | 51 | @classmethod |
37 | 52 | def setUpClass(cls): |
38 | 53 | super(Test_Query_Approaches, cls).setUpClass(dbname=__name__.split('.')[-1]) |
39 | 54 |
|
40 | 55 | def test_equality(self): |
41 | | - serialized_results = {} |
42 | 56 | tick1 = time.time() |
43 | | - for checksum, grid_json in self.db.session.query(model.Grid.checksum, model.Grid.info).join(model.tags, model.Grid.checksum == model.tags.c.checksum).join(model.Topic, model.tags.c.tid == model.Topic.tid).filter(model.Topic.cid == self.searched_category[0], model.Topic.topic == self.searched_category_num).all(): |
44 | | - grid_json = json.loads(grid_json) |
45 | | - try: serialized_results[checksum] = grid_json[self.space_grp_topic_source] |
46 | | - except KeyError: pass # no such property in JSON |
47 | | - self.report.warning("Query in serialized approach (%s results) took %1.2f sc" % (len(serialized_results), time.time() - tick1)) |
| 57 | + serialized_results = get_serialized_results( |
| 58 | + self.db.session, |
| 59 | + Hierarchy_Params.searched_category[0], |
| 60 | + Hierarchy_Params.searched_category_num, |
| 61 | + Hierarchy_Params.space_grp_topic_source |
| 62 | + ) |
| 63 | + tick2 = time.time() |
| 64 | + self.report.warning("Query in serialized approach (%s results) took %1.2f sc" % (len(serialized_results), tick2 - tick1)) |
48 | 65 |
|
49 | | - relational_results = {} |
| 66 | + tick1 = time.time() |
| 67 | + relational_results = get_relational_results( |
| 68 | + self.db.session, |
| 69 | + Hierarchy_Params.searched_category_num |
| 70 | + ) |
50 | 71 | tick2 = time.time() |
51 | | - for checksum, space_grp in self.db.session.query(model.Calculation.checksum, model.Spacegroup.n).join(model.Spacegroup, model.Calculation.checksum == model.Spacegroup.checksum).join(model.Basis, model.Calculation.checksum == model.Basis.checksum).filter(model.Basis.kind == self.searched_category_num).all(): |
52 | | - relational_results[checksum] = space_grp |
53 | | - self.report.warning("Query in relational approach (%s results) took %1.2f sc" % (len(relational_results), time.time() - tick2)) |
| 72 | + self.report.warning("Query in relational approach (%s results) took %1.2f sc" % (len(relational_results), tick2 - tick1)) |
54 | 73 |
|
55 | 74 | try: self.assertEqual(serialized_results, relational_results, |
56 | 75 | "Approaches give different results!\nSerialized:\n%s\nRelational:\n%s\n" % (serialized_results, relational_results)) |
57 | 76 | except: |
58 | 77 | TestLayerDB.failed = True |
59 | 78 | raise |
| 79 | + |
| 80 | + |
| 81 | +if __name__ == "__main__": |
| 82 | + # NB -m tests.functional.query_approaches_test |
| 83 | + |
| 84 | + from tilde.core.settings import settings, connect_database |
| 85 | + |
| 86 | + session = connect_database(settings, default_actions=False) |
| 87 | + print "DB: %s" % (settings['db']['default_sqlite_db'] if settings['db']['engine'] == 'sqlite' else settings['db']['dbname']) |
| 88 | + |
| 89 | + tick1 = time.time() |
| 90 | + serialized_results = get_serialized_results( |
| 91 | + session, |
| 92 | + Hierarchy_Params.searched_category[0], |
| 93 | + Hierarchy_Params.searched_category_num, |
| 94 | + Hierarchy_Params.space_grp_topic_source |
| 95 | + ) |
| 96 | + tick2 = time.time() |
| 97 | + print "Query in serialized approach (%s results) took %1.2f sc" % (len(serialized_results), tick2 - tick1) |
| 98 | + |
| 99 | + tick1 = time.time() |
| 100 | + relational_results = get_relational_results( |
| 101 | + session, |
| 102 | + Hierarchy_Params.searched_category_num |
| 103 | + ) |
| 104 | + tick2 = time.time() |
| 105 | + print "Query in relational approach (%s results) took %1.2f sc" % (len(relational_results), tick2 - tick1) |
| 106 | + |
| 107 | + print "Results equal?", serialized_results==relational_results |
0 commit comments