cubicweb/test/unittest_rqlrewrite.py
author Laurent Wouters <lwouters@cenotelie.fr>
Tue, 24 Apr 2018 10:19:42 +0200
branch3.26
changeset 12430 5b6f54f6033a
parent 12178 4cf9f257e0bf
child 12496 ad995a9905f9
permissions -rw-r--r--
[server] Fixed issue with the adapters cache of a cloned EditedEntity The adapters' cache of the entity within an EditedEntity used to be copied along the entity itself during a cloning operation of the EditedEntity. This raises an issue when the adapters' cache is not empty and contains cached values linking to transaction-specific data (or the transaction itself). This prevents the clone EditedEntity being used in a transaction outside the one that created it. This change resets the adapters' cache of the new copy so that no cached value remain. The new copy can then be used in a new transaction afterwards.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11269
diff changeset
     1
# copyright 2003-2016 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4908
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
1977
606923dff11b big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1787
diff changeset
    18
10612
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9955
diff changeset
    19
from six import string_types
84468b90e9c1 [py3k] basestring → six.string_types
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9955
diff changeset
    20
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
from logilab.common.testlib import mock_object
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    22
from logilab.common.decorators import monkeypatch
4908
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
    23
from yams import BadSchemaDefinition
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    24
from yams.buildobjs import RelationDefinition
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
from rql import parse, nodes, RQLHelper
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
11768
b8b71dd09a2c [test] Avoid pytest discovery warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
    27
from cubicweb import Unauthorized, rqlrewrite, devtools
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    28
from cubicweb.rqlrewrite import RQLRewriter
5582
3e133b29a1a4 [rql2sql] follow rql 0.26.1 changes: NOT nodes normalization, allowing simplification of sql generation, and fix #XXX
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
    29
from cubicweb.schema import RRQLExpression, ERQLExpression
11768
b8b71dd09a2c [test] Avoid pytest discovery warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
    30
from cubicweb.devtools import repotest
12177
8cc3af4d9c3a [cleanup] Use plain unittest main in unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12176
diff changeset
    31
from cubicweb.devtools.testlib import CubicWebTC, TestCase
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
6781
5062d86d6ffe [unittest2] use unittest2 module fixture api
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6640
diff changeset
    34
def setUpModule(*args):
6640
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    35
    global rqlhelper, schema
11768
b8b71dd09a2c [test] Avoid pytest discovery warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11767
diff changeset
    36
    config = devtools.TestServerConfiguration('data-rewrite', __file__)
6640
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    37
    config.bootstrap_cubes()
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    38
    schema = config.load_schema()
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
    39
    schema.add_relation_def(RelationDefinition(subject='Card', name='in_state',
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
    40
                                               object='State', cardinality='1*'))
6640
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    41
    rqlhelper = RQLHelper(schema, special_relations={'eid': 'uid',
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    42
                                                     'has_text': 'fti'})
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
    repotest.do_monkey_patch()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    45
6781
5062d86d6ffe [unittest2] use unittest2 module fixture api
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6640
diff changeset
    46
def tearDownModule(*args):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    repotest.undo_monkey_patch()
6640
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    48
    global rqlhelper, schema
4c4616c02f69 [test] more cwd independant tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6340
diff changeset
    49
    del rqlhelper, schema
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
    50
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    51
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
def eid_func_map(eid):
1398
5fe84a5f7035 rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents: 47
diff changeset
    53
    return {1: 'CWUser',
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
    54
            2: 'Card',
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
    55
            3: 'Affaire'}[eid]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    57
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    58
def _prepare_rewriter(rewriter_cls, kwargs):
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    59
    class FakeVReg:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
        schema = schema
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    61
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
        @staticmethod
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    63
        def solutions(sqlcursor, rqlst, kwargs):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
            rqlhelper.compute_solutions(rqlst, {'eid': eid_func_map}, kwargs=kwargs)
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    65
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    66
        class rqlhelper:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
            @staticmethod
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
            def annotate(rqlst):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
                rqlhelper.annotate(rqlst)
12178
4cf9f257e0bf [cleanup] Drop useless fake function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12177
diff changeset
    70
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    71
    return rewriter_cls(mock_object(vreg=FakeVReg, user=(mock_object(eid=1))))
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    72
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
    73
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    74
def rewrite(rqlst, snippets_map, kwargs, existingvars=None):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
    75
    rewriter = _prepare_rewriter(rqlrewrite.RQLRewriter, kwargs)
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    76
    # turn {(V1, V2): constraints} into [(varmap, constraints)]
7139
20807d3d7cf6 [rql rewriter] to properly handle 'relation' rql expressions, rql rewriter must support multiple variables (eg S and O) at once to be given as varmap
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6781
diff changeset
    77
    snippets = []
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    78
    snippet_varmap = {}
7850
d14b77c42b06 [test] sort to avoid random failure due to dict order
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7843
diff changeset
    79
    for v, exprs in sorted(snippets_map.items()):
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    80
        rqlexprs = []
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    81
        varmap = dict([v])
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    82
        for snippet in exprs:
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    83
            # when the same snippet is impacting several variables, group them
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    84
            # unless there is some conflicts on the snippet's variable name (we
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    85
            # only want that for constraint on relations using both S and O)
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    86
            if snippet in snippet_varmap and not (
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    87
                    set(varmap.values()) & set(snippet_varmap[snippet].values())):
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    88
                snippet_varmap[snippet].update(varmap)
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    89
                continue
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    90
            snippet_varmap[snippet] = varmap
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    91
            if isinstance(snippet, string_types):
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    92
                snippet = mock_object(snippet_rqlst=parse(u'Any X WHERE ' + snippet).children[0],
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    93
                                      expression=u'Any X WHERE ' + snippet)
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    94
            rqlexprs.append(snippet)
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    95
        if rqlexprs:
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    96
            snippets.append((varmap, rqlexprs))
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
    97
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
    rqlhelper.compute_solutions(rqlst.children[0], {'eid': eid_func_map}, kwargs=kwargs)
9188
0677e03077fb [rqlrewrite] rewrite doesn't need a solutions argument, always use the Select'ones
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9170
diff changeset
    99
    rewriter.rewrite(rqlst.children[0], snippets, kwargs, existingvars)
11250
597f02c5cf5a [tox] Use py.test to run tests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   100
    check_vrefs(rqlst.children[0])
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
    return rewriter.rewritten
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   103
11250
597f02c5cf5a [tox] Use py.test to run tests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   104
def check_vrefs(node):
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   105
    vrefmaps = {}
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   106
    selects = []
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
    for vref in node.iget_nodes(nodes.VariableRef):
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   108
        stmt = vref.stmt
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   109
        try:
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   110
            vrefmaps[stmt].setdefault(vref.name, set()).add(vref)
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   111
        except KeyError:
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   112
            vrefmaps[stmt] = {vref.name: set((vref,))}
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   113
            selects.append(stmt)
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   114
    assert node in selects, (node, selects)
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   115
    for stmt in selects:
