OQL: Fixed a number of bugs, and implemented new features

- bug: a JOIN b on b.extkey = a.id
- bug: operators precedence (still a shift-reduce conflict with JOINS)
- changed pkey into id (preserved the compatibility for DBObjectSearch::AddCondition()
- allow implicit class name in WHERE condition
- bug: wrong report on typo error
- suggest an alternative in case of typo error

SVN:code[12]
This commit is contained in:
Romain Quetiez
2009-03-27 14:36:14 +00:00
parent a0f4fdb130
commit 8d9ea9dcdd
15 changed files with 989 additions and 612 deletions

View File

@@ -42,7 +42,7 @@ function ShowClass($sClass, $sBaseArgs)
$aProps["Subclasses (children + pure PHP)"] = sexyclasslist(MetaModel::GetSubclasses($sClass), $sBaseArgs);
$aProps["Description"] = MetaModel::GetClassDescription($sClass);
$aProps["Autoincrement pkey?"] = MetaModel::IsAutoIncrementKey($sClass);
$aProps["Autoincrement id?"] = MetaModel::IsAutoIncrementKey($sClass);
$aProps["Key label"] = MetaModel::GetKeyLabel($sClass);
$aProps["Name attribute"] = MetaModel::GetNameAttributeCode($sClass);
$aProps["Reconciliation keys"] = implode(", ", MetaModel::GetReconcKeys($sClass));
@@ -188,7 +188,8 @@ function DebugQuery($sConfigFile)
echo "<h1>Follow up the query build</h1>\n";
MetaModel::StartDebugQuery();
$oFlt = DBObjectSearch::FromSibuSQL($sQuery);
$oFlt = DBObjectSearch::FromOQL($sQuery);
echo "<p>To OQL: ".$oFlt->ToOQL()."</p>";
$sSQL = MetaModel::MakeSelectQuery($oFlt);
MetaModel::StopDebugQuery();

View File

@@ -706,6 +706,7 @@ class TestQueriesOnFarm extends TestBizModel
throw new UnitTestException("The query '$sQuery' was parsed with success, while it shouldn't (?)");
return false;
}
echo "<p>To OQL: ".$oMyFilter->ToOQL()."</p>";
$this->search_and_show_list($oMyFilter);
@@ -721,25 +722,21 @@ class TestQueriesOnFarm extends TestBizModel
$oFilter2 = DBObjectSearch::unserialize($sSerialize);
try
{
$sQuery2 = MetaModel::MakeSelectQuery($oFilter2);
$sQuery2 = MetaModel::MakeSelectQuery($oFilter2);
}
catch (Exception $e)
{
echo "<p>Could not compute the query after unserialize</p>\n";
echo "<p>Query 1: $sQuery1</p>\n";
MyHelpers::var_dump_html($oMyFilter, true);
echo "<p>Query 2: FAILED</p>\n";
MyHelpers::var_dump_html($oFilter2, true);
MyHelpers::var_cmp_html($oMyFilter, $oFilter2);
throw $e;
}
//if ($oFilter2 != $oMyFilter) no, they may differ while the resulting query is the same!
if ($sQuery1 != $sQuery2)
{
echo "<p>serialize/unserialize mismatch :-(</p>\n";
echo "<p>Query 1: $sQuery1</p>\n";
MyHelpers::var_dump_html($oMyFilter, true);
echo "<p>Query 2: $sQuery2</p>\n";
MyHelpers::var_dump_html($oFilter2, true);
MyHelpers::var_cmp_html($sQuery1, $sQuery2);
MyHelpers::var_cmp_html($oMyFilter, $oFilter2);
return false;
}
return true;
@@ -782,10 +779,14 @@ class TestQueriesOnFarm extends TestBizModel
$aQueries = array(
'SELECT Animal' => true,
'SELECT Animal WHERE Animal.pkey = 1' => false,
'SELECT Animal WHERE Animal.id = 1' => true,
'SELECT Aniiimal' => false,
'SELECTe Animal' => false,
'SELECT * FROM Animal' => false,
'SELECT Animal AS zoo WHERE zoo.species = \'human\'' => true,
'SELECT Animal AS zoo WHERE species = \'human\'' => true,
'SELECT Animal AS zoo WHERE espece = \'human\'' => false,
'SELECT Animal AS zoo WHERE zoo.species IN (\'human\', "pig")' => true,
'SELECT Animal AS zoo WHERE CONCATENATION(zoo.species, zoo.sex) LIKE "hum%male"' => false,
'SELECT Animal AS zoo WHERE CONCAT(zoo.species, zoo.sex) LIKE "hum%male"' => true,
@@ -793,6 +794,7 @@ class TestQueriesOnFarm extends TestBizModel
'SELECT Animal AS zoo WHERE zoo.kind = \'human\'' => false,
'SELECT Animal WHERE Animal.species = \'human\' AND Animal.sex = \'female\'' => true,
'SELECT Mammal AS x WHERE (x.species = \'human\' AND x.name LIKE \'ro%\') OR (x.species = \'donkey\' AND x.name LIKE \'po%\')' => true,
'SELECT Mammal AS x WHERE x.species = \'human\' AND x.name LIKE \'ro%\' OR x.species = \'donkey\' AND x.name LIKE \'po%\'' => true,
'SELECT Mammal AS m WHERE MONTH(m.birth) = 7' => true,
'SELECT Mammal AS m WHERE DAY(m.birth) = 19' => true,
'SELECT Mammal AS m WHERE YEAR(m.birth) = 1971' => true,
@@ -802,6 +804,7 @@ class TestQueriesOnFarm extends TestBizModel
'SELECT Mammal AS m WHERE m.name = IF(FLOOR(ROUND(m.height)) > 2, "pomme", "romain")' => true,
'SELECT Mammal AS m WHERE (1 + 2' => false,
'SELECT Mammal AS m WHERE (1 + 2 * 4 / 23) > 0' => true,
'SELECT Mammal AS m WHERE (4 / 23 * 2 + 1) > 0' => true,
'SELECT Mammal AS m WHERE 1/0' => true,
'SELECT Mammal AS m WHERE MONTH(m.birth) = 7' => true,
'SELECT Animal JOIN Group ON Group.leader = Animal.id' => true,
@@ -813,20 +816,30 @@ class TestQueriesOnFarm extends TestBizModel
'SELECT Animal AS A JOIN Group AS G ON A.id = G.leader' => false,
'SELECT Animal AS A JOIN Group AS G ON G.leader = A.id WHERE A.sex=\'male\' OR G.qwerty = 123' => false,
'SELECT Animal AS A JOIN Group AS G ON G.leader = A.id WHERE A.sex=\'male\' OR G.name LIKE "a%"' => true,
'SELECT Animal AS A JOIN Group AS G ON G.leader = A.id WHERE A.id = 1' => true,
'SELECT Animal AS A JOIN Group AS G ON G.leader = A.id WHERE id = 1' => false,
'SELECT Animal AS A JOIN Group AS G ON A.member = G.id' => false,
'SELECT Mammal AS M JOIN Group AS G ON M.member = G.id' => true,
'SELECT Mammal AS M JOIN Group AS G ON A.member = G.id' => false,
'SELECT Mammal AS myAlias JOIN Group AS myAlias ON myAlias.member = myAlias.id' => false,
'SELECT Mammal AS Mammal JOIN Group AS Mammal ON Mammal.member = Mammal.id' => false,
'SELECT Group AS G WHERE G.leader_name LIKE "%"' => true,
'SELECT Group AS G WHERE G.leader_speed < 100000' => true,
'SELECT Mammal AS M JOIN Group AS G ON M.member = G.id WHERE G.leader_name LIKE "%"' => true,
'SELECT Mammal AS M JOIN Group AS G ON M.member = G.id WHERE G.leader_speed < 100000' => true,
'SELECT Mammal AS Child JOIN Mammal AS Dad ON Child.father = Dad.id' => true,
'SELECT Mammal AS Child JOIN Animal AS Dad ON Child.father = Dad.id' => true,
'SELECT Animal AS Child JOIN Mammal AS Dad ON Child.father = Dad.id' => true,
'SELECT Animal AS Child JOIN Animal AS Dad ON Child.father = Dad.id' => true,
'SELECT Animal AS Dad JOIN Animal AS Child ON Child.father = Dad.id' => true,
'SELECT Animal AS Child JOIN Animal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id' => true,
'SELECT Animal AS Child JOIN Animal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id WHERE Dad.pkey = 1' => true,
'SELECT Animal AS Child JOIN Animal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id WHERE Dad.id = 1' => true,
'SELECT Animal AS Child JOIN Animal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id WHERE Dad.name = \'romanoff\'' => false,
'SELECT Animal AS Child JOIN Mammal AS Dad ON Child.father = Dad.id' => true,
'SELECT Animal AS Child JOIN Mammal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id WHERE Dad.name = \'romanoff\'' => true,
'SELECT Animal AS Child JOIN Mammal AS Dad ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id WHERE Dad.name = \'romanoff\' OR Mum.speed = 0' => true,
'SELECT Animal AS Dad JOIN Animal AS Child ON Child.father = Dad.id JOIN Animal AS Mum ON Child.mother = Mum.id' => true,
'SELECT Mammal AS Dad JOIN Mammal AS Child ON Child.father = Dad.id' => true,
'SELECT Mammal AS Dad JOIN Mammal AS Child ON Child.father = Dad.id JOIN Mammal AS Mum ON Child.mother = Mum.id WHERE Dad.name = \'romanoff\' OR Mum.name=\'chloe\' OR Child.name=\'bizounours\'' => true,
);
//$aQueries = array(
// 'SELECT Mammal AS M JOIN Group AS G ON M.member = G.id WHERE G.leader_name LIKE "%"' => true,