101 from cubicweb.server.session import Session |
101 from cubicweb.server.session import Session |
102 from cubicweb.server.sources.rql2sql import remove_unused_solutions |
102 from cubicweb.server.sources.rql2sql import remove_unused_solutions |
103 |
103 |
104 class RQLGeneratorTC(TestCase): |
104 class RQLGeneratorTC(TestCase): |
105 schema = None # set this in concret test |
105 schema = None # set this in concret test |
106 |
106 |
107 def setUp(self): |
107 def setUp(self): |
108 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
108 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
109 'has_text': 'fti'}) |
109 'has_text': 'fti'}) |
110 self.qhelper = QuerierHelper(FakeRepo(self.schema), self.schema) |
110 self.qhelper = QuerierHelper(FakeRepo(self.schema), self.schema) |
111 ExecutionPlan._check_permissions = _dummy_check_permissions |
111 ExecutionPlan._check_permissions = _dummy_check_permissions |
112 rqlannotation._select_principal = _select_principal |
112 rqlannotation._select_principal = _select_principal |
113 |
113 |
114 def tearDown(self): |
114 def tearDown(self): |
115 ExecutionPlan._check_permissions = _orig_check_permissions |
115 ExecutionPlan._check_permissions = _orig_check_permissions |
116 rqlannotation._select_principal = _orig_select_principal |
116 rqlannotation._select_principal = _orig_select_principal |
117 |
117 |
118 def _prepare(self, rql): |
118 def _prepare(self, rql): |
119 #print '******************** prepare', rql |
119 #print '******************** prepare', rql |
120 union = self.rqlhelper.parse(rql) |
120 union = self.rqlhelper.parse(rql) |
121 #print '********* parsed', union.as_string() |
121 #print '********* parsed', union.as_string() |
122 self.rqlhelper.compute_solutions(union) |
122 self.rqlhelper.compute_solutions(union) |
131 return union |
131 return union |
132 |
132 |
133 |
133 |
134 class BaseQuerierTC(TestCase): |
134 class BaseQuerierTC(TestCase): |
135 repo = None # set this in concret test |
135 repo = None # set this in concret test |
136 |
136 |
137 def setUp(self): |
137 def setUp(self): |
138 self.o = self.repo.querier |
138 self.o = self.repo.querier |
139 self.session = self.repo._sessions.values()[0] |
139 self.session = self.repo._sessions.values()[0] |
140 self.ueid = self.session.user.eid |
140 self.ueid = self.session.user.eid |
141 assert self.ueid != -1 |
141 assert self.ueid != -1 |
146 |
146 |
147 def get_max_eid(self): |
147 def get_max_eid(self): |
148 return self.session.unsafe_execute('Any MAX(X)')[0][0] |
148 return self.session.unsafe_execute('Any MAX(X)')[0][0] |
149 def cleanup(self): |
149 def cleanup(self): |
150 self.session.unsafe_execute('DELETE Any X WHERE X eid > %s' % self.maxeid) |
150 self.session.unsafe_execute('DELETE Any X WHERE X eid > %s' % self.maxeid) |
151 |
151 |
152 def tearDown(self): |
152 def tearDown(self): |
153 undo_monkey_patch() |
153 undo_monkey_patch() |
154 self.session.rollback() |
154 self.session.rollback() |
155 self.cleanup() |
155 self.cleanup() |
156 self.commit() |
156 self.commit() |
157 self.repo._free_pool(self.pool) |
157 self.repo._free_pool(self.pool) |
158 assert self.session.user.eid != -1 |
158 assert self.session.user.eid != -1 |
159 |
159 |
160 def set_debug(self, debug): |
160 def set_debug(self, debug): |
161 set_debug(debug) |
161 set_debug(debug) |
162 |
162 |
163 def _rqlhelper(self): |
163 def _rqlhelper(self): |
164 rqlhelper = self.o._rqlhelper |
164 rqlhelper = self.o._rqlhelper |
165 # reset uid_func so it don't try to get type from eids |
165 # reset uid_func so it don't try to get type from eids |
166 rqlhelper._analyser.uid_func = None |
166 rqlhelper._analyser.uid_func = None |
167 rqlhelper._analyser.uid_func_mapping = {} |
167 rqlhelper._analyser.uid_func_mapping = {} |
173 rqlhelper.compute_solutions(rqlst, kwargs=kwargs) |
173 rqlhelper.compute_solutions(rqlst, kwargs=kwargs) |
174 rqlhelper.simplify(rqlst) |
174 rqlhelper.simplify(rqlst) |
175 for select in rqlst.children: |
175 for select in rqlst.children: |
176 select.solutions.sort() |
176 select.solutions.sort() |
177 return self.o.plan_factory(rqlst, kwargs, self.session) |
177 return self.o.plan_factory(rqlst, kwargs, self.session) |
178 |
178 |
179 def _prepare(self, rql, kwargs=None): |
179 def _prepare(self, rql, kwargs=None): |
180 plan = self._prepare_plan(rql, kwargs) |
180 plan = self._prepare_plan(rql, kwargs) |
181 plan.preprocess(plan.rqlst) |
181 plan.preprocess(plan.rqlst) |
182 rqlst = plan.rqlst.children[0] |
182 rqlst = plan.rqlst.children[0] |
183 rqlst.solutions = remove_unused_solutions(rqlst, rqlst.solutions, {}, self.repo.schema)[0] |
183 rqlst.solutions = remove_unused_solutions(rqlst, rqlst.solutions, {}, self.repo.schema)[0] |
184 return rqlst |
184 return rqlst |
193 s._threaddata.pool = self.pool |
193 s._threaddata.pool = self.pool |
194 return u, s |
194 return u, s |
195 |
195 |
196 def execute(self, rql, args=None, eid_key=None, build_descr=True): |
196 def execute(self, rql, args=None, eid_key=None, build_descr=True): |
197 return self.o.execute(self.session, rql, args, eid_key, build_descr) |
197 return self.o.execute(self.session, rql, args, eid_key, build_descr) |
198 |
198 |
199 def commit(self): |
199 def commit(self): |
200 self.session.commit() |
200 self.session.commit() |
201 self.session.set_pool() |
201 self.session.set_pool() |
202 |
202 |
203 |
203 |
204 class BasePlannerTC(BaseQuerierTC): |
204 class BasePlannerTC(BaseQuerierTC): |
205 |
205 |
206 def _prepare_plan(self, rql, kwargs=None): |
206 def _prepare_plan(self, rql, kwargs=None): |
268 except ImportError: |
268 except ImportError: |
269 class PartPlanInformation(object): |
269 class PartPlanInformation(object): |
270 def merge_input_maps(self, *args): |
270 def merge_input_maps(self, *args): |
271 pass |
271 pass |
272 def _choose_term(self, sourceterms): |
272 def _choose_term(self, sourceterms): |
273 pass |
273 pass |
274 _orig_merge_input_maps = PartPlanInformation.merge_input_maps |
274 _orig_merge_input_maps = PartPlanInformation.merge_input_maps |
275 _orig_choose_term = PartPlanInformation._choose_term |
275 _orig_choose_term = PartPlanInformation._choose_term |
276 |
276 |
277 def _merge_input_maps(*args): |
277 def _merge_input_maps(*args): |
278 return sorted(_orig_merge_input_maps(*args)) |
278 return sorted(_orig_merge_input_maps(*args)) |
307 RQLRewriter.build_variantes = _orig_build_variantes |
307 RQLRewriter.build_variantes = _orig_build_variantes |
308 ExecutionPlan._check_permissions = _orig_check_permissions |
308 ExecutionPlan._check_permissions = _orig_check_permissions |
309 ExecutionPlan.init_temp_table = _orig_init_temp_table |
309 ExecutionPlan.init_temp_table = _orig_init_temp_table |
310 PartPlanInformation.merge_input_maps = _orig_merge_input_maps |
310 PartPlanInformation.merge_input_maps = _orig_merge_input_maps |
311 PartPlanInformation._choose_term = _orig_choose_term |
311 PartPlanInformation._choose_term = _orig_choose_term |
312 |
|