10663
54b8a1f249fb [py3k] dict.itervalues → dict.values
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10654
diff changeset
   116
        for var in stmt.defined_vars.values():
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   117
            assert var.stinfo['references']
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   118
            vrefmap = vrefmaps[stmt]
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   119
            assert not (var.stinfo['references'] ^ vrefmap[var.name]), (
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   120
                node.as_string(), var, var.stinfo['references'], vrefmap[var.name])
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   121
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   123
class RQLRewriteTC(TestCase):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   124
    """a faire:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
    * optimisation: detecter les relations utilisees dans les rqlexpressions qui
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
      sont presentes dans la requete de depart pour les reutiliser si possible
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   128
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   129
    * "has_<ACTION>_permission" ?
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   130
    """
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   131
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
    def test_base_var(self):
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   133
        constraint = ('X in_state S, U in_group G, P require_state S,'
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   134
                      'P name "read", P require_group G')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   135
        rqlst = parse(u'Card C')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   136
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   137
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   138
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   139
            u'Any C WHERE C is Card, B eid %(D)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   140
            'EXISTS(C in_state A, B in_group E, F require_state A, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   141
            'F name "read", F require_group E, A is State, E is CWGroup, F is CWPermission)')
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   142
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
    def test_multiple_var(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
        card_constraint = ('X in_state S, U in_group G, P require_state S,'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
                           'P name "read", P require_group G')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   146
        affaire_constraints = ('X ref LIKE "PUBLIC%"', 'U in_group G, G name "public"')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   147
        kwargs = {'u': 2}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   148
        rqlst = parse(u'Any S WHERE S documented_by C, C eid %(u)s')
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
   149
        rewrite(rqlst, {('C', 'X'): (card_constraint,), ('S', 'X'): affaire_constraints},
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
                kwargs)
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   151
        self.assertMultiLineEqual(
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   152
            rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   153
            u'Any S WHERE S documented_by C, C eid %(u)s, B eid %(D)s, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   154
            'EXISTS(C in_state A, B in_group E, F require_state A, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   155
            'F name "read", F require_group E, A is State, E is CWGroup, F is CWPermission), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   156
            '(EXISTS(S ref LIKE "PUBLIC%")) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   157
            'OR (EXISTS(B in_group G, G name "public", G is CWGroup)), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   158
            'S is Affaire')
9674
96549de9dd70 [test] use assertIn where appropriate
Julien Cristau <julien.cristau@logilab.fr>
parents: 9655
diff changeset
   159
        self.assertIn('D', kwargs)
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   160
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   161
    def test_or(self):
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   162
        constraint = (
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   163
            '(X identity U) OR '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   164
            '(X in_state ST, CL identity U, CL in_state ST, ST name "subscribed")'
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   165
        )
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   166
        rqlst = parse(u'Any S WHERE S owned_by C, C eid %(u)s, S is in (CWUser, CWGroup)')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   167
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {'u': 1})
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   168
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   169
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   170
            'Any S WHERE S owned_by C, C eid %(u)s, S is IN(CWUser, CWGroup), A eid %(B)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   171
            'EXISTS((C identity A) OR (C in_state D, E identity A, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   172
            'E in_state D, D name "subscribed"), D is State, E is CWUser)')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
    def test_simplified_rqlst(self):
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   175
        constraint = ('X in_state S, U in_group G, P require_state S,'
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   176
                      'P name "read", P require_group G')
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   177
        rqlst = parse(u'Any 2')  # this is the simplified rql st for Any X WHERE X eid 12
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   178
        rewrite(rqlst, {('2', 'X'): (constraint,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   179
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   180
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   181
            u'Any 2 WHERE B eid %(C)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   182
            'EXISTS(2 in_state A, B in_group D, E require_state A, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   183
            'E name "read", E require_group D, A is State, D is CWGroup, E is CWPermission)')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   184
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   185
    def test_optional_var_1(self):
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   186
        constraint = ('X in_state S, U in_group G, P require_state S,'
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   187
                      'P name "read", P require_group G')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   188
        rqlst = parse(u'Any A,C WHERE A documented_by C?')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   189
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   190
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   191
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   192
            u'Any A,C WHERE A documented_by C?, A is Affaire '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   193
            'WITH C BEING '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   194
            '(Any C WHERE EXISTS(C in_state B, D in_group F, G require_state B, G name "read", '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   195
            'G require_group F), D eid %(A)s, C is Card)')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   196
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   197
    def test_optional_var_2(self):
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   198
        constraint = ('X in_state S, U in_group G, P require_state S,'
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   199
                      'P name "read", P require_group G')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   200
        rqlst = parse(u'Any A,C,T WHERE A documented_by C?, C title T')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   201
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   202
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   203
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   204
            u'Any A,C,T WHERE A documented_by C?, A is Affaire '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   205
            'WITH C,T BEING '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   206
            '(Any C,T WHERE C title T, EXISTS(C in_state B, D in_group F, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   207
            'G require_state B, G name "read", G require_group F), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   208
            'D eid %(A)s, C is Card)')
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   209
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   210
    def test_optional_var_3(self):
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   211
        constraint1 = ('X in_state S, U in_group G, P require_state S,'
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   212
                       'P name "read", P require_group G')
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   213
        constraint2 = 'X in_state S, S name "public"'
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   214
        rqlst = parse(u'Any A,C,T WHERE A documented_by C?, C title T')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   215
        rewrite(rqlst, {('C', 'X'): (constraint1, constraint2)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   216
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   217
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   218
            u'Any A,C,T WHERE A documented_by C?, A is Affaire '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   219
            'WITH C,T BEING (Any C,T WHERE C title T, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   220
            '(EXISTS(C in_state B, D in_group F, G require_state B, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   221
            'G name "read", G require_group F)) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   222
            'OR (EXISTS(C in_state E, E name "public")), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   223
            'D eid %(A)s, C is Card)')
7535
d5725a89dac9 [rqlrewrite] test and fix rql snippets insertion when several snippets match an optional variable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7251
diff changeset
   224
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   225
    def test_optional_var_4(self):
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   226
        constraint1 = 'A created_by U, X documented_by A'
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   227
        constraint2 = 'A created_by U, X concerne A'
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   228
        constraint3 = 'X created_by U'
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   229
        rqlst = parse(u'Any X,LA,Y WHERE LA? documented_by X, LA concerne Y')
7555
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   230
        rewrite(rqlst, {('LA', 'X'): (constraint1, constraint2),
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   231
                        ('X', 'X'): (constraint3,),
c3bf459268d7 [rqlrewrite] closes #1772135: 1. don't try to reuse a relation from another statement (eg because a subquery has been introduced) 2. _use_orig_term should consider the current statement
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7535
diff changeset
   232
                        ('Y', 'X'): (constraint3,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   233
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   234
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   235
            u'Any X,LA,Y WHERE LA? documented_by X, LA concerne Y, B eid %(C)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   236
            'EXISTS(X created_by B), EXISTS(Y created_by B), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   237
            'X is Card, Y is IN(Division, Note, Societe) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   238
            'WITH LA BEING (Any LA WHERE (EXISTS(A created_by B, LA documented_by A)) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   239
            'OR (EXISTS(E created_by B, LA concerne E)), '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   240
            'B eid %(D)s, LA is Affaire)')
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   241
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   242
    def test_ambiguous_optional_same_exprs(self):
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   243
        """See #3013535"""
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   244
        # see test of the same name in RewriteFullTC: original problem is
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   245
        # unreproducible here because it actually lies in
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   246
        # RQLRewriter.insert_local_checks
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   247
        rqlst = parse(u'Any A,AR,X,CD WHERE A concerne X?, A ref AR, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   248
                      'A eid %(a)s, X creation_date CD')
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   249
        rewrite(rqlst, {('X', 'X'): ('X created_by U',)}, {'a': 3})
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   250
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   251
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   252
            u'Any A,AR,X,CD WHERE A concerne X?, A ref AR, A eid %(a)s '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   253
            'WITH X,CD BEING (Any X,CD WHERE X creation_date CD, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   254
            'EXISTS(X created_by B), B eid %(A)s, X is IN(Division, Note, Societe))')
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   255
11855
e6cdc4d3add5 [rqlrewrite] Test and fix potential NameError
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11768
diff changeset
   256
    def test_ambiguous_optional_same_exprs_constant(self):
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   257
        rqlst = parse(u'Any A,AR,X WHERE A concerne X?, A ref AR, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   258
                      'A eid %(a)s, X creation_date TODAY')
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   259
        rewrite(rqlst, {('X', 'X'): ('X created_by U',)}, {'a': 3})
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   260
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   261
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   262
            u'Any A,AR,X WHERE A concerne X?, A ref AR, A eid %(a)s '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   263
            'WITH X BEING (Any X WHERE X creation_date TODAY, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   264
            'EXISTS(X created_by B), B eid %(A)s, X is IN(Division, Note, Societe))')
11855
e6cdc4d3add5 [rqlrewrite] Test and fix potential NameError
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11768
diff changeset
   265
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   266
    def test_optional_var_inlined(self):
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   267
        c1 = ('X require_permission P')
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   268
        c2 = ('X inlined_card O, O require_permission P')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   269
        rqlst = parse(u'Any C,A,R WHERE A? inlined_card C, A ref R')
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   270
        rewrite(rqlst, {('C', 'X'): (c1,),
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   271
                        ('A', 'X'): (c2,),
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   272
                        }, {})
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   273
        # XXX suboptimal
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   274
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   275
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   276
            "Any C,A,R WITH A,C,R BEING "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   277
            "(Any A,C,R WHERE A? inlined_card C, A ref R, "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   278
            "(A is NULL) OR (EXISTS(A inlined_card B, B require_permission D, "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   279
            "B is Card, D is CWPermission)), "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   280
            "A is Affaire, C is Card, EXISTS(C require_permission E, E is CWPermission))")
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   281
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   282
    # def test_optional_var_inlined_has_perm(self):
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   283
    #     c1 = ('X require_permission P')
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   284
    #     c2 = ('X inlined_card O, U has_read_permission O')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   285
    #     rqlst = parse(u'Any C,A,R WHERE A? inlined_card C, A ref R')
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   286
    #     rewrite(rqlst, {('C', 'X'): (c1,),
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   287
    #                     ('A', 'X'): (c2,),
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   288
    #                     }, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   289
    #     self.assertEqual(rqlst.as_string(),
