20 This module contains functions to initialize a new repository. |
20 This module contains functions to initialize a new repository. |
21 """ |
21 """ |
22 |
22 |
23 __docformat__ = "restructuredtext en" |
23 __docformat__ = "restructuredtext en" |
24 |
24 |
|
25 from copy import deepcopy |
25 from pprint import pprint |
26 from pprint import pprint |
26 |
27 |
27 from logilab.common.decorators import clear_cache |
28 from logilab.common.decorators import clear_cache |
|
29 from logilab.common.testlib import SkipTest |
28 |
30 |
29 def tuplify(list): |
31 def tuplify(list): |
30 for i in range(len(list)): |
32 for i in range(len(list)): |
31 if type(list[i]) is not type(()): |
33 if type(list[i]) is not type(()): |
32 list[i] = tuple(list[i]) |
34 list[i] = tuple(list[i]) |
138 from logilab.database import get_db_helper |
140 from logilab.database import get_db_helper |
139 |
141 |
140 from rql import RQLHelper |
142 from rql import RQLHelper |
141 |
143 |
142 from cubicweb.devtools.fake import FakeRepo, FakeSession |
144 from cubicweb.devtools.fake import FakeRepo, FakeSession |
143 from cubicweb.server import set_debug |
145 from cubicweb.server import set_debug, debugged |
144 from cubicweb.server.querier import QuerierHelper |
146 from cubicweb.server.querier import QuerierHelper |
145 from cubicweb.server.session import Session |
147 from cubicweb.server.session import Session |
146 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions |
148 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions |
147 |
149 |
148 class RQLGeneratorTC(TestCase): |
150 class RQLGeneratorTC(TestCase): |
149 schema = backend = None # set this in concret test |
151 schema = backend = None # set this in concret test |
|
152 |
|
153 |
|
154 @classmethod |
|
155 def setUpClass(cls): |
|
156 if cls.backend is not None: |
|
157 try: |
|
158 cls.dbhelper = get_db_helper(cls.backend) |
|
159 except ImportError, ex: |
|
160 raise SkipTest(str(ex)) |
150 |
161 |
151 def setUp(self): |
162 def setUp(self): |
152 self.repo = FakeRepo(self.schema) |
163 self.repo = FakeRepo(self.schema) |
153 self.repo.system_source = mock_object(dbdriver=self.backend) |
164 self.repo.system_source = mock_object(dbdriver=self.backend) |
154 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
165 self.rqlhelper = RQLHelper(self.schema, special_relations={'eid': 'uid', |
156 backend=self.backend) |
167 backend=self.backend) |
157 self.qhelper = QuerierHelper(self.repo, self.schema) |
168 self.qhelper = QuerierHelper(self.repo, self.schema) |
158 ExecutionPlan._check_permissions = _dummy_check_permissions |
169 ExecutionPlan._check_permissions = _dummy_check_permissions |
159 rqlannotation._select_principal = _select_principal |
170 rqlannotation._select_principal = _select_principal |
160 if self.backend is not None: |
171 if self.backend is not None: |
161 try: |
172 self.o = SQLGenerator(self.schema, self.dbhelper) |
162 dbhelper = get_db_helper(self.backend) |
|
163 except ImportError, ex: |
|
164 self.skipTest(str(ex)) |
|
165 self.o = SQLGenerator(self.schema, dbhelper) |
|
166 |
173 |
167 def tearDown(self): |
174 def tearDown(self): |
168 ExecutionPlan._check_permissions = _orig_check_permissions |
175 ExecutionPlan._check_permissions = _orig_check_permissions |
169 rqlannotation._select_principal = _orig_select_principal |
176 rqlannotation._select_principal = _orig_select_principal |
170 |
177 |
171 def set_debug(self, debug): |
178 def set_debug(self, debug): |
172 set_debug(debug) |
179 set_debug(debug) |
|
180 def debugged(self, debug): |
|
181 return debugged(debug) |
173 |
182 |
174 def _prepare(self, rql): |
183 def _prepare(self, rql): |
175 #print '******************** prepare', rql |
184 #print '******************** prepare', rql |
176 union = self.rqlhelper.parse(rql) |
185 union = self.rqlhelper.parse(rql) |
177 #print '********* parsed', union.as_string() |
186 #print '********* parsed', union.as_string() |
219 self.repo._free_pool(self.pool) |
228 self.repo._free_pool(self.pool) |
220 assert self.session.user.eid != -1 |
229 assert self.session.user.eid != -1 |
221 |
230 |
222 def set_debug(self, debug): |
231 def set_debug(self, debug): |
223 set_debug(debug) |
232 set_debug(debug) |
|
233 def debugged(self, debug): |
|
234 return debugged(debug) |
224 |
235 |
225 def _rqlhelper(self): |
236 def _rqlhelper(self): |
226 rqlhelper = self.repo.vreg.rqlhelper |
237 rqlhelper = self.repo.vreg.rqlhelper |
227 # reset uid_func so it don't try to get type from eids |
238 # reset uid_func so it don't try to get type from eids |
228 rqlhelper._analyser.uid_func = None |
239 rqlhelper._analyser.uid_func = None |
282 do_monkey_patch() |
293 do_monkey_patch() |
283 self._dumb_sessions = [] # by hi-jacked parent setup |
294 self._dumb_sessions = [] # by hi-jacked parent setup |
284 self.repo.vreg.rqlhelper.backend = 'postgres' # so FTIRANK is considered |
295 self.repo.vreg.rqlhelper.backend = 'postgres' # so FTIRANK is considered |
285 |
296 |
286 def add_source(self, sourcecls, uri): |
297 def add_source(self, sourcecls, uri): |
287 self.sources.append(sourcecls(self.repo, self.o.schema, |
298 self.sources.append(sourcecls(self.repo, {'uri': uri})) |
288 {'uri': uri})) |
|
289 self.repo.sources_by_uri[uri] = self.sources[-1] |
299 self.repo.sources_by_uri[uri] = self.sources[-1] |
290 setattr(self, uri, self.sources[-1]) |
300 setattr(self, uri, self.sources[-1]) |
291 self.newsources += 1 |
301 self.newsources += 1 |
292 |
302 |
293 def tearDown(self): |
303 def tearDown(self): |
362 |
372 |
363 try: |
373 try: |
364 from cubicweb.server.msplanner import PartPlanInformation |
374 from cubicweb.server.msplanner import PartPlanInformation |
365 except ImportError: |
375 except ImportError: |
366 class PartPlanInformation(object): |
376 class PartPlanInformation(object): |
367 def merge_input_maps(self, *args): |
377 def merge_input_maps(self, *args, **kwargs): |
368 pass |
378 pass |
369 def _choose_term(self, sourceterms): |
379 def _choose_term(self, sourceterms): |
370 pass |
380 pass |
371 _orig_merge_input_maps = PartPlanInformation.merge_input_maps |
381 _orig_merge_input_maps = PartPlanInformation.merge_input_maps |
372 _orig_choose_term = PartPlanInformation._choose_term |
382 _orig_choose_term = PartPlanInformation._choose_term |
373 |
383 |
374 def _merge_input_maps(*args): |
384 def _merge_input_maps(*args, **kwargs): |
375 return sorted(_orig_merge_input_maps(*args)) |
385 return sorted(_orig_merge_input_maps(*args, **kwargs)) |
376 |
386 |
377 def _choose_term(self, sourceterms): |
387 def _choose_term(self, source, sourceterms): |
378 # predictable order for test purpose |
388 # predictable order for test purpose |
379 def get_key(x): |
389 def get_key(x): |
380 try: |
390 try: |
381 # variable |
391 # variable |
382 return x.name |
392 return x.name |
385 # relation |
395 # relation |
386 return x.r_type |
396 return x.r_type |
387 except AttributeError: |
397 except AttributeError: |
388 # const |
398 # const |
389 return x.value |
399 return x.value |
390 return _orig_choose_term(self, DumbOrderedDict2(sourceterms, get_key)) |
400 return _orig_choose_term(self, source, DumbOrderedDict2(sourceterms, get_key)) |
391 |
401 |
|
402 from cubicweb.server.sources.pyrorql import PyroRQLSource |
|
403 _orig_syntax_tree_search = PyroRQLSource.syntax_tree_search |
|
404 |
|
405 def _syntax_tree_search(*args, **kwargs): |
|
406 return deepcopy(_orig_syntax_tree_search(*args, **kwargs)) |
392 |
407 |
393 def do_monkey_patch(): |
408 def do_monkey_patch(): |
394 RQLRewriter.insert_snippets = _insert_snippets |
409 RQLRewriter.insert_snippets = _insert_snippets |
395 RQLRewriter.build_variantes = _build_variantes |
410 RQLRewriter.build_variantes = _build_variantes |
396 ExecutionPlan._check_permissions = _check_permissions |
411 ExecutionPlan._check_permissions = _check_permissions |
397 ExecutionPlan.tablesinorder = None |
412 ExecutionPlan.tablesinorder = None |
398 ExecutionPlan.init_temp_table = _init_temp_table |
413 ExecutionPlan.init_temp_table = _init_temp_table |
399 PartPlanInformation.merge_input_maps = _merge_input_maps |
414 PartPlanInformation.merge_input_maps = _merge_input_maps |
400 PartPlanInformation._choose_term = _choose_term |
415 PartPlanInformation._choose_term = _choose_term |
|
416 PyroRQLSource.syntax_tree_search = _syntax_tree_search |
401 |
417 |
402 def undo_monkey_patch(): |
418 def undo_monkey_patch(): |
403 RQLRewriter.insert_snippets = _orig_insert_snippets |
419 RQLRewriter.insert_snippets = _orig_insert_snippets |
404 RQLRewriter.build_variantes = _orig_build_variantes |
420 RQLRewriter.build_variantes = _orig_build_variantes |
405 ExecutionPlan._check_permissions = _orig_check_permissions |
421 ExecutionPlan._check_permissions = _orig_check_permissions |
406 ExecutionPlan.init_temp_table = _orig_init_temp_table |
422 ExecutionPlan.init_temp_table = _orig_init_temp_table |
407 PartPlanInformation.merge_input_maps = _orig_merge_input_maps |
423 PartPlanInformation.merge_input_maps = _orig_merge_input_maps |
408 PartPlanInformation._choose_term = _orig_choose_term |
424 PartPlanInformation._choose_term = _orig_choose_term |
|
425 PyroRQLSource.syntax_tree_search = _orig_syntax_tree_search |