server/test/unittest_rql2sql.py
changeset 3890 d7a270f50f54
parent 3777 3ef8cdb5fb1c
parent 3852 03121ca1f85e
child 3998 94cc7cad3d2d
equal deleted inserted replaced
3810:5b75fd66c80e 3890:d7a270f50f54
     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()