4907
e623afd49356 [rql rewriting] handle case where we've and optional inlined relation in the original query. Also, we should append EXISTS even in subquery to avoid inserting duplicates in results
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   290
    #                          "")
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   291
4908
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   292
    def test_optional_var_inlined_imbricated_error(self):
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   293
        c1 = ('X require_permission P')
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   294
        c2 = ('X inlined_card O, O require_permission P')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   295
        rqlst = parse(u'Any C,A,R,A2,R2 WHERE A? inlined_card C, A ref R,'
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   296
                      'A2? inlined_card C, A2 ref R2')
4908
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   297
        self.assertRaises(BadSchemaDefinition,
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   298
                          rewrite, rqlst, {('C', 'X'): (c1,),
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   299
                                           ('A', 'X'): (c2,),
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   300
                                           ('A2', 'X'): (c2,),
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   301
                                           }, {})
b3ad329cbe17 [rql rewrite] until a better solution is found raise BadSchemaDefinition when two inlined relations with security on an optional variable is used, explaining how to bypass it
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4907
diff changeset
   302
7843
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   303
    def test_optional_var_inlined_linked(self):
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   304
        c1 = ('X require_permission P')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   305
        rqlst = parse(u'Any A,W WHERE A inlined_card C?, C inlined_note N, '
7843
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   306
                      'N inlined_affaire W')
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   307
        rewrite(rqlst, {('C', 'X'): (c1,)}, {})
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   308
        self.assertEqual(rqlst.as_string(),
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   309
                         'Any A,W WHERE A inlined_card C?, A is Affaire '
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   310
                         'WITH C,N,W BEING (Any C,N,W WHERE C inlined_note N, '
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   311
                         'N inlined_affaire W, EXISTS(C require_permission B), '
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   312
                         'C is Card, N is Note, W is Affaire)')
