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) |