8 |
8 |
9 """unit tests for module cubicweb.server.sources.rql2sql""" |
9 """unit tests for module cubicweb.server.sources.rql2sql""" |
10 |
10 |
11 import sys |
11 import sys |
12 |
12 |
13 from logilab.common.testlib import TestCase, unittest_main |
13 from logilab.common.testlib import TestCase, unittest_main, mock_object |
14 |
14 |
15 from rql import BadRQLQuery |
15 from rql import BadRQLQuery |
16 from indexer import get_indexer |
16 from indexer import get_indexer |
17 |
17 |
18 #from cubicweb.server.sources.native import remove_unused_solutions |
18 #from cubicweb.server.sources.native import remove_unused_solutions |
19 from cubicweb.server.sources.rql2sql import SQLGenerator |
19 from cubicweb.server.sources.rql2sql import SQLGenerator, remove_unused_solutions |
20 |
20 |
21 from rql.utils import register_function, FunctionDescr |
21 from rql.utils import register_function, FunctionDescr |
22 # add a dumb registered procedure |
22 # add a dumb registered procedure |
23 class stockproc(FunctionDescr): |
23 class stockproc(FunctionDescr): |
24 supported_backends = ('postgres', 'sqlite', 'mysql') |
24 supported_backends = ('postgres', 'sqlite', 'mysql') |
163 ("Any X WHERE X prenom 'lulu'," |
163 ("Any X WHERE X prenom 'lulu'," |
164 "NOT EXISTS(X owned_by U, U in_group G, G name 'lulufanclub' OR G name 'managers');", |
164 "NOT EXISTS(X owned_by U, U in_group G, G name 'lulufanclub' OR G name 'managers');", |
165 '''SELECT _X.cw_eid |
165 '''SELECT _X.cw_eid |
166 FROM cw_Personne AS _X |
166 FROM cw_Personne AS _X |
167 WHERE _X.cw_prenom=lulu AND NOT EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, in_group_relation AS rel_in_group1, cw_CWGroup AS _G WHERE rel_owned_by0.eid_from=_X.cw_eid AND rel_in_group1.eid_from=rel_owned_by0.eid_to AND rel_in_group1.eid_to=_G.cw_eid AND ((_G.cw_name=lulufanclub) OR (_G.cw_name=managers)))'''), |
167 WHERE _X.cw_prenom=lulu AND NOT EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, in_group_relation AS rel_in_group1, cw_CWGroup AS _G WHERE rel_owned_by0.eid_from=_X.cw_eid AND rel_in_group1.eid_from=rel_owned_by0.eid_to AND rel_in_group1.eid_to=_G.cw_eid AND ((_G.cw_name=lulufanclub) OR (_G.cw_name=managers)))'''), |
|
168 |
|
169 |
|
170 |
168 ] |
171 ] |
169 |
172 |
170 ADVANCED= [ |
173 ADVANCED= [ |
171 ("Societe S WHERE S nom 'Logilab' OR S nom 'Caesium'", |
174 ("Societe S WHERE S nom 'Logilab' OR S nom 'Caesium'", |
172 '''SELECT _S.cw_eid |
175 '''SELECT _S.cw_eid |
866 FROM cw_Affaire AS _O LEFT OUTER JOIN todo_by_relation AS rel_todo_by0 ON (rel_todo_by0.eid_from=_O.cw_eid), cw_Note AS _S |
869 FROM cw_Affaire AS _O LEFT OUTER JOIN todo_by_relation AS rel_todo_by0 ON (rel_todo_by0.eid_from=_O.cw_eid), cw_Note AS _S |
867 WHERE NOT EXISTS(SELECT 1 WHERE _S.cw_inline1=_O.cw_eid) AND _S.cw_eid=123''') |
870 WHERE NOT EXISTS(SELECT 1 WHERE _S.cw_inline1=_O.cw_eid) AND _S.cw_eid=123''') |
868 ] |
871 ] |
869 |
872 |
870 VIRTUAL_VARS = [ |
873 VIRTUAL_VARS = [ |
871 ("Personne P WHERE P travaille S, S tel T, S fax T, S is Societe;", |
874 |
|
875 ('Any X WHERE X is CWUser, X creation_date > D1, Y creation_date D1, Y login "SWEB09"', |
|
876 '''SELECT _X.cw_eid |
|
877 FROM cw_CWUser AS _X, cw_CWUser AS _Y |
|
878 WHERE _X.cw_creation_date>_Y.cw_creation_date AND _Y.cw_login=SWEB09'''), |
|
879 |
|
880 ('Any X WHERE X is CWUser, Y creation_date D1, Y login "SWEB09", X creation_date > D1', |
|
881 '''SELECT _X.cw_eid |
|
882 FROM cw_CWUser AS _X, cw_CWUser AS _Y |
|
883 WHERE _Y.cw_login=SWEB09 AND _X.cw_creation_date>_Y.cw_creation_date'''), |
|
884 |
|
885 ('Personne P WHERE P travaille S, S tel T, S fax T, S is Societe', |
872 '''SELECT rel_travaille0.eid_from |
886 '''SELECT rel_travaille0.eid_from |
873 FROM cw_Societe AS _S, travaille_relation AS rel_travaille0 |
887 FROM cw_Societe AS _S, travaille_relation AS rel_travaille0 |
874 WHERE rel_travaille0.eid_to=_S.cw_eid AND _S.cw_fax=_S.cw_tel'''), |
888 WHERE rel_travaille0.eid_to=_S.cw_eid AND _S.cw_tel=_S.cw_fax'''), |
875 |
889 |
876 ("Personne P where X eid 0, X creation_date D, P datenaiss < D, X is Affaire", |
890 ("Personne P where X eid 0, X creation_date D, P datenaiss < D, X is Affaire", |
877 '''SELECT _P.cw_eid |
891 '''SELECT _P.cw_eid |
878 FROM cw_Affaire AS _X, cw_Personne AS _P |
892 FROM cw_Affaire AS _X, cw_Personne AS _P |
879 WHERE _X.cw_eid=0 AND _P.cw_datenaiss<_X.cw_creation_date'''), |
893 WHERE _X.cw_eid=0 AND _P.cw_datenaiss<_X.cw_creation_date'''), |
1588 '''SELECT COUNT(1) |
1602 '''SELECT COUNT(1) |
1589 FROM (SELECT 1) AS _T |
1603 FROM (SELECT 1) AS _T |
1590 WHERE EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, cw_Affaire AS _P WHERE rel_owned_by0.eid_from=_P.cw_eid AND rel_owned_by0.eid_to=1 UNION SELECT 1 FROM owned_by_relation AS rel_owned_by1, cw_Note AS _P WHERE rel_owned_by1.eid_from=_P.cw_eid AND rel_owned_by1.eid_to=1)''') |
1604 WHERE EXISTS(SELECT 1 FROM owned_by_relation AS rel_owned_by0, cw_Affaire AS _P WHERE rel_owned_by0.eid_from=_P.cw_eid AND rel_owned_by0.eid_to=1 UNION SELECT 1 FROM owned_by_relation AS rel_owned_by1, cw_Note AS _P WHERE rel_owned_by1.eid_from=_P.cw_eid AND rel_owned_by1.eid_to=1)''') |
1591 |
1605 |
1592 |
1606 |
1593 |
1607 class removeUnsusedSolutionsTC(TestCase): |
|
1608 def test_invariant_not_varying(self): |
|
1609 rqlst = mock_object(defined_vars={}) |
|
1610 rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={'optrelations':False}, _q_invariant=True) |
|
1611 rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={'optrelations':False}, _q_invariant=False) |
|
1612 self.assertEquals(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'}, |
|
1613 {'A': 'FootGroup', 'B': 'FootTeam'}], {}, None), |
|
1614 ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'}, |
|
1615 {'A': 'FootGroup', 'B': 'FootTeam'}], |
|
1616 {}, set('B')) |
|
1617 ) |
|
1618 |
|
1619 def test_invariant_varying(self): |
|
1620 rqlst = mock_object(defined_vars={}) |
|
1621 rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={'optrelations':False}, _q_invariant=True) |
|
1622 rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={'optrelations':False}, _q_invariant=False) |
|
1623 self.assertEquals(remove_unused_solutions(rqlst, [{'A': 'RugbyGroup', 'B': 'RugbyTeam'}, |
|
1624 {'A': 'FootGroup', 'B': 'RugbyTeam'}], {}, None), |
|
1625 ([{'A': 'RugbyGroup', 'B': 'RugbyTeam'}], {}, set()) |
|
1626 ) |
1594 |
1627 |
1595 if __name__ == '__main__': |
1628 if __name__ == '__main__': |
1596 unittest_main() |
1629 unittest_main() |