7843
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   313
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   314
    def test_relation_optimization_1_lhs(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   315
        # since Card in_state State as monovalued cardinality, the in_state
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   316
        # relation used in the rql expression can be ignored and S replaced by
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   317
        # the variable from the incoming query
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   318
        snippet = ('X in_state S, S name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   319
        rqlst = parse(u'Card C WHERE C in_state STATE')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   320
        rewrite(rqlst, {('C', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   321
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   322
                         'Any C WHERE C in_state STATE, C is Card, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   323
                         'EXISTS(STATE name "hop"), STATE is State')
7843
3b51806da60b [rqlrewrite] if inlined relation has to be moved to a subquery, take care of the object of the relation (closes #1945725)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7555
diff changeset
   324
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   325
    def test_relation_optimization_1_rhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   326
        snippet = ('TW subworkflow_exit X, TW name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   327
        rqlst = parse(u'WorkflowTransition C WHERE C subworkflow_exit EXIT')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   328
        rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   329
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   330
                         'Any C WHERE C subworkflow_exit EXIT, C is WorkflowTransition, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   331
                         'EXISTS(C name "hop"), EXIT is SubWorkflowExitPoint')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   332
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   333
    def test_relation_optimization_2_lhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   334
        # optional relation can be shared if also optional in the snippet
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   335
        snippet = ('X in_state S?, S name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   336
        rqlst = parse(u'Card C WHERE C in_state STATE?')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   337
        rewrite(rqlst, {('C', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   338
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   339
                         'Any C WHERE C in_state STATE?, C is Card, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   340
                         'EXISTS(STATE name "hop"), STATE is State')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   341
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   342
    def test_relation_optimization_2_rhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   343
        snippet = ('TW? subworkflow_exit X, TW name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   344
        rqlst = parse(u'SubWorkflowExitPoint EXIT WHERE C? subworkflow_exit EXIT')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   345
        rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   346
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   347
                         'Any EXIT WHERE C? subworkflow_exit EXIT, EXIT is SubWorkflowExitPoint, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   348
                         'EXISTS(C name "hop"), C is WorkflowTransition')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   349
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   350
    def test_relation_optimization_3_lhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   351
        # optional relation in the snippet but not in the orig tree can be shared
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   352
        snippet = ('X in_state S?, S name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   353
        rqlst = parse(u'Card C WHERE C in_state STATE')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   354
        rewrite(rqlst, {('C', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   355
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   356
                         'Any C WHERE C in_state STATE, C is Card, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   357
                         'EXISTS(STATE name "hop"), STATE is State')
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   358
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   359
    def test_relation_optimization_3_rhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   360
        snippet = ('TW? subworkflow_exit X, TW name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   361
        rqlst = parse(u'WorkflowTransition C WHERE C subworkflow_exit EXIT')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   362
        rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   363
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   364
                         'Any C WHERE C subworkflow_exit EXIT, C is WorkflowTransition, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   365
                         'EXISTS(C name "hop"), EXIT is SubWorkflowExitPoint')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   366
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   367
    def test_relation_non_optimization_1_lhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   368
        # but optional relation in the orig tree but not in the snippet can't be shared
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   369
        snippet = ('X in_state S, S name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   370
        rqlst = parse(u'Card C WHERE C in_state STATE?')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   371
        rewrite(rqlst, {('C', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   372
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   373
                         'Any C WHERE C in_state STATE?, C is Card, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   374
                         'EXISTS(C in_state A, A name "hop", A is State), STATE is State')
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   375
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   376
    def test_relation_non_optimization_1_rhs(self):
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   377
        snippet = ('TW subworkflow_exit X, TW name "hop"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   378
        rqlst = parse(u'SubWorkflowExitPoint EXIT WHERE C? subworkflow_exit EXIT')
3443
34e451da9b5d [security] test and fix/refactor optimization of optional varialbe when rewriting rql
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3240
diff changeset
   379
        rewrite(rqlst, {('EXIT', 'X'): (snippet,)}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   380
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   381
                         'Any EXIT WHERE C? subworkflow_exit EXIT, EXIT is SubWorkflowExitPoint, '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   382
                         'EXISTS(A subworkflow_exit EXIT, A name "hop", A is WorkflowTransition), '
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   383
                         'C is WorkflowTransition')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   384
9170
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   385
    def test_relation_non_optimization_2(self):
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   386
        """See #3024730"""
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   387
        # 'X inlined_note N' must not be shared with 'C inlined_note N'
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   388
        # previously inserted, else this may introduce duplicated results, as N
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   389
        # will then be shared by multiple EXISTS and so at SQL generation time,
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   390
        # the table will be in the FROM clause of the outermost query
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   391
        rqlst = parse(u'Any A,C WHERE A inlined_card C')
9170
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   392
        rewrite(rqlst, {('A', 'X'): ('X inlined_card C, C inlined_note N, N owned_by U',),
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   393
                        ('C', 'X'): ('X inlined_note N, N owned_by U',)}, {})
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   394
        self.assertEqual(rqlst.as_string(),
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   395
                         'Any A,C WHERE A inlined_card C, D eid %(E)s, '
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   396
                         'EXISTS(C inlined_note B, B owned_by D, B is Note), '
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   397
                         'EXISTS(C inlined_note F, F owned_by D, F is Note), '
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   398
                         'A is Affaire, C is Card')
e6fe77dbcfdf [rql rewrite] may_be_shared_with should consider relation's scope (closes #3024730)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9168
diff changeset
   399
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   400
    def test_unsupported_constraint_1(self):
1398
5fe84a5f7035 rename internal entity types to have CW prefix instead of E
sylvain.thenault@logilab.fr
parents: 47
diff changeset
   401
        # CWUser doesn't have require_permission
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   402
        trinfo_constraint = ('X wf_info_for Y, Y require_permission P, P name "read"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   403
        rqlst = parse(u'Any U,T WHERE U is CWUser, T wf_info_for U')
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
   404
        self.assertRaises(Unauthorized, rewrite, rqlst, {('T', 'X'): (trinfo_constraint,)}, {})
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   405
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   406
    def test_unsupported_constraint_2(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   407
        trinfo_constraint = ('X wf_info_for Y, Y require_permission P, P name "read"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   408
        rqlst = parse(u'Any U,T WHERE U is CWUser, T wf_info_for U')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   409
        rewrite(rqlst, {('T', 'X'): (trinfo_constraint,
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   410
                                     'X wf_info_for Y, Y in_group G, G name "managers"')}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   411
        self.assertEqual(rqlst.as_string(),
10654
d6d9913753d2 [test] use unicode for rql queries (1/7)
Julien Cristau <julien.cristau@logilab.fr>
parents: 10612
diff changeset
   412
                         u'Any U,T WHERE U is CWUser, T wf_info_for U, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   413
                         u'EXISTS(U in_group B, B name "managers", B is CWGroup), T is TrInfo')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   414
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   415
    def test_unsupported_constraint_3(self):
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6337
diff changeset
   416
        self.skipTest('raise unauthorized for now')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   417
        trinfo_constraint = ('X wf_info_for Y, Y require_permission P, P name "read"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   418
        rqlst = parse(u'Any T WHERE T wf_info_for X')
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
   419
        rewrite(rqlst, {('T', 'X'): (trinfo_constraint, 'X in_group G, G name "managers"')}, {})
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   420
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   421
                         u'XXX dunno what should be generated')
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   422
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   423
    def test_add_ambiguity_exists(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   424
        constraint = ('X concerne Y')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   425
        rqlst = parse(u'Affaire X')
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
   426
        rewrite(rqlst, {('X', 'X'): (constraint,)}, {})
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   427
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   428
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   429
            u"Any X WHERE X is Affaire, ((EXISTS(X concerne A, A is Division)) "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   430
            "OR (EXISTS(X concerne C, C is Societe))) OR (EXISTS(X concerne B, B is Note))")
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   431
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   432
    def test_add_ambiguity_outerjoin(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   433
        constraint = ('X concerne Y')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   434
        rqlst = parse(u'Any X,C WHERE X? documented_by C')
3240
8604a15995d1 refactor so that rql rewriter may be used outside the server. Enhance it to be usable for RRQLExpression as well
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
   435
        rewrite(rqlst, {('X', 'X'): (constraint,)}, {})
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   436
        # ambiguity are kept in the sub-query, no need to be resolved using OR
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   437
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   438
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   439
            u"Any X,C WHERE X? documented_by C, C is Card "
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   440
            "WITH X BEING (Any X WHERE EXISTS(X concerne A), X is Affaire)")
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   441
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   442
    def test_rrqlexpr_nonexistant_subject_1(self):
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   443
        constraint = RRQLExpression('S owned_by U')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   444
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   445
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   446
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   447
                         u"Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)")
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   448
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   449
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   450
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   451
                         u"Any C WHERE C is Card")
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   452
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   453
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SOU')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   454
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   455
                         u"Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)")
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   456
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   457
    def test_rrqlexpr_nonexistant_subject_2(self):
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   458
        constraint = RRQLExpression('S owned_by U, O owned_by U, O is Card')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   459
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   460
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   461
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   462
                         'Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A)')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   463
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   464
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   465
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   466
                         'Any C WHERE C is Card, B eid %(D)s, EXISTS(A owned_by B, A is Card)')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   467
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   468
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SOU')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   469
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   470
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   471
            'Any C WHERE C is Card, A eid %(B)s, EXISTS(C owned_by A, D owned_by A, D is Card)')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   472
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   473
    def test_rrqlexpr_nonexistant_subject_3(self):
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   474
        constraint = RRQLExpression('U in_group G, G name "users"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   475
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   476
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   477
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   478
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   479
            u'Any C WHERE C is Card, A eid %(B)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   480
            'EXISTS(A in_group D, D name "users", D is CWGroup)')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   481
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   482
    def test_rrqlexpr_nonexistant_subject_4(self):
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   483
        constraint = RRQLExpression('U in_group G, G name "users", S owned_by U')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   484
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   485
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'SU')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   486
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   487
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   488
            u'Any C WHERE C is Card, A eid %(B)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   489
            'EXISTS(A in_group D, D name "users", C owned_by A, D is CWGroup)')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   490
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   491
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'OU')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   492
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   493
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   494
            u'Any C WHERE C is Card, A eid %(B)s, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   495
            'EXISTS(A in_group D, D name "users", D is CWGroup)')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   496
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   497
    def test_rrqlexpr_nonexistant_subject_5(self):
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   498
        constraint = RRQLExpression('S owned_by Z, O owned_by Z, O is Card')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   499
        rqlst = parse(u'Card C')
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   500
        rewrite(rqlst, {('C', 'S'): (constraint,)}, {}, 'S')
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7790
diff changeset
   501
        self.assertEqual(rqlst.as_string(),
8113
1e8c92202f44 [test] reindent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7868
diff changeset
   502
                         u"Any C WHERE C is Card, EXISTS(C owned_by A, A is CWUser)")
3826
0c0c051863cb close #511810: bad rql generated when looking for vocabulary for a relation on an entity which doesn't exist (yet)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3443
diff changeset
   503
7251
163a2eab0e55 [rql rewrite] backout 7177:f2a976cf7dac : since EXISTS is the variable scope, we want to insert snippets here anyway (other solution would be to NOT insert snippets at all in such case). Closes #1625464
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7139
diff changeset
   504
    def test_rqlexpr_not_relation_1_1(self):
9262
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   505
        constraint = ERQLExpression('X owned_by Z, Z login "hop"', 'X')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   506
        rqlst = parse(u'Affaire A WHERE NOT EXISTS(A documented_by C)')
5582
3e133b29a1a4 [rql2sql] follow rql 0.26.1 changes: NOT nodes normalization, allowing simplification of sql generation, and fix #XXX
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
   507
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {}, 'X')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   508
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   509
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   510
            u'Any A WHERE NOT EXISTS(A documented_by C, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   511
            'EXISTS(C owned_by B, B login "hop", B is CWUser), C is Card), A is Affaire')
5582
3e133b29a1a4 [rql2sql] follow rql 0.26.1 changes: NOT nodes normalization, allowing simplification of sql generation, and fix #XXX
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
   512
7251
163a2eab0e55 [rql rewrite] backout 7177:f2a976cf7dac : since EXISTS is the variable scope, we want to insert snippets here anyway (other solution would be to NOT insert snippets at all in such case). Closes #1625464
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7139
diff changeset
   513
    def test_rqlexpr_not_relation_1_2(self):
9262
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   514
        constraint = ERQLExpression('X owned_by Z, Z login "hop"', 'X')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   515
        rqlst = parse(u'Affaire A WHERE NOT EXISTS(A documented_by C)')
7251
163a2eab0e55 [rql rewrite] backout 7177:f2a976cf7dac : since EXISTS is the variable scope, we want to insert snippets here anyway (other solution would be to NOT insert snippets at all in such case). Closes #1625464
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7139
diff changeset
   516
        rewrite(rqlst, {('A', 'X'): (constraint,)}, {}, 'X')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   517
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   518
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   519
            u'Any A WHERE NOT EXISTS(A documented_by C, C is Card), A is Affaire, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   520
            'EXISTS(A owned_by B, B login "hop", B is CWUser)')
7251
163a2eab0e55 [rql rewrite] backout 7177:f2a976cf7dac : since EXISTS is the variable scope, we want to insert snippets here anyway (other solution would be to NOT insert snippets at all in such case). Closes #1625464
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7139
diff changeset
   521
163a2eab0e55 [rql rewrite] backout 7177:f2a976cf7dac : since EXISTS is the variable scope, we want to insert snippets here anyway (other solution would be to NOT insert snippets at all in such case). Closes #1625464
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7139
diff changeset
   522
    def test_rqlexpr_not_relation_2(self):
9262
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   523
        constraint = ERQLExpression('X owned_by Z, Z login "hop"', 'X')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   524
        rqlst = rqlhelper.parse(u'Affaire A WHERE NOT A documented_by C', annotate=False)
5582
3e133b29a1a4 [rql2sql] follow rql 0.26.1 changes: NOT nodes normalization, allowing simplification of sql generation, and fix #XXX
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
   525
        rewrite(rqlst, {('C', 'X'): (constraint,)}, {}, 'X')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   526
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   527
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   528
            u'Any A WHERE NOT EXISTS(A documented_by C, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   529
            'EXISTS(C owned_by B, B login "hop", B is CWUser), C is Card), A is Affaire')
5582
3e133b29a1a4 [rql2sql] follow rql 0.26.1 changes: NOT nodes normalization, allowing simplification of sql generation, and fix #XXX
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5424
diff changeset
   530
8264
a4b009ba92ce [rql rewrite] when a subquery has to be introduced, properly return the snippet expression so that further expressions are properly ored. Closes #2207180
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8113
diff changeset
   531
    def test_rqlexpr_multiexpr_outerjoin(self):
9262
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   532
        c1 = ERQLExpression('X owned_by Z, Z login "hop"', 'X')
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   533
        c2 = ERQLExpression('X owned_by Z, Z login "hip"', 'X')
7fc54e02291f [security] fix dumb attribute error when inserting read security. Closes #3196891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9189
diff changeset
   534
        c3 = ERQLExpression('X owned_by Z, Z login "momo"', 'X')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   535
        rqlst = rqlhelper.parse(u'Any A WHERE A documented_by C?', annotate=False)
8264
a4b009ba92ce [rql rewrite] when a subquery has to be introduced, properly return the snippet expression so that further expressions are properly ored. Closes #2207180
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8113
diff changeset
   536
        rewrite(rqlst, {('C', 'X'): (c1, c2, c3)}, {}, 'X')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   537
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   538
            rqlst.as_string(),
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   539
            u'Any A WHERE A documented_by C?, A is Affaire '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   540
            'WITH C BEING (Any C WHERE ((EXISTS(C owned_by B, B login "hop")) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   541
            'OR (EXISTS(C owned_by D, D login "momo"))) '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   542
            'OR (EXISTS(C owned_by A, A login "hip")), C is Card)')
8264
a4b009ba92ce [rql rewrite] when a subquery has to be introduced, properly return the snippet expression so that further expressions are properly ored. Closes #2207180
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8113
diff changeset
   543
8296
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   544
    def test_multiple_erql_one_bad(self):
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   545
        #: reproduce bug #2236985
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   546
        #: (rqlrewrite fails to remove rewritten entry for unsupported constraint and then crash)
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   547
        #:
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   548
        #: This check a very rare code path triggered by the four condition below
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   549
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   550
        # 1. c_ok introduce an ambiguity
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   551
        c_ok = ERQLExpression('X concerne R')
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   552
        # 2. c_bad is just plain wrong and won't be kept
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   553
        # 3. but it declare a new variable
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   554
        # 4. this variable require a rewrite
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   555
        c_bad = ERQLExpression('X documented_by R, A in_state R')
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   556
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   557
        rqlst = parse(u'Any A, R WHERE A ref R, S is Affaire')
8296
f23782a2cdee rqlrewrite: remove element in rewritten when we remove them from the select (closes #2236985)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8264
diff changeset
   558
        rewrite(rqlst, {('A', 'X'): (c_ok, c_bad)}, {})
1787
71c143c0ada3 fix test
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   559
9358
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   560
    def test_nonregr_is_instance_of(self):
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   561
        user_expr = ERQLExpression('NOT X in_group AF, AF name "guests"')
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   562
        rqlst = parse(u'Any O WHERE S use_email O, S is CWUser, O is_instance_of EmailAddress')
9358
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   563
        rewrite(rqlst, {('S', 'X'): (user_expr,)}, {})
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   564
        self.assertEqual(rqlst.as_string(),
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   565
                         'Any O WHERE S use_email O, S is CWUser, O is EmailAddress, '
1e0235478403 [rewriter] fix latent bug: arbitrary etype may be substituted when using is_instance_of type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9327
diff changeset
   566
                         'EXISTS(NOT S in_group A, A name "guests", A is CWGroup)')
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   567
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   568
    def test_ambiguous_constraint_not_exists(self):
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   569
        state_constraint = (
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   570
            'NOT EXISTS(A require_permission S) '
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   571
            'OR EXISTS(B require_permission S, B is Card, O name "state1")'
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   572
            'OR EXISTS(C require_permission S, C is Note, O name "state2")'
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   573
        )
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   574
        rqlst = parse(u'Any P WHERE NOT P require_state S')
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   575
        rewrite(rqlst, {('P', 'S'): (state_constraint,), ('S', 'O'): (state_constraint,)}, {})
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   576
        self.assertMultiLineEqual(
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   577
            rqlst.as_string(),
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   578
            u'Any P WHERE NOT P require_state S, '
12175
c0ceadfc8aee [rqlrewrite] Enhance detection of need for Exists node
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12174
diff changeset
   579
            '((NOT EXISTS(A require_permission P, A is IN(Card, Note)))'
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   580
            ' OR (EXISTS(B require_permission P, B is Card, S name "state1")))'
12175
c0ceadfc8aee [rqlrewrite] Enhance detection of need for Exists node
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12174
diff changeset
   581
            ' OR (EXISTS(C require_permission P, C is Note, S name "state2")), '
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   582
            'P is CWPermission, S is State')
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   583
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   584
    def test_ambiguous_using_is_in_function(self):
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   585
        state_constraint = (
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   586
            'NOT EXISTS(A require_permission S) '
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   587
            'OR EXISTS(B require_permission S, B is IN (Card, Note), O name "state1")'
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   588
        )
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   589
        rqlst = parse(u'Any P WHERE NOT P require_state S')
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   590
        rewrite(rqlst, {('P', 'S'): (state_constraint,), ('S', 'O'): (state_constraint,)}, {})
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   591
        self.assertMultiLineEqual(
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   592
            rqlst.as_string(),
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   593
            u'Any P WHERE NOT P require_state S, '
12175
c0ceadfc8aee [rqlrewrite] Enhance detection of need for Exists node
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12174
diff changeset
   594
            '(NOT EXISTS(A require_permission P, A is IN(Card, Note))) '
c0ceadfc8aee [rqlrewrite] Enhance detection of need for Exists node
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12174
diff changeset
   595
            'OR (EXISTS(B require_permission P, B is IN(Card, Note), S name "state1")), '
12174
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   596
            'P is CWPermission, S is State')
02b8325720d6 [rqlrewrite] Fix rewrite on ambiguities introduced by NOT relation or "is IN" type restriction
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12060
diff changeset
   597
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   598
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   599
class RewriteFullTC(CubicWebTC):
11269
73ac69970047 [devtools] Simplify test configuration's init
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11250
diff changeset
   600
    appid = 'data-rewrite'
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   601
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   602
    def process(self, rql, args=None):
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   603
        if args is None:
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   604
            args = {}
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   605
        querier = self.repo.querier
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   606
        union = parse(rql)  # self.vreg.parse(rql, annotate=True)
9655
2219bd9f35db [test] update unittest_rqlrewrite to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9593
diff changeset
   607
        with self.admin_access.repo_cnx() as cnx:
12060
0cdf5fafd234 [repo] Extract rql cache handling to a dedicated class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11855
diff changeset
   608
            self.vreg.solutions(cnx, union, args)
9655
2219bd9f35db [test] update unittest_rqlrewrite to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9593
diff changeset
   609
            querier._annotate(union)
2219bd9f35db [test] update unittest_rqlrewrite to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9593
diff changeset
   610
            plan = querier.plan_factory(union, args, cnx)
2219bd9f35db [test] update unittest_rqlrewrite to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9593
diff changeset
   611
            plan.preprocess(union)
2219bd9f35db [test] update unittest_rqlrewrite to 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9593
diff changeset
   612
            return union
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   613
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   614
    def test_ambiguous_optional_same_exprs(self):
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   615
        """See #3013535"""
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   616
        edef1 = self.schema['Societe']
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   617
        edef2 = self.schema['Division']
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   618
        edef3 = self.schema['Note']
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   619
        with self.temporary_permissions((edef1, {'read': (ERQLExpression('X owned_by U'),)}),
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   620
                                        (edef2, {'read': (ERQLExpression('X owned_by U'),)}),
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   621
                                        (edef3, {'read': (ERQLExpression('X owned_by U'),)})):
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   622
            union = self.process('Any A,AR,X,CD WHERE A concerne X?, A ref AR, X creation_date CD')
9189
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   623
            self.assertEqual('Any A,AR,X,CD WHERE A concerne X?, A ref AR, A is Affaire '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   624
                             'WITH X,CD BEING (Any X,CD WHERE X creation_date CD, '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   625
                             'EXISTS(X owned_by %(A)s), X is IN(Division, Note, Societe))',
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   626
                             union.as_string())
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   627
9327
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   628
    def test_ambiguous_optional_diff_exprs(self):
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   629
        """See #3013554"""
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   630
        self.skipTest('bad request generated (may generate duplicated results)')
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   631
        edef1 = self.schema['Societe']
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   632
        edef2 = self.schema['Division']
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   633
        edef3 = self.schema['Note']
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   634
        with self.temporary_permissions((edef1, {'read': (ERQLExpression('X created_by U'),)}),
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   635
                                        (edef2, {'read': ('users',)}),
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   636
                                        (edef3, {'read': (ERQLExpression('X owned_by U'),)})):
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   637
            union = self.process('Any A,AR,X,CD WHERE A concerne X?, A ref AR, X creation_date CD')
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   638
            self.assertEqual(union.as_string(), 'not generated today')
dbabdc323e7d add failing test case related to #3013554
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9262
diff changeset
   639
9189
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   640
    def test_xxxx(self):
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   641
        edef1 = self.schema['Societe']
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   642
        edef2 = self.schema['Division']
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   643
        read_expr = ERQLExpression('X responsable E, U has_read_permission E')
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   644
        with self.temporary_permissions((edef1, {'read': (read_expr,)}),
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   645
                                        (edef2, {'read': (read_expr,)})):
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   646
            union = self.process('Any X,AA,AC,AD ORDERBY AD DESC '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   647
                                 'WHERE X responsable E, X nom AA, '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   648
                                 'X responsable AC?, AC modification_date AD')
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   649
            self.assertEqual('Any X,AA,AC,AD ORDERBY AD DESC '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   650
                             'WHERE X responsable E, X nom AA, '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   651
                             'X responsable AC?, AC modification_date AD, '
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   652
                             'AC is CWUser, E is CWUser, X is IN(Division, Societe)',
9448215c73c4 [rqlrewrite] fix rqlrewrite unpredictability vs relation sharing. Closes #3036144
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9188
diff changeset
   653
                             union.as_string())
9168
0fb4b67bde58 [schema/security] add __hash__ to rql expression. Closes #3013535
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8342
diff changeset
   654
9593
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   655
    def test_question_mark_attribute_snippet(self):
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   656
        # see #3661918
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   657
        repotest.undo_monkey_patch()
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   658
        orig_insert_snippets = RQLRewriter.insert_snippets
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   659
        # patch insert_snippets and not rewrite, insert_snippets is already
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   660
        # monkey patches (see above setupModule/repotest)
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   661
9593
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   662
        @monkeypatch(RQLRewriter)
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   663
        def insert_snippets(self, snippets, varexistsmap=None):
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   664
            # crash occurs if snippets are processed in a specific order, force
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   665
            # destiny
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   666
            if snippets[0][0] != {u'N': 'X'}:
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   667
                snippets = list(reversed(snippets))
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   668
            return orig_insert_snippets(self, snippets, varexistsmap)
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   669
        try:
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   670
            with self.temporary_permissions(
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   671
                    (self.schema['Affaire'],
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   672
                     {'read': (ERQLExpression('X ref "blah"'), )}),
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   673
                    (self.schema['Note'],
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   674
                     {'read': (ERQLExpression(
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   675
                         'EXISTS(X inlined_affaire Z), EXISTS(Z owned_by U)'), )}),
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   676
            ):
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   677
                union = self.process(
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   678
                    'Any A,COUNT(N) GROUPBY A '
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   679
                    'WHERE A is Affaire, N? inlined_affaire A')
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   680
                self.assertEqual('Any A,COUNT(N) GROUPBY A WHERE A is Affaire '
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   681
                                 'WITH N,A BEING (Any N,A WHERE N? inlined_affaire A, '
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   682
                                 '(N is NULL) OR (EXISTS(EXISTS(N inlined_affaire B), '
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   683
                                 'EXISTS(B owned_by %(E)s), B is Affaire)), '
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   684
                                 'A is Affaire, N is Note, EXISTS(A ref "blah"))',
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   685
                                 union.as_string())
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   686
        finally:
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   687
            RQLRewriter.insert_snippets = orig_insert_snippets
48a84fb4f301 [rewrite] Fix crash when the main variable doesn't appear in the snippet's vargraph
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9358
diff changeset
   688
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   689
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   690
class RQLRelationRewriterTC(TestCase):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   691
    # XXX valid rules: S and O specified, not in a SET, INSERT, DELETE scope
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   692
    #     valid uses: no outer join
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   693
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   694
    # Basic tests
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   695
    def test_base_rule(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   696
        rules = {'participated_in': 'S contributor O'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   697
        rqlst = rqlhelper.parse(u'Any X WHERE X participated_in S')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   698
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   699
        self.assertEqual('Any X WHERE X contributor S',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   700
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   701
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   702
    def test_complex_rule_1(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   703
        rules = {'illustrator_of': ('C is Contribution, C contributor S, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   704
                                    'C manifestation O, C role R, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   705
                                    'R name "illustrator"')}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   706
        rqlst = rqlhelper.parse(u'Any A,B WHERE A illustrator_of B')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   707
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   708
        self.assertEqual('Any A,B WHERE C is Contribution, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   709
                         'C contributor A, C manifestation B, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   710
                         'C role D, D name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   711
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   712
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   713
    def test_complex_rule_2(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   714
        rules = {'illustrator_of': ('C is Contribution, C contributor S, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   715
                                    'C manifestation O, C role R, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   716
                                    'R name "illustrator"')}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   717
        rqlst = rqlhelper.parse(u'Any A WHERE EXISTS(A illustrator_of B)')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   718
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   719
        self.assertEqual('Any A WHERE EXISTS(C is Contribution, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   720
                         'C contributor A, C manifestation B, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   721
                         'C role D, D name "illustrator")',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   722
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   723
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   724
    def test_rewrite2(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   725
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   726
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   727
        rqlst = rqlhelper.parse(u'Any A,B WHERE A illustrator_of B, C require_permission R, S'
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   728
                                'require_state O')
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   729
        rule_rewrite(rqlst, rules)
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   730
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   731
            'Any A,B WHERE C require_permission R, S require_state O, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   732
            'D is Contribution, D contributor A, D manifestation B, D role E, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   733
            'E name "illustrator"',
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   734
            rqlst.as_string())
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   735
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   736
    def test_rewrite3(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   737
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   738
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   739
        rqlst = rqlhelper.parse(u'Any A,B WHERE E require_permission T, A illustrator_of B')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   740
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   741
        self.assertEqual('Any A,B WHERE E require_permission T, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   742
                         'C is Contribution, C contributor A, C manifestation B, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   743
                         'C role D, D name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   744
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   745
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   746
    def test_rewrite4(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   747
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   748
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   749
        rqlst = rqlhelper.parse(u'Any A,B WHERE C require_permission R, A illustrator_of B')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   750
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   751
        self.assertEqual('Any A,B WHERE C require_permission R, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   752
                         'D is Contribution, D contributor A, D manifestation B, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   753
                         'D role E, E name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   754
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   755
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   756
    def test_rewrite5(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   757
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   758
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   759
        rqlst = rqlhelper.parse(u'Any A,B WHERE C require_permission R, A illustrator_of B, '
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   760
                                'S require_state O')
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   761
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   762
        self.assertEqual('Any A,B WHERE C require_permission R, S require_state O, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   763
                         'D is Contribution, D contributor A, D manifestation B, D role E, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   764
                         'E name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   765
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   766
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   767
    # Tests for the with clause
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   768
    def test_rewrite_with(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   769
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   770
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   771
        rqlst = rqlhelper.parse(u'Any A,B WITH A, B BEING(Any X, Y WHERE X illustrator_of Y)')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   772
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   773
        self.assertEqual('Any A,B WITH A,B BEING '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   774
                         '(Any X,Y WHERE A is Contribution, A contributor X, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   775
                         'A manifestation Y, A role B, B name "illustrator")',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   776
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   777
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   778
    def test_rewrite_with2(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   779
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   780
                 'C manifestation O, C role R, R name "illustrator"'}
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   781
        rqlst = rqlhelper.parse(u'Any A,B WHERE T require_permission C '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   782
                                'WITH A, B BEING(Any X, Y WHERE X illustrator_of Y)')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   783
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   784
        self.assertEqual('Any A,B WHERE T require_permission C '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   785
                         'WITH A,B BEING (Any X,Y WHERE A is Contribution, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   786
                         'A contributor X, A manifestation Y, A role B, B name "illustrator")',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   787
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   788
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   789
    def test_rewrite_with3(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   790
        rules = {'participated_in': 'S contributor O'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   791
        rqlst = rqlhelper.parse(u'Any A,B WHERE A participated_in B '
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   792
                                'WITH A, B BEING(Any X,Y WHERE X contributor Y)')
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   793
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   794
        self.assertEqual('Any A,B WHERE A contributor B WITH A,B BEING '
9955
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   795
                         '(Any X,Y WHERE X contributor Y)',
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   796
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   797
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   798
    def test_rewrite_with4(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   799
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   800
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   801
        rqlst = rqlhelper.parse(u'Any A,B WHERE A illustrator_of B '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   802
                                'WITH A, B BEING(Any X, Y WHERE X illustrator_of Y)')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   803
        rule_rewrite(rqlst, rules)
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   804
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   805
            'Any A,B WHERE C is Contribution, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   806
            'C contributor A, C manifestation B, C role D, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   807
            'D name "illustrator" WITH A,B BEING '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   808
            '(Any X,Y WHERE A is Contribution, A contributor X, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   809
            'A manifestation Y, A role B, B name "illustrator")',
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   810
            rqlst.as_string())
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   811
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   812
    # Tests for the union
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   813
    def test_rewrite_union(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   814
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   815
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   816
        rqlst = rqlhelper.parse(u'(Any A,B WHERE A illustrator_of B) UNION'
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   817
                                '(Any X,Y WHERE X is CWUser, Z manifestation Y)')
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   818
        rule_rewrite(rqlst, rules)
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   819
        self.assertEqual(
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   820
            '(Any A,B WHERE C is Contribution, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   821
            'C contributor A, C manifestation B, C role D, '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   822
            'D name "illustrator") UNION (Any X,Y WHERE X is CWUser, Z manifestation Y)',
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   823
            rqlst.as_string())
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   824
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   825
    def test_rewrite_union2(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   826
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   827
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   828
        rqlst = rqlhelper.parse(u'(Any Y WHERE Y match W) UNION '
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   829
                                '(Any A WHERE A illustrator_of B) UNION '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   830
                                '(Any Y WHERE Y is ArtWork)')
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   831
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   832
        self.assertEqual('(Any Y WHERE Y match W) '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   833
                         'UNION (Any A WHERE C is Contribution, C contributor A, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   834
                         'C manifestation B, C role D, D name "illustrator") '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   835
                         'UNION (Any Y WHERE Y is ArtWork)',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   836
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   837
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   838
    # Tests for the exists clause
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   839
    def test_rewrite_exists(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   840
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   841
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   842
        rqlst = rqlhelper.parse(u'(Any A,B WHERE A illustrator_of B, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   843
                                'EXISTS(B is ArtWork))')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   844
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   845
        self.assertEqual('Any A,B WHERE EXISTS(B is ArtWork), '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   846
                         'C is Contribution, C contributor A, C manifestation B, C role D, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   847
                         'D name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   848
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   849
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   850
    def test_rewrite_exists2(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   851
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   852
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   853
        rqlst = rqlhelper.parse(u'(Any A,B WHERE B contributor A, EXISTS(A illustrator_of W))')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   854
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   855
        self.assertEqual('Any A,B WHERE B contributor A, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   856
                         'EXISTS(C is Contribution, C contributor A, C manifestation W, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   857
                         'C role D, D name "illustrator")',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   858
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   859
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   860
    def test_rewrite_exists3(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   861
        rules = {'illustrator_of': 'C is Contribution, C contributor S, '
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   862
                 'C manifestation O, C role R, R name "illustrator"'}
10712
f7227cbf1d18 [test] call rql.parse with unicode objects
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10663
diff changeset
   863
        rqlst = rqlhelper.parse(u'(Any A,B WHERE A illustrator_of B, EXISTS(A illustrator_of W))')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   864
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   865
        self.assertEqual('Any A,B WHERE EXISTS(C is Contribution, C contributor A, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   866
                         'C manifestation W, C role D, D name "illustrator"), '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   867
                         'E is Contribution, E contributor A, E manifestation B, E role F, '
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   868
                         'F name "illustrator"',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   869
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   870
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   871
    # Test for GROUPBY
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   872
    def test_rewrite_groupby(self):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   873
        rules = {'participated_in': 'S contributor O'}
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   874
        rqlst = rqlhelper.parse(u'Any SUM(SA) GROUPBY S '
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   875
                                'WHERE P participated_in S, P manifestation SA')
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   876
        rule_rewrite(rqlst, rules)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   877
        self.assertEqual('Any SUM(SA) GROUPBY S WHERE P manifestation SA, P contributor S',
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   878
                         rqlst.as_string())
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   879
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   880
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   881
class RQLRelationRewriterCWTC(CubicWebTC):
9955
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   882
11269
73ac69970047 [devtools] Simplify test configuration's init
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11250
diff changeset
   883
    appid = 'data-rewrite'
9955
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   884
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   885
    def test_base_rule(self):
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   886
        with self.admin_access.client_cnx() as cnx:
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   887
            art = cnx.create_entity('ArtWork', name=u'Les travailleurs de la Mer')
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   888
            role = cnx.create_entity('Role', name=u'illustrator')
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   889
            vic = cnx.create_entity('Person', name=u'Victor Hugo')
12176
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   890
            cnx.create_entity('Contribution', code=96, contributor=vic,
c23aa49b2336 [cleanup] Fix flake8 error unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12175
diff changeset
   891
                              manifestation=art, role=role)
9955
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   892
            rset = cnx.execute('Any X WHERE X illustrator_of S')
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   893
            self.assertEqual([u'Victor Hugo'],
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   894
                             [result.name for result in rset.entities()])
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   895
            rset = cnx.execute('Any S WHERE X illustrator_of S, X eid %(x)s',
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   896
                               {'x': vic.eid})
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   897
            self.assertEqual([u'Les travailleurs de la Mer'],
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   898
                             [result.name for result in rset.entities()])
60a9cd1b3a4b [CWEP002] Plug the computed relation rewriter in the querier
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 9953
diff changeset
   899
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   900
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   901
def rule_rewrite(rqlst, kwargs=None):
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   902
    rewriter = _prepare_rewriter(rqlrewrite.RQLRelationRewriter, kwargs)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   903
    rqlhelper.compute_solutions(rqlst.children[0], {'eid': eid_func_map},
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   904
                                kwargs=kwargs)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   905
    rewriter.rewrite(rqlst)
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   906
    for select in rqlst.children:
11250
597f02c5cf5a [tox] Use py.test to run tests
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11057
diff changeset
   907
        check_vrefs(select)
9953
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   908
    return rewriter.rewritten
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   909
643b19d79e4a [CWEP002] introduce RQLRelationRewriter
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9674
diff changeset
   910
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   911
if __name__ == '__main__':
12177
8cc3af4d9c3a [cleanup] Use plain unittest main in unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12176
diff changeset
   912
    import unittest
8cc3af4d9c3a [cleanup] Use plain unittest main in unittest_rqlrewrite
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 12176
diff changeset
   913
    unittest.main()