diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index 4c7194160..1ddba44e6 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -34,10 +34,7 @@ function getArguments(){ $arguments = array(); foreach($this->conditions as $condition){ - if(is_a($condition, 'QueryTag')) $arguments = array_merge($arguments, $condition->getArguments()); - else - $arguments[] = $condition->getArgument(); } return $arguments; } diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index cf224c0fb..19232141c 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -44,8 +44,12 @@ $this->pipe = $pipe; } - function getArgument(){ - return $this->argument; + function getArguments(){ + $arguments = array(); + if($this->query) + $arguments = array_merge($arguments, $this->query->getArguments()); + $arguments[] = $this->argument; + return $arguments; } function getConditionString(){ diff --git a/classes/xml/xmlquery/tags/query/QueryTag.class.php b/classes/xml/xmlquery/tags/query/QueryTag.class.php index 6631159fa..41c7db291 100644 --- a/classes/xml/xmlquery/tags/query/QueryTag.class.php +++ b/classes/xml/xmlquery/tags/query/QueryTag.class.php @@ -171,6 +171,7 @@ class QueryTag { $arguments = array(); if($this->columns) $arguments = array_merge($arguments, $this->columns->getArguments()); + $arguments = array_merge($arguments, $this->tables->getArguments()); $arguments = array_merge($arguments, $this->conditions->getArguments()); $arguments = array_merge($arguments, $this->navigation->getArguments()); return $arguments; diff --git a/classes/xml/xmlquery/tags/table/TableTag.class.php b/classes/xml/xmlquery/tags/table/TableTag.class.php index 6c047acdc..8fe35ff6f 100644 --- a/classes/xml/xmlquery/tags/table/TableTag.class.php +++ b/classes/xml/xmlquery/tags/table/TableTag.class.php @@ -24,7 +24,7 @@ var $alias; var $join_type; var $conditions; - + var $conditionsTag; /** * @brief Initialises Table Tag properties * @param XML tag $table @@ -41,6 +41,9 @@ $this->join_type = $table->attrs->type; $this->conditions = $table->conditions; + + if($this->isJoinTable()) + $this->conditionsTag = new JoinConditionsTag($this->conditions); } function isJoinTable(){ @@ -66,16 +69,20 @@ function getTableString(){ $dbParser = XmlQueryParser::getDBParser(); if($this->isJoinTable()){ - $conditionsTag = new JoinConditionsTag($this->conditions); return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)' , $dbParser->escape($this->name) , $dbParser->escape($this->alias) - , $this->join_type, $conditionsTag->toString()); + , $this->join_type, $this->conditionsTag->toString()); } return sprintf('new Table(\'%s\'%s)' , $dbParser->escape($this->name) , $this->alias ? ', \'' . $dbParser->escape($this->alias) .'\'' : ''); } + + function getArguments(){ + if(!isset($this->conditionsTag)) return array(); + return $this->conditionsTag->getArguments(); + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/table/TablesTag.class.php b/classes/xml/xmlquery/tags/table/TablesTag.class.php index 32a95606e..3c1d6fcdb 100644 --- a/classes/xml/xmlquery/tags/table/TablesTag.class.php +++ b/classes/xml/xmlquery/tags/table/TablesTag.class.php @@ -53,5 +53,12 @@ $output_tables .= ')'; return $output_tables; } + + function getArguments(){ + $arguments = array(); + foreach($this->tables as $table) + $arguments = array_merge($arguments, $table->getArguments()); + return $arguments; + } } ?> \ No newline at end of file diff --git a/test-phpUnit/db/DBTest.php b/test-phpUnit/db/DBTest.php index 073cefe05..c4d43a02f 100644 --- a/test-phpUnit/db/DBTest.php +++ b/test-phpUnit/db/DBTest.php @@ -2,13 +2,13 @@ class DBTest extends PHPUnit_Framework_TestCase { function _testQuery($xml_file, $argsString, $expected, $methodName){ - //echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL; - //echo $xml_file; - //echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL; + echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL; + echo $xml_file; + echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL; $tester = new QueryTester(); $outputString = $tester->getNewParserOutputString($xml_file, $argsString); - //echo $outputString; + echo $outputString; $output = eval($outputString); if(!is_a($output, 'Query')){ @@ -18,8 +18,8 @@ $querySql = $db->{$methodName}($output); // Remove whitespaces, tabs and all - $querySql = Helper::cleanQuery($querySql); - $expected = Helper::cleanQuery($expected); + $querySql = Helper::cleanString($querySql); + $expected = Helper::cleanString($expected); } $this->assertEquals($expected, $querySql); } @@ -37,8 +37,8 @@ $queryArguments = $output->getArguments(); // Remove whitespaces, tabs and all - $querySql = Helper::cleanQuery($querySql); - $expected = Helper::cleanQuery($expected); + $querySql = Helper::cleanString($querySql); + $expected = Helper::cleanString($expected); } // Test @@ -51,9 +51,14 @@ $this->assertEquals($expectedArgs[$i], $queryArguments[$i]->getValue()); } } + + function _testCachedOutput($expected, $actual){ + $expected = Helper::cleanString($expected); + $actual = Helper::cleanString($actual); + + $this->assertEquals($expected, $actual); + + } } -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ + ?> diff --git a/test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php b/test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php index 63ce3f923..81fbcf5b1 100644 --- a/test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php +++ b/test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php @@ -19,7 +19,7 @@ function testSelectUncorrelated1(){ $xml_file = $this->xmlPath . "select_uncorrelated1.xml"; $argsString = '$args->user_id = 4; - '; + '; $expected = 'select "column_a" as "value_a" , (select max("column_b") as "count" from "xe_table_b" as "table_b" @@ -45,7 +45,7 @@ $this->_test($xml_file, $argsString, $expected); } - function testFromUncorrelated(){ + function testFromUncorrelated1(){ $xml_file = $this->xmlPath . "from_uncorrelated1.xml"; $argsString = '$args->user_id = 4; $args->user_name = 7; @@ -58,17 +58,40 @@ group by "member_srl" ) as "documentcountbymember"'; $this->_test($xml_file, $argsString, $expected); - } + } - function testWhereUncorrelated(){ - $xml_file = $this->xmlPath . "where_uncorrelated1.xml"; - $argsString = ''; - $expected = 'select * from - "xe_member" as "member" - where "regdate" = (select max("regdate") as "maxregdate" - from "xe_documents" as "documents")'; +// function testFromUncorrelated2(){ +// $xml_file = $this->xmlPath . "from_uncorrelated1.xml"; +// $argsString = '$args->user_id = 4; +// $args->user_name = 7; +// '; +// $expected = 'select max("documentcountbymember"."count") as "maxcount" +// from ( +// select "member_srl" as "member_srl" +// , count(*) as "count" +// from "xe_documents" as "documents" +// group by "member_srl" +// ) as "documentcountbymember"'; +// $this->_test($xml_file, $argsString, $expected); +// } + + function testFromUncorrelated2(){ + $xml_file = $this->xmlPath . "from_uncorrelated2.xml"; + $argsString = '$args->member_srl = 4; + $args->module_srl = 7; + '; + $expected = 'select max("documentcountbymember"."count") as "maxcount" + from ( + select "member_srl" as "member_srl" + , count(*) as "count" + from "xe_documents" as "documents" + where "module_srl" = 7 + group by "member_srl" + ) as "documentcountbymember" + where "member_srl" = 4 + '; $this->_test($xml_file, $argsString, $expected); - } + } function testSelectCorrelated1(){ $xml_file = $this->xmlPath . "select_correlated1.xml"; @@ -83,6 +106,22 @@ $this->_test($xml_file, $argsString, $expected); } + function testSelectCorrelated2(){ + $xml_file = $this->xmlPath . "select_correlated2.xml"; + $argsString = '$args->user_id = 7; + $args->module_srl = 17; + '; + $expected = 'select *, + (select count(*) as "count" + from "xe_documents" as "documents" + where "documents"."user_id" = "member"."user_id" + and "module_srl" = 17 + ) as "totaldocumentcount" + from "xe_member" as "member" + where "user_id" = \'7\''; + $this->_test($xml_file, $argsString, $expected); + } + function testWhereCorrelated1(){ $xml_file = $this->xmlPath . "where_correlated1.xml"; $argsString = ''; @@ -96,6 +135,22 @@ $this->_test($xml_file, $argsString, $expected); } + function testWhereCorrelated2(){ + $xml_file = $this->xmlPath . "where_correlated2.xml"; + $argsString = '$args->module_srl = 12; $args->member_srl = 19;'; + $expected = 'select * + from "xe_member" as "member" + where "member_srl" = 19 + and "regdate" = ( + select max("regdate") as "maxregdate" + from "xe_documents" as "documents" + where "documents"."user_id" = "member"."user_id" + and "module_srl" = 12 + ) + '; + $this->_test($xml_file, $argsString, $expected); + } + function testFromCorrelated1(){ $xml_file = $this->xmlPath . "from_correlated1.xml"; $argsString = ''; @@ -111,6 +166,26 @@ ) as "a" left join "xe_member" as "m" on "m"."member" = "a"."member_srl"'; $this->_test($xml_file, $argsString, $expected); - } + } + + function testFromCorrelated2(){ + $xml_file = $this->xmlPath . "from_correlated2.xml"; + $argsString = '$args->module_srl = 12; $args->count = 20;'; + $expected = 'select "m"."member_srl" + , "m"."nickname" + , "m"."regdate" + , "a"."count" + from ( + select "member_srl" as "member_srl" + , count(*) as "count" + from "xe_documents" as "documents" + where "module_srl" = 12 + group by "member_srl" + ) as "a" + left join "xe_member" as "m" on "m"."member" = "a"."member_srl" + where "a"."count" >= 20 +'; + $this->_test($xml_file, $argsString, $expected); + } } ?> diff --git a/test-phpUnit/db/xml_query/cubrid/data/from_correlated2.xml b/test-phpUnit/db/xml_query/cubrid/data/from_correlated2.xml new file mode 100644 index 000000000..8dc162154 --- /dev/null +++ b/test-phpUnit/db/xml_query/cubrid/data/from_correlated2.xml @@ -0,0 +1,33 @@ + + +
+ +
+ + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated2.xml b/test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated2.xml new file mode 100644 index 000000000..6431b3b90 --- /dev/null +++ b/test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated2.xml @@ -0,0 +1,25 @@ + + + + +
+ + + + + + + + + + + +
+
+ + + + + + +
\ No newline at end of file diff --git a/test-phpUnit/db/xml_query/cubrid/data/select_correlated2.xml b/test-phpUnit/db/xml_query/cubrid/data/select_correlated2.xml new file mode 100644 index 000000000..85ab25308 --- /dev/null +++ b/test-phpUnit/db/xml_query/cubrid/data/select_correlated2.xml @@ -0,0 +1,23 @@ + + + + + + + + +
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/test-phpUnit/db/xml_query/cubrid/data/where_correlated2.xml b/test-phpUnit/db/xml_query/cubrid/data/where_correlated2.xml new file mode 100644 index 000000000..2ab45461c --- /dev/null +++ b/test-phpUnit/db/xml_query/cubrid/data/where_correlated2.xml @@ -0,0 +1,23 @@ + + +
+ + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file