28 from logilab.common.testlib import SkipTest |
28 from logilab.common.testlib import SkipTest |
29 |
29 |
30 def tuplify(mylist): |
30 def tuplify(mylist): |
31 return [tuple(item) for item in mylist] |
31 return [tuple(item) for item in mylist] |
32 |
32 |
33 def snippet_cmp(a, b): |
33 def snippet_key(a): |
34 a = (a[0], [e.expression for e in a[1]]) |
34 # a[0] may be a dict or a key/value tuple |
35 b = (b[0], [e.expression for e in b[1]]) |
35 return (sorted(dict(a[0]).items()), [e.expression for e in a[1]]) |
36 return cmp(a, b) |
|
37 |
36 |
38 def test_plan(self, rql, expected, kwargs=None): |
37 def test_plan(self, rql, expected, kwargs=None): |
39 with self.session.new_cnx() as cnx: |
38 with self.session.new_cnx() as cnx: |
40 plan = self._prepare_plan(cnx, rql, kwargs) |
39 plan = self._prepare_plan(cnx, rql, kwargs) |
41 self.planner.build_plan(plan) |
40 self.planner.build_plan(plan) |
291 else: |
290 else: |
292 rqlst.solutions.sort() |
291 rqlst.solutions.sort() |
293 return self.o.plan_factory(rqlst, kwargs, cnx) |
292 return self.o.plan_factory(rqlst, kwargs, cnx) |
294 |
293 |
295 |
294 |
296 # monkey patch some methods to get predicatable results ####################### |
295 # monkey patch some methods to get predictable results ####################### |
297 |
296 |
298 from cubicweb import rqlrewrite |
297 from cubicweb import rqlrewrite |
299 _orig_iter_relations = rqlrewrite.iter_relations |
298 _orig_iter_relations = rqlrewrite.iter_relations |
300 _orig_insert_snippets = rqlrewrite.RQLRewriter.insert_snippets |
299 _orig_insert_snippets = rqlrewrite.RQLRewriter.insert_snippets |
301 _orig_build_variantes = rqlrewrite.RQLRewriter.build_variantes |
300 _orig_build_variantes = rqlrewrite.RQLRewriter.build_variantes |
302 |
301 |
303 def _insert_snippets(self, snippets, varexistsmap=None): |
302 def _insert_snippets(self, snippets, varexistsmap=None): |
304 _orig_insert_snippets(self, sorted(snippets, snippet_cmp), varexistsmap) |
303 _orig_insert_snippets(self, sorted(snippets, key=snippet_key), varexistsmap) |
305 |
304 |
306 def _build_variantes(self, newsolutions): |
305 def _build_variantes(self, newsolutions): |
307 variantes = _orig_build_variantes(self, newsolutions) |
306 variantes = _orig_build_variantes(self, newsolutions) |
308 sortedvariantes = [] |
307 sortedvariantes = [] |
309 for variante in variantes: |
308 for variante in variantes: |
310 orderedkeys = sorted((k[1], k[2], v) for k, v in variante.items()) |
309 orderedkeys = sorted((k[1], k[2], v) for k, v in variante.items()) |
311 variante = DumbOrderedDict(sorted(variante.items(), |
310 variante = DumbOrderedDict(sorted(variante.items(), |
312 lambda a, b: cmp((a[0][1],a[0][2],a[1]), |
311 key=lambda a: (a[0][1], a[0][2], a[1]))) |
313 (b[0][1],b[0][2],b[1])))) |
|
314 sortedvariantes.append( (orderedkeys, variante) ) |
312 sortedvariantes.append( (orderedkeys, variante) ) |
315 return [v for ok, v in sorted(sortedvariantes)] |
313 return [v for ok, v in sorted(sortedvariantes)] |
316 |
314 |
317 from cubicweb.server.querier import ExecutionPlan |
315 from cubicweb.server.querier import ExecutionPlan |
318 _orig_check_permissions = ExecutionPlan._check_permissions |
316 _orig_check_permissions = ExecutionPlan._check_permissions |
319 |
317 |
320 def _check_permissions(*args, **kwargs): |
318 def _check_permissions(*args, **kwargs): |
321 res, restricted = _orig_check_permissions(*args, **kwargs) |
319 res, restricted = _orig_check_permissions(*args, **kwargs) |
322 res = DumbOrderedDict(sorted(res.items(), lambda a, b: cmp(a[1], b[1]))) |
320 res = DumbOrderedDict(sorted(res.items(), key=lambda x: x[1])) |
323 return res, restricted |
321 return res, restricted |
324 |
322 |
325 def _dummy_check_permissions(self, rqlst): |
323 def _dummy_check_permissions(self, rqlst): |
326 return {(): rqlst.solutions}, set() |
324 return {(): rqlst.solutions}, set() |
327 |
325 |