server/test/unittest_rql2sql.py
changeset 5890 141b935a38fc
parent 5849 9db65b381028
parent 5887 3f55f0f10a22
child 5901 782b27eaf97a
equal deleted inserted replaced
5883:7a5f370c5be1 5890:141b935a38fc
   176      "NOT EXISTS(X owned_by U, U in_group G, G name 'lulufanclub' OR G name 'managers');",
   176      "NOT EXISTS(X owned_by U, U in_group G, G name 'lulufanclub' OR G name 'managers');",
   177      '''SELECT _X.cw_eid
   177      '''SELECT _X.cw_eid
   178 FROM cw_Personne AS _X
   178 FROM cw_Personne AS _X
   179 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))))'''),
   179 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))))'''),
   180 
   180 
   181 
       
   182 
       
   183 ]
   181 ]
       
   182 
   184 
   183 
   185 ADVANCED= [
   184 ADVANCED= [
   186     ("Societe S WHERE S nom 'Logilab' OR S nom 'Caesium'",
   185     ("Societe S WHERE S nom 'Logilab' OR S nom 'Caesium'",
   187      '''SELECT _S.cw_eid
   186      '''SELECT _S.cw_eid
   188 FROM cw_Societe AS _S
   187 FROM cw_Societe AS _S
   573 GROUP BY T1.C0,T1.C2
   572 GROUP BY T1.C0,T1.C2
   574 ORDER BY T1.C2'''),
   573 ORDER BY T1.C2'''),
   575 
   574 
   576     ]
   575     ]
   577 
   576 
       
   577 
   578 MULTIPLE_SEL = [
   578 MULTIPLE_SEL = [
   579     ("DISTINCT Any X,Y where P is Personne, P nom X , P prenom Y;",
   579     ("DISTINCT Any X,Y where P is Personne, P nom X , P prenom Y;",
   580      '''SELECT DISTINCT _P.cw_nom, _P.cw_prenom
   580      '''SELECT DISTINCT _P.cw_nom, _P.cw_prenom
   581 FROM cw_Personne AS _P'''),
   581 FROM cw_Personne AS _P'''),
   582     ("Any X,Y where P is Personne, P nom X , P prenom Y, not P nom NULL;",
   582     ("Any X,Y where P is Personne, P nom X , P prenom Y, not P nom NULL;",
   587      '''SELECT _X.cw_eid, _Y.cw_eid
   587      '''SELECT _X.cw_eid, _Y.cw_eid
   588 FROM cw_Personne AS _X, cw_Personne AS _Y
   588 FROM cw_Personne AS _X, cw_Personne AS _Y
   589 WHERE _Y.cw_nom=_X.cw_nom AND NOT (_Y.cw_eid=_X.cw_eid)''')
   589 WHERE _Y.cw_nom=_X.cw_nom AND NOT (_Y.cw_eid=_X.cw_eid)''')
   590     ]
   590     ]
   591 
   591 
       
   592 
   592 NEGATIONS = [
   593 NEGATIONS = [
       
   594 
   593     ("Personne X WHERE NOT X evaluee Y;",
   595     ("Personne X WHERE NOT X evaluee Y;",
   594      '''SELECT _X.cw_eid
   596      '''SELECT _X.cw_eid
   595 FROM cw_Personne AS _X
   597 FROM cw_Personne AS _X
   596 WHERE NOT (EXISTS(SELECT 1 FROM evaluee_relation AS rel_evaluee0 WHERE rel_evaluee0.eid_from=_X.cw_eid))'''),
   598 WHERE NOT (EXISTS(SELECT 1 FROM evaluee_relation AS rel_evaluee0 WHERE rel_evaluee0.eid_from=_X.cw_eid))'''),
   597 
   599 
  1453     def test_concat_string(self):
  1455     def test_concat_string(self):
  1454         self._check('Any "A"+R WHERE X ref R',
  1456         self._check('Any "A"+R WHERE X ref R',
  1455                     '''SELECT (A || _X.cw_ref)
  1457                     '''SELECT (A || _X.cw_ref)
  1456 FROM cw_Affaire AS _X''')
  1458 FROM cw_Affaire AS _X''')
  1457 
  1459 
       
  1460     def test_or_having_fake_terms(self):
       
  1461         self._check('Any X WHERE X is CWUser, X creation_date D HAVING YEAR(D) = "2010" OR D = NULL',
       
  1462                     '''SELECT _X.cw_eid
       
  1463 FROM cw_CWUser AS _X
       
  1464 WHERE ((CAST(EXTRACT(YEAR from _X.cw_creation_date) AS INTEGER)=2010) OR (_X.cw_creation_date IS NULL))''')
       
  1465 
  1458 
  1466 
  1459 class SqliteSQLGeneratorTC(PostgresSQLGeneratorTC):
  1467 class SqliteSQLGeneratorTC(PostgresSQLGeneratorTC):
  1460     backend = 'sqlite'
  1468     backend = 'sqlite'
  1461 
  1469 
  1462     def _norm_sql(self, sql):
  1470     def _norm_sql(self, sql):
  1575              """SELECT DISTINCT appears0.uid, 1.0
  1583              """SELECT DISTINCT appears0.uid, 1.0
  1576 FROM appears AS appears0
  1584 FROM appears AS appears0
  1577 WHERE appears0.word_id IN (SELECT word_id FROM word WHERE word in ('toto', 'tata'))"""),
  1585 WHERE appears0.word_id IN (SELECT word_id FROM word WHERE word in ('toto', 'tata'))"""),
  1578             )):
  1586             )):
  1579             yield t
  1587             yield t
       
  1588 
       
  1589 
       
  1590     def test_or_having_fake_terms(self):
       
  1591         self._check('Any X WHERE X is CWUser, X creation_date D HAVING YEAR(D) = "2010" OR D = NULL',
       
  1592                     '''SELECT _X.cw_eid
       
  1593 FROM cw_CWUser AS _X
       
  1594 WHERE ((YEAR(_X.cw_creation_date)=2010) OR (_X.cw_creation_date IS NULL))''')
  1580 
  1595 
  1581 
  1596 
  1582 
  1597 
  1583 class MySQLGenerator(PostgresSQLGeneratorTC):
  1598 class MySQLGenerator(PostgresSQLGeneratorTC):
  1584     backend = 'mysql'
  1599     backend = 'mysql'
  1658     def test_substring(self):
  1673     def test_substring(self):
  1659         self._check("Any SUBSTRING(N, 1, 1) WHERE P nom N, P is Personne",
  1674         self._check("Any SUBSTRING(N, 1, 1) WHERE P nom N, P is Personne",
  1660                     '''SELECT SUBSTRING(_P.cw_nom, 1, 1)
  1675                     '''SELECT SUBSTRING(_P.cw_nom, 1, 1)
  1661 FROM cw_Personne AS _P''')
  1676 FROM cw_Personne AS _P''')
  1662 
  1677 
       
  1678 
       
  1679     def test_or_having_fake_terms(self):
       
  1680         self._check('Any X WHERE X is CWUser, X creation_date D HAVING YEAR(D) = "2010" OR D = NULL',
       
  1681                     '''SELECT _X.cw_eid
       
  1682 FROM cw_CWUser AS _X
       
  1683 WHERE ((EXTRACT(YEAR from _X.cw_creation_date)=2010) OR (_X.cw_creation_date IS NULL))''')
       
  1684 
       
  1685 
  1663 class removeUnsusedSolutionsTC(TestCase):
  1686 class removeUnsusedSolutionsTC(TestCase):
  1664     def test_invariant_not_varying(self):
  1687     def test_invariant_not_varying(self):
  1665         rqlst = mock_object(defined_vars={})
  1688         rqlst = mock_object(defined_vars={})
  1666         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  1689         rqlst.defined_vars['A'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=True)
  1667         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)
  1690         rqlst.defined_vars['B'] = mock_object(scope=rqlst, stinfo={}, _q_invariant=False)