[limb-svn] r6039 - in 3.x/trunk/limb/dbal: src src/query src/toolkit tests/cases/non-driver tests/cases/non-driver/criteria tests/cases/non-driver/query

svn at limb-project.com svn at limb-project.com
Mon Jul 2 16:51:09 MSD 2007


Author: pachanga
Date: 2007-07-02 16:51:09 +0400 (Mon, 02 Jul 2007)
New Revision: 6039
URL: http://fisheye.limb-project.com/changelog/limb/?cs=6039

Added:
   3.x/trunk/limb/dbal/src/query/lmbSelectRawQuery.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectRawQueryTest.class.php
Removed:
   3.x/trunk/limb/dbal/src/query/lmbSelectQueryDecorator.class.php
Modified:
   3.x/trunk/limb/dbal/src/lmbDBAL.class.php
   3.x/trunk/limb/dbal/src/lmbSimpleDb.class.php
   3.x/trunk/limb/dbal/src/lmbTableGateway.class.php
   3.x/trunk/limb/dbal/src/query/lmbCriteriaQuery.class.php
   3.x/trunk/limb/dbal/src/query/lmbDeleteQuery.class.php
   3.x/trunk/limb/dbal/src/query/lmbSelectQuery.class.php
   3.x/trunk/limb/dbal/src/query/lmbTableRecordsQuery.class.php
   3.x/trunk/limb/dbal/src/query/lmbTemplateQuery.class.php
   3.x/trunk/limb/dbal/src/query/lmbUpdateQuery.class.php
   3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/criteria/lmbSQLFieldCriteriaTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/lmbDBALTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/lmbSimpleDbTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbDeleteQueryTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbInsertQueryTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectQueryTest.class.php
   3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbUpdateQueryTest.class.php
Log:
-- lmbSelectQueryDecorator removed
-- lmbSelectRawQuery added it copies previous lmbSelectQuery functionality
-- lmbSelectQuery extends lmbSelectRawQuery and accepts a table name in constructor instead of sql
-- lmbDBAL :: query(..) renamed into fetch(..)
-- lmbDBAL :: selectQuery($sql, $conn = null) added, it returns lmbSelectQuery instance
-- lmbDBAL :: updateQuery($sql, $conn = null) added, it return lmbUpdateQuery instance
-- lmbDBAL :: deleteQuery($sql, $conn = null) added, it returns lmbDeleteQuery instance
-- lmbDBAL :: db($conn = null) added, it returns lmbSimpleDb instance
-- lmbDBAL :: table($table, $conn = null) added, it returns lmbTableGateway instance
-- lmbDBAL :: newStatement($sql, $conn = null) added, it returns new statement object for current connection
-- lmbTableGateway doesn't fill $_table_info property at once, instead lazy getTableInfo() is used
-- all query classes return itself for better chaining
-- convenience methods aliases added to all query classes, e.g addCriteria($criteria) has an alias of where($criteria) an so on
-- lmbUpdateQuery :: set($values) method added
-- lmbSelectQuery quotes order fields 
-- lmbSimpleDb doesn't return affected rows count after delete/update operation, use new countAffected() method instead
-- lmbSimpleDb methods return itself for better chaining
-- some other minor fixes and refactorings


Modified: 3.x/trunk/limb/dbal/src/lmbDBAL.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/lmbDBAL.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/lmbDBAL.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,19 +1,23 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
-lmb_require('limb/dbal/toolkit.inc.php');
-
+lmb_require('limb/dbal/toolkit.inc.php');
+lmb_require('limb/dbal/src/lmbSimpleDb.class.php');
+lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
+lmb_require('limb/dbal/src/query/lmbUpdateQuery.class.php');
+lmb_require('limb/dbal/src/query/lmbDeleteQuery.class.php');
+
 /**
  * class lmbDBAL.
  *
  * @package dbal
  * @version $Id$
- */
+ */
 class lmbDBAL
 {
   static function setDefaultDSN($dsn)
@@ -31,11 +35,42 @@
     return lmbToolkit :: instance()->createDbConnection($dsn);
   }
 
-  static function query($sql, $conn = null)
+  static function newStatement($sql, $conn = null)
   {
     if(!$conn)
       $conn = lmbToolkit :: instance()->getDefaultDbConnection();
+    return $conn->newStatement($sql);
+  }
 
+  static function db($conn = null)
+  {
+    return new lmbSimpleDb($conn);
+  }
+
+  static function table($table, $conn = null)
+  {
+    return lmbToolkit :: instance()->createTableGateway($table, $conn);
+  }
+
+  static function selectQuery($table, $conn = null)
+  {
+    return new lmbSelectQuery($table, $conn);
+  }
+
+  static function updateQuery($table, $conn = null)
+  {
+    return new lmbUpdateQuery($table, $conn);
+  }
+
+  static function deleteQuery($table, $conn = null)
+  {
+    return new lmbDeleteQuery($table, $conn);
+  }
+
+  static function fetch($sql, $conn = null)
+  {
+    if(!$conn)
+      $conn = lmbToolkit :: instance()->getDefaultDbConnection();
     $stmt = $conn->newStatement($sql);
     return $stmt->getRecordSet();
   }
@@ -44,7 +79,6 @@
   {
     if(!$conn)
       $conn = lmbToolkit :: instance()->getDefaultDbConnection();
-
     $conn->execute($sql);
   }
 }

Modified: 3.x/trunk/limb/dbal/src/lmbSimpleDb.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/lmbSimpleDb.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/lmbSimpleDb.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,32 +1,38 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbInsertQuery.class.php');
 lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
 lmb_require('limb/dbal/src/query/lmbUpdateQuery.class.php');
 lmb_require('limb/dbal/src/query/lmbDeleteQuery.class.php');
-lmb_require('limb/dbal/src/criteria/lmbSQLFieldCriteria.class.php');
-
+lmb_require('limb/dbal/src/criteria/lmbSQLCriteria.class.php');
+
 /**
  * class lmbSimpleDb.
  *
  * @package dbal
  * @version $Id$
- */
+ */
 class lmbSimpleDb
 {
   protected $conn;
+  protected $stmt;
 
   function __construct($conn)
   {
     $this->conn = $conn;
   }
 
+  function getConnection()
+  {
+    return $this->conn;
+  }
+
   function getType()
   {
     return $this->conn->getType();
@@ -67,11 +73,17 @@
     return $rs->count();
   }
 
+  function countAffected()
+  {
+    if($this->stmt)
+      return $this->stmt->getAffectedRowCount();
+    else
+      return 0;
+  }
+
   function getSelectQuery($table)
   {
-    $query = new lmbSelectQuery(null, $this->conn);
-    $query->addTable($table);
-    return $query;
+    return new lmbSelectQuery($table, $this->conn);
   }
 
   function insert($table, $values, $primary_key = 'id')
@@ -107,9 +119,9 @@
     foreach($values as $key => $value)
       $query->addField($key, $value);
 
-    $stmt = $query->getStatement($this->conn);
-    $stmt->execute();
-    return $stmt->getAffectedRowCount();
+    $this->stmt = $query->getStatement($this->conn);
+    $this->stmt->execute();
+    return $this;
   }
 
   function delete($table, $criteria = null)
@@ -119,9 +131,9 @@
     if($criteria)
       $query->addCriteria(lmbSQLCriteria :: objectify($criteria));
 
-    $stmt = $query->getStatement($this->conn);
-    $stmt->execute();
-    return $stmt->getAffectedRowCount();
+    $this->stmt = $query->getStatement($this->conn);
+    $this->stmt->execute();
+    return $this;
   }
 
   function truncateDb()
@@ -129,26 +141,31 @@
     $info = $this->conn->getDatabaseInfo();
     foreach($info->getTableList() as $table)
       $this->conn->newStatement("DELETE FROM $table")->execute();
+    return $this;
   }
 
   function disconnect()
   {
     $this->conn->disconnect();
+    return $this;
   }
 
   function begin()
   {
     $this->conn->beginTransaction();
+    return $this;
   }
 
   function commit()
   {
     $this->conn->commitTransaction();
+    return $this;
   }
 
   function rollback()
   {
     $this->conn->rollbackTransaction();
+    return $this;
   }
 }
 

Modified: 3.x/trunk/limb/dbal/src/lmbTableGateway.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/lmbTableGateway.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/lmbTableGateway.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,10 +1,10 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbInsertQuery.class.php');
 lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
@@ -12,14 +12,14 @@
 lmb_require('limb/dbal/src/query/lmbUpdateQuery.class.php');
 lmb_require('limb/dbal/src/query/lmbDeleteQuery.class.php');
 lmb_require('limb/dbal/src/drivers/lmbDbTypeInfo.class.php');
-lmb_require('limb/dbal/src/drivers/lmbDbCachedInfo.class.php');
-
+lmb_require('limb/dbal/src/drivers/lmbDbCachedInfo.class.php');
+
 /**
  * class lmbTableGateway.
  *
  * @package dbal
  * @version $Id$
- */
+ */
 class lmbTableGateway
 {
   protected $_db_table_name;
@@ -44,7 +44,6 @@
     elseif(!$this->_db_table_name)
       $this->_db_table_name = $this->_guessDbTableName();
 
-    $this->_table_info = $this->_loadTableInfo();
     $this->_constraints = $this->_defineConstraints();
     $this->_primary_key_name = $this->_definePrimaryKeyName();
   }
@@ -70,25 +69,38 @@
     return array();
   }
 
+  function getTableName()
+  {
+    return $this->_db_table_name;
+  }
+
   function getTableInfo()
   {
+    if(!$this->_table_info)
+      $this->_table_info = $this->_loadTableInfo();
+
     return $this->_table_info;
   }
 
+  function getConnection()
+  {
+    return $this->_conn;
+  }
+
   function getColumnInfo($name)
   {
     if($this->hasColumn($name))
-      return $this->_table_info->getColumn($name);
+      return $this->getTableInfo()->getColumn($name);
   }
 
   function hasColumn($name)
   {
-    return $this->_table_info->hasColumn($name);
+    return $this->getTableInfo()->hasColumn($name);
   }
 
   function getColumnNames()
   {
-    return $this->_table_info->getColumnList();
+    return $this->getTableInfo()->getColumnList();
   }
 
   function getConstraints()
@@ -101,7 +113,7 @@
     if(!$this->hasColumn($column_name))
       return false;
 
-    return $this->_table_info->getColumn($column_name)->getType();
+    return $this->getTableInfo()->getColumn($column_name)->getType();
   }
 
   function getPrimaryKeyName()
@@ -111,7 +123,7 @@
 
   function isAutoIncrement($field)
   {
-    return $this->_table_info->getColumn($field)->isAutoIncrement();
+    return $this->getTableInfo()->getColumn($field)->isAutoIncrement();
   }
 
   function getStatement()
@@ -169,13 +181,13 @@
 
       $this->_stmt = $query->getStatement();
       $this->_bindValuesToStatement($this->_stmt, $set);
-      return $this->_stmt->execute();
+      $this->_stmt->execute();
     }
     else
     {
       $query->addRawField($set);
       $this->_stmt = $query->getStatement();
-      return $this->_stmt->execute();
+      $this->_stmt->execute();
     }
   }
 
@@ -242,8 +254,7 @@
 
   function getSelectQuery($fields = array())
   {
-    $query = new lmbSelectQuery(null, $this->_conn);
-    $query->addTable($this->_db_table_name);
+    $query = new lmbSelectQuery($this->_db_table_name, $this->_conn);
 
     if(!$fields)
       $fields = $this->getColumnsForSelect();
@@ -270,11 +281,6 @@
     return $this->delete(new lmbSQLFieldCriteria($this->_primary_key_name, $id));
   }
 
-  function getTableName()
-  {
-    return $this->_db_table_name;
-  }
-
   protected function _mapTableNameToClass($table_name)
   {
     return lmb_camel_case($table_name);
@@ -292,7 +298,6 @@
       if(!in_array($name, $exclude_columns))
         $fields[$table_name . '.' . $name] = $prefix . $name;
     }
-
     return $fields;
   }
 

Modified: 3.x/trunk/limb/dbal/src/query/lmbCriteriaQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbCriteriaQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbCriteriaQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,9 +2,9 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbTemplateQuery.class.php');
 lmb_require('limb/dbal/src/criteria/lmbSQLCriteria.class.php');
@@ -23,8 +23,14 @@
   function addCriteria($criteria)
   {
     $this->_criterias[] = lmbSQLCriteria :: objectify($criteria);
+    return $this;
   }
 
+  function where($criteria)
+  {
+    return $this->addCriteria($criteria);
+  }
+
   function getStatementValues()
   {
     return $this->_stmt_values;

Modified: 3.x/trunk/limb/dbal/src/query/lmbDeleteQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbDeleteQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbDeleteQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,9 +2,9 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbCriteriaQuery.class.php');
 
@@ -24,6 +24,11 @@
     parent :: __construct("DELETE FROM %table% %where%", $conn);
   }
 
+  function getTable()
+  {
+    return $this->_table;
+  }
+
   protected function _getTableHint()
   {
     return $this->_conn->quoteIdentifier($this->_table);

Modified: 3.x/trunk/limb/dbal/src/query/lmbSelectQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbSelectQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbSelectQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,11 +2,11 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
-lmb_require('limb/dbal/src/query/lmbCriteriaQuery.class.php');
+lmb_require('limb/dbal/src/query/lmbSelectRawQuery.class.php');
 
 //TODO: use primitive lexer for parsing sql templates someday...
 
@@ -16,238 +16,12 @@
  * @package dbal
  * @version $Id$
  */
-class lmbSelectQuery extends lmbCriteriaQuery
+class lmbSelectQuery extends lmbSelectRawQuery
 {
-  protected $_fields = array();
-  protected $_tables = array();
-  protected $_left_join_constraints  = array();
-  protected $_order = array();
-  protected $_having = array();
-  protected $_group_by = array();
-
-  function __construct($sql = null, $conn)
+  function __construct($table, $conn = null)
   {
-    if(is_null($sql))
-      $sql = "SELECT %fields% FROM %tables% %left_join% %where% %group% %having% %order%";
-
-    parent :: __construct($sql, $conn);
+    parent :: __construct(lmbSelectRawQuery :: DEFAULT_SQL_TEMPLATE, $conn);
+    $this->addTable($table);
   }
-
-  function addField($field, $alias = null)
-  {
-    $this->_fields[$field] = $alias;
-  }
-
-  function addTable($table, $alias = null)
-  {
-    $this->_tables[$table] = $alias;
-  }
-
-  function addOrder($field, $type='ASC')
-  {
-    $this->_order[] = "$field $type";
-  }
-
-  function addGroupBy($group)
-  {
-    $this->_group_by[] = $group;
-  }
-
-  function addHaving($criteria)
-  {
-    $this->_having[] = $criteria;
-  }
-
-  function addLeftJoin($table, $connect_by)
-  {
-    $this->_left_join_constraints[$table] = $connect_by;
-  }
-
-  function getRecordSet()
-  {
-    $stmt = $this->getStatement();
-    return $stmt->getRecordSet();
-  }
-
-  protected function _getFieldsHint()
-  {
-    $fields = '';
-    foreach($this->_fields as $field => $alias)
-    {
-      $fields .= $this->_conn->quoteIdentifier($field) .
-                 ($alias ? ' as ' . $this->_conn->quoteIdentifier($alias) : '') . ',';
-    }
-    $fields = rtrim($fields, ',');
-
-    if($this->_selectFieldsExists())
-    {
-      if(count($this->_fields))
-        return ',' . $fields;
-      else
-        return '';
-    }
-    elseif(count($this->_fields) == 0)
-      return '*';
-    else
-      return $fields;
-  }
-
-  protected function _getTablesHint()
-  {
-    if(count($this->_tables) == 0)
-      return '';
-
-    $tables = '';
-    foreach($this->_tables as $table => $alias)
-    {
-      $tables .= $this->_conn->quoteIdentifier($table) .
-                 ($alias ? ' ' . $this->_conn->quoteIdentifier($alias) : '') . ',';
-    }
-    $tables = rtrim($tables, ',');
-
-    if($this->_selectTablesExists())
-      $tables = ',' . $tables;
-
-    return $tables;
-  }
-
-  protected function _getLeftJoinHint()
-  {
-    $join = array();
-    foreach($this->_left_join_constraints as $table => $connect_by)
-    {
-      $foreign_key = $this->_conn->quoteIdentifier(key($connect_by));
-      $alias_key = $this->_conn->quoteIdentifier(reset($connect_by));
-      $join[] = "LEFT JOIN " . $this->_conn->quoteIdentifier($table) . " ON $foreign_key=$alias_key";
-    }
-
-    return implode(' ', $join);
-  }
-
-  protected function _getGroupHint()
-  {
-    if (count($this->_group_by) == 0)
-      return '';
-
-    $group = implode(',', array_map(array($this->_conn, 'quoteIdentifier'), $this->_group_by));
-
-    if($this->_groupByClauseExists($group_by_args))
-    {
-      //primitive check if comma is required
-      if($group_by_args)
-        return ',' . $group;
-      else
-        return $group;
-    }
-    else
-      return 'GROUP BY ' . $group;
-  }
-
-  protected function _getHavingHint()
-  {
-    if (count($this->_having) == 0)
-      return '';
-
-    if(!count($this->_group_by) && !$this->_groupByClauseExists())
-      throw new lmbException('can not generate HAVING condition GROUP BY missing');
-
-    $implode = array();
-    foreach($this->_having as $criteria)
-    {
-      $implode[] = $criteria->toStatementString($this->_stmt_values);
-    }
-
-    $having = implode(' AND ', $implode);
-
-    if($this->_havingClauseExists($having_args))
-    {
-      if($having_args)
-        return 'AND ' . $having;
-      else
-        return $having;
-    }
-    else
-      return 'HAVING ' . $having;
-  }
-
-  protected function _getOrderHint()
-  {
-    if (count($this->_order) == 0)
-      return '';
-
-    $order = implode(',', $this->_order);
-
-    if($this->_orderByClauseExists($order_by_args))
-    {
-      //primitive check if comma is required
-      if($order_by_args)
-        return ',' . $order;
-      else
-        return $order;
-    }
-    else
-      return 'ORDER BY ' . $order;
-  }
-
-  protected function _orderByClauseExists(&$args = '')
-  {
-    //!!!make it better later
-    if(preg_match('~(?<=from).+order\s+by\s(.*)$~si', $this->_getNoHintsSQL(), $matches))
-    {
-      $args = trim($matches[1]);
-      return true;
-    }
-
-    return false;
-  }
-
-  protected function _groupByClauseExists(&$args = '')
-  {
-    //!!!make it better later
-    if(preg_match('~(?<=\Wfrom).+group\s+by\s(.*)$~si', $this->_getNoHintsSQL(), $matches))
-    {
-      $args = trim($matches[1]);
-      return true;
-    }
-
-    return false;
-  }
-
-  protected function _havingClauseExists(&$args = '')
-  {
-    //!!!make it better later
-    if(preg_match('~(?<=\Wgroup)\s+by\s+.+?having\s(.*)(order)?$~si', $this->_getNoHintsSQL(), $matches))
-    {
-      $args = trim($matches[1]);
-      return true;
-    }
-
-    return false;
-  }
-
-  protected function _selectFieldsExists()
-  {
-    //!!!make it better later
-    return preg_match('~^select\s+\S+.+?from~si', $this->_getNoHintsSQL());
-  }
-
-  protected function _selectTablesExists()
-  {
-    return preg_match('~(?<=\Wfrom)\s+\S+(where|order|group)?~si', $this->_getNoHintsSQL());
-  }
-
-  protected function _whereClauseExists(&$args = '')
-  {
-    //primitive check if WHERE was already in sql
-    //!!!make it better later
-    if(preg_match('~(?<=\Wfrom).+where\s+(.*)~si', $this->_getNoHintsSQL(), $matches))
-    {
-      if(preg_match('~([a-zA-Z].*)(group|order)?$~si', $matches[1], $args_matches))
-        $args = $args_matches[1];
-
-      return true;
-    }
-    return false;
-  }
 }
 ?>

Deleted: 3.x/trunk/limb/dbal/src/query/lmbSelectQueryDecorator.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbSelectQueryDecorator.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbSelectQueryDecorator.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,81 +0,0 @@
-<?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
- */
-lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
-
-/**
- * class lmbSelectQueryDecorator.
- *
- * @package dbal
- * @version $Id$
- */
-class lmbSelectQueryDecorator
-{
-  protected $query;
-
-  function __construct($query)
-  {
-    $this->query = $query;
-  }
-
-  function reset()
-  {
-    $this->query->reset();
-  }
-
-  function addField($field)
-  {
-    $this->query->addField($field);
-  }
-
-  function addTable($table)
-  {
-    $this->query->addTable($table);
-  }
-
-  function addOrder($field, $type='ASC')
-  {
-    $this->query->addOrder($field, $type);
-  }
-
-  function addGroupBy($group)
-  {
-    $this->query->addGroupBy($group);
-  }
-
-  function addLeftJoin($table, $connect_by)
-  {
-    $this->query->addLeftJoin($table, $connect_by);
-  }
-
-  function addCriteria($criteria)
-  {
-    $this->query->addCriteria($criteria);
-  }
-
-  function toString()
-  {
-    return $this->query->toString();
-  }
-
-  function getStatement()
-  {
-    return $this->query->getStatement();
-  }
-
-  function getRecordSet()
-  {
-    return $this->query->getRecordSet();
-  }
-
-  function getStatementValues()
-  {
-    return $this->query->getStatementValues();
-  }
-}
-?>

Added: 3.x/trunk/limb/dbal/src/query/lmbSelectRawQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbSelectRawQuery.class.php	                        (rev 0)
+++ 3.x/trunk/limb/dbal/src/query/lmbSelectRawQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -0,0 +1,329 @@
+<?php
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
+ */
+lmb_require('limb/dbal/src/query/lmbCriteriaQuery.class.php');
+
+//TODO: use primitive lexer for parsing sql templates someday...
+
+/**
+ * class lmbSelectRawQuery.
+ *
+ * @package dbal
+ * @version $Id: lmbSelectRawQuery.class.php 6005 2007-06-19 21:14:49Z pachanga $
+ */
+class lmbSelectRawQuery extends lmbCriteriaQuery
+{
+  const DEFAULT_SQL_TEMPLATE = "SELECT %fields% FROM %tables% %left_join% %where% %group% %having% %order%";
+
+  protected $_fields = array();
+  protected $_tables = array();
+  protected $_left_join_constraints  = array();
+  protected $_order = array();
+  protected $_having = array();
+  protected $_group_by = array();
+
+  function __construct($sql_or_conn = null, $conn = null)
+  {
+    if(is_object($sql_or_conn))
+      parent :: __construct(self :: DEFAULT_SQL_TEMPLATE, $sql_or_conn);
+    else
+      parent :: __construct($sql_or_conn, $conn);
+  }
+
+  function addField($field, $alias = null)
+  {
+    $this->_fields[$field] = $alias;
+    return $this;
+  }
+
+  function field($field, $alias = null)
+  {
+    return $this->addField($field, $alias);
+  }
+
+  function getFields()
+  {
+    return array_keys($this->_fields);
+  }
+
+  function addTable($table, $alias = null)
+  {
+    $this->_tables[] = array($table, $alias);
+    return $this;
+  }
+
+  function from($table, $alias = null)
+  {
+    return $this->addTable($table, $alias);
+  }
+
+  function getTables()
+  {
+    $tables = array();
+    foreach($this->_tables as $item)
+      $tables[] = $item[0];
+    return $tables;
+  }
+
+  function addOrder($field, $type='ASC')
+  {
+    $this->_order[] = $this->_conn->quoteIdentifier($field) . " $type";
+    return $this;
+  }
+
+  function order($field, $type='ASC')
+  {
+    return $this->addOrder($field, $type);
+  }
+
+  function getOrder()
+  {
+    return $this->_order;
+  }
+
+  function addGroupBy($group)
+  {
+    $this->_group_by[] = $group;
+    return $this;
+  }
+
+  function group($group)
+  {
+    return $this->addGroupBy($group);
+  }
+
+  function getGroupBy()
+  {
+    return $this->_group_by;
+  }
+
+  function addHaving($criteria)
+  {
+    $this->_having[] = lmbSQLCriteria :: objectify($criteria);
+    return $this;
+  }
+
+  function having($criteria)
+  {
+    return $this->addHaving($criteria);
+  }
+
+  function getHaving()
+  {
+    return $this->_having;
+  }
+
+  function addLeftJoin($table, $field, $connect_table, $connect_field)
+  {
+    $this->_left_join_constraints[$table] = array($table . '.' . $field => $connect_table . '.' . $connect_field);
+    return $this;
+  }
+
+  function join($table, $field, $connect_table, $connect_field)
+  {
+    return $this->addLeftJoin($table, $field, $connect_table, $connect_field);
+  }
+
+  function getJoins()
+  {
+    return $this->_left_join_constraints;
+  }
+
+  function getRecordSet()
+  {
+    $stmt = $this->getStatement();
+    return $stmt->getRecordSet();
+  }
+
+  function fetch()
+  {
+    return $this->getRecordSet();
+  }
+
+  protected function _getFieldsHint()
+  {
+    $fields = '';
+    foreach($this->_fields as $field => $alias)
+    {
+      $fields .= $this->_conn->quoteIdentifier($field) .
+                 ($alias ? ' as ' . $this->_conn->quoteIdentifier($alias) : '') . ',';
+    }
+    $fields = rtrim($fields, ',');
+
+    if($this->_selectFieldsExists())
+    {
+      if(count($this->_fields))
+        return ',' . $fields;
+      else
+        return '';
+    }
+    elseif(count($this->_fields) == 0)
+      return '*';
+    else
+      return $fields;
+  }
+
+  protected function _getTablesHint()
+  {
+    if(count($this->_tables) == 0)
+      return '';
+
+    $tables = '';
+    foreach($this->_tables as $item)
+    {
+      $tables .= $this->_conn->quoteIdentifier($item[0]) .
+                 ($item[1] ? ' ' . $this->_conn->quoteIdentifier($item[1]) : '') . ',';
+    }
+    $tables = rtrim($tables, ',');
+
+    if($this->_selectTablesExists())
+      $tables = ',' . $tables;
+
+    return $tables;
+  }
+
+  protected function _getLeftJoinHint()
+  {
+    $join = array();
+    foreach($this->_left_join_constraints as $table => $connect_by)
+    {
+      $foreign_key = $this->_conn->quoteIdentifier(key($connect_by));
+      $alias_key = $this->_conn->quoteIdentifier(reset($connect_by));
+      $join[] = "LEFT JOIN " . $this->_conn->quoteIdentifier($table) . " ON $foreign_key=$alias_key";
+    }
+
+    return implode(' ', $join);
+  }
+
+  protected function _getGroupHint()
+  {
+    if (count($this->_group_by) == 0)
+      return '';
+
+    $group = implode(',', array_map(array($this->_conn, 'quoteIdentifier'), $this->_group_by));
+
+    if($this->_groupByClauseExists($group_by_args))
+    {
+      //primitive check if comma is required
+      if($group_by_args)
+        return ',' . $group;
+      else
+        return $group;
+    }
+    else
+      return 'GROUP BY ' . $group;
+  }
+
+  protected function _getHavingHint()
+  {
+    if (count($this->_having) == 0)
+      return '';
+
+    if(!count($this->_group_by) && !$this->_groupByClauseExists())
+      throw new lmbException('can not generate HAVING condition GROUP BY missing');
+
+    $implode = array();
+    foreach($this->_having as $criteria)
+    {
+      $implode[] = $criteria->toStatementString($this->_stmt_values);
+    }
+
+    $having = implode(' AND ', $implode);
+
+    if($this->_havingClauseExists($having_args))
+    {
+      if($having_args)
+        return 'AND ' . $having;
+      else
+        return $having;
+    }
+    else
+      return 'HAVING ' . $having;
+  }
+
+  protected function _getOrderHint()
+  {
+    if (count($this->_order) == 0)
+      return '';
+
+    $order = implode(',', $this->_order);
+
+    if($this->_orderByClauseExists($order_by_args))
+    {
+      //primitive check if comma is required
+      if($order_by_args)
+        return ',' . $order;
+      else
+        return $order;
+    }
+    else
+      return 'ORDER BY ' . $order;
+  }
+
+  protected function _orderByClauseExists(&$args = '')
+  {
+    //!!!make it better later
+    if(preg_match('~(?<=from).+order\s+by\s(.*)$~si', $this->_getNoHintsSQL(), $matches))
+    {
+      $args = trim($matches[1]);
+      return true;
+    }
+
+    return false;
+  }
+
+  protected function _groupByClauseExists(&$args = '')
+  {
+    //!!!make it better later
+    if(preg_match('~(?<=\Wfrom).+group\s+by\s(.*)$~si', $this->_getNoHintsSQL(), $matches))
+    {
+      $args = trim($matches[1]);
+      return true;
+    }
+
+    return false;
+  }
+
+  protected function _havingClauseExists(&$args = '')
+  {
+    //!!!make it better later
+    if(preg_match('~(?<=\Wgroup)\s+by\s+.+?having\s(.*)(order)?$~si', $this->_getNoHintsSQL(), $matches))
+    {
+      $args = trim($matches[1]);
+      return true;
+    }
+
+    return false;
+  }
+
+  protected function _selectFieldsExists()
+  {
+    //!!!make it better later
+    return preg_match('~^select\s+\S+.+?from~si', $this->_getNoHintsSQL());
+  }
+
+  protected function _selectTablesExists()
+  {
+    return preg_match('~(?<=\Wfrom)\s+\S+(where|order|group)?~si', $this->_getNoHintsSQL());
+  }
+
+  protected function _whereClauseExists(&$args = '')
+  {
+    //primitive check if WHERE was already in sql
+    //!!!make it better later
+    if(preg_match('~(?<=\Wfrom).+where\s+(.*)~si', $this->_getNoHintsSQL(), $matches))
+    {
+      if(preg_match('~([a-zA-Z].*)(group|order)?$~si', $matches[1], $args_matches))
+        $args = $args_matches[1];
+
+      return true;
+    }
+    return false;
+  }
+}
+?>

Modified: 3.x/trunk/limb/dbal/src/query/lmbTableRecordsQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbTableRecordsQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbTableRecordsQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,11 +2,11 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
-lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
+lmb_require('limb/dbal/src/query/lmbSelectRawQuery.class.php');
 
 /**
  * class lmbTableRecordsQuery.
@@ -14,7 +14,7 @@
  * @package dbal
  * @version $Id$
  */
-class lmbTableRecordsQuery extends lmbSelectQuery
+class lmbTableRecordsQuery extends lmbSelectRawQuery
 {
   function __construct($table, $conn)
   {

Modified: 3.x/trunk/limb/dbal/src/query/lmbTemplateQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbTemplateQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbTemplateQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,9 +2,9 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 
 /**
@@ -20,12 +20,19 @@
   protected $_conn;
   protected $_hints;
 
-  function __construct($template_sql, $conn)
+  function __construct($template_sql, $conn=null)
   {
     $this->_template_sql = $template_sql;
+    if(!is_object($conn))
+      $conn = lmbToolkit :: instance()->getDefaultDbConnection();
     $this->_conn = $conn;
   }
 
+  function getConnection()
+  {
+    return $this->_conn;
+  }
+
   protected function _declareHints()
   {
     if($this->_hints !== null)
@@ -71,6 +78,11 @@
     return $this->_conn->newStatement($this->toString());
   }
 
+  function execute()
+  {
+    $this->getStatement()->execute();
+  }
+
   protected function _getNoHintsSQL()
   {
     if($this->_no_hints_sql)

Modified: 3.x/trunk/limb/dbal/src/query/lmbUpdateQuery.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/query/lmbUpdateQuery.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/query/lmbUpdateQuery.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,9 +2,9 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbCriteriaQuery.class.php');
 
@@ -29,16 +29,50 @@
     parent :: __construct("UPDATE %table% SET %fields% %where%", $conn);
   }
 
+  function getTable()
+  {
+    return $this->_table;
+  }
+
   function addField($field, $value = LIMB_UPDATE_QUERY_NON_VALUE)
   {
     $this->_fields[$field] = $value;
+    return $this;
   }
 
+  function field($field, $value = LIMB_UPDATE_QUERY_NON_VALUE)
+  {
+    return $this->addField($field, $value);
+  }
+
+  function getFields()
+  {
+    return $this->_fields;
+  }
+
+  function set($values)
+  {
+    foreach($values as $field => $value)
+      $this->addField($field, $value);
+    return $this;
+  }
+
   function addRawField($field)
   {
     $this->_raw_fields[] = $field;
+    return $this;
   }
 
+  function rawField($field)
+  {
+    return $this->addRawField($field);
+  }
+
+  function getRawFields()
+  {
+    return $this->_raw_fields;
+  }
+
   protected function _getTableHint()
   {
     return $this->_conn->quoteIdentifier($this->_table);

Modified: 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -10,6 +10,7 @@
 lmb_require('limb/dbal/src/lmbDBAL.class.php');
 lmb_require('limb/dbal/src/lmbDbDSN.class.php');
 lmb_require('limb/dbal/src/drivers/lmbDbCachedInfo.class.php');
+lmb_require('limb/dbal/src/lmbTableGateway.class.php');
 
 /**
  * class lmbDbTools.

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/criteria/lmbSQLFieldCriteriaTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/criteria/lmbSQLFieldCriteriaTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/criteria/lmbSQLFieldCriteriaTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,13 +1,13 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 require_once('limb/dbal/tests/common.inc.php');
-lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
+lmb_require('limb/dbal/src/query/lmbSelectRawQuery.class.php');
 lmb_require('limb/dbal/src/criteria/lmbSQLFieldCriteria.class.php');
 
 class lmbSQLFieldCriteriaTest extends UnitTestCase
@@ -18,7 +18,7 @@
   function setUp()
   {
     $this->conn = new ConnectionTestStub();
-    $this->query = new lmbSelectQuery('SELECT * FROM any_table WHERE %where%', $this->conn);
+    $this->query = new lmbSelectRawQuery('SELECT * FROM any_table WHERE %where%', $this->conn);
   }
 
   function testEqual()

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbDBALTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbDBALTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbDBALTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,10 +1,10 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/lmbDBAL.class.php');
 lmb_require('limb/dbal/src/drivers/lmbDbConnection.interface.php');
@@ -43,20 +43,28 @@
     $this->assertIsA($conn, 'lmbDbConnection');
   }
 
+  function testNewStatement()
+  {
+    $this->toolkit->setDefaultDbConnection($this->conn);
+    $this->conn->expectOnce('newStatement', array($sql = 'SELECT 1=1'));
+    $this->conn->setReturnValue('newStatement', 'whatever', array($sql));
+    $this->assertEqual(lmbDBAL :: newStatement($sql), 'whatever');
+  }
+
   function testExecute()
   {
     $this->conn->expectOnce('execute', array($sql = 'SELECT 1=1'));
     lmbDBAL :: execute($sql, $this->conn);
   }
 
-  function testExecuteDefaultConnection()
+  function testExecuteUsingDefaultConnection()
   {
     $this->toolkit->setDefaultDbConnection($this->conn);
     $this->conn->expectOnce('execute', array($sql = 'SELECT 1=1'));
     lmbDBAL :: execute('SELECT 1=1');
   }
 
-  function testQuery()
+  function testFetch()
   {
     $stmt = new MockDbQueryStatement();
     $this->conn->expectOnce('newStatement', array($sql = 'SELECT 1=1'));
@@ -64,11 +72,11 @@
     $stmt->expectOnce('getRecordSet');
     $stmt->setReturnValue('getRecordSet', 'result');
 
-    $rs = lmbDBAL :: query($sql, $this->conn);
+    $rs = lmbDBAL :: fetch($sql, $this->conn);
     $this->assertEqual($rs, 'result');
   }
 
-  function testQueryDefaultConnection()
+  function testFetchUsingDefaultConnection()
   {
     $this->toolkit->setDefaultDbConnection($this->conn);
     $stmt = new MockDbQueryStatement();
@@ -77,8 +85,81 @@
     $stmt->expectOnce('getRecordSet');
     $stmt->setReturnValue('getRecordSet', 'result');
 
-    $rs = lmbDBAL :: query($sql);
+    $rs = lmbDBAL :: fetch($sql);
     $this->assertEqual($rs, 'result');
   }
+
+  function testDbMethod()
+  {
+    $db = lmbDBAL :: db($this->conn);
+    $this->assertIsA($db, 'lmbSimpleDb');
+    $this->assertIdentical($db->getConnection(), $this->conn);
+  }
+
+  function testDbMethodUsingDefaultConnection()
+  {
+    $db = lmbDBAL :: db();
+    $this->assertIsA($db, 'lmbSimpleDb');
+  }
+
+  function testTableMethod()
+  {
+    $table = lmbDBAL :: table('test_db_table', $this->conn);
+    $this->assertIsA($table, 'lmbTableGateway');
+    $this->assertEqual($table->getTableName(), 'test_db_table');
+    $this->assertIdentical($this->conn, $table->getConnection());
+  }
+
+  function testTableMethodUsingDefaultConnection()
+  {
+    $table = lmbDBAL :: table('test_db_table');
+    $this->assertIsA($table, 'lmbTableGateway');
+    $this->assertEqual($table->getTableName(), 'test_db_table');
+  }
+
+  function testSelectQueryUsingDefaultConnection()
+  {
+    $query = lmbDBAL :: selectQuery('test_db_table');
+    $this->assertIsA($query, 'lmbSelectQuery');
+    $this->assertEqual($query->getTables(), array('test_db_table'));
+  }
+
+  function testSelectQuery()
+  {
+    $query = lmbDBAL :: selectQuery('test_db_table', $this->conn);
+    $this->assertIsA($query, 'lmbSelectQuery');
+    $this->assertEqual($query->getTables(), array('test_db_table'));
+    $this->assertIdentical($this->conn, $query->getConnection());
+  }
+
+  function testUpdateQuery()
+  {
+    $query = lmbDBAL :: updateQuery('test_db_table', $this->conn);
+    $this->assertIsA($query, 'lmbUpdateQuery');
+    $this->assertEqual($query->getTable(), 'test_db_table');
+    $this->assertIdentical($this->conn, $query->getConnection());
+  }
+
+  function testUpdateQueryUsingDefaultConnection()
+  {
+    $query = lmbDBAL :: updateQuery('test_db_table');
+    $this->assertIsA($query, 'lmbUpdateQuery');
+    $this->assertEqual($query->getTable(), 'test_db_table');
+  }
+
+  function testDeleteQuery()
+  {
+    $query = lmbDBAL :: deleteQuery('test_db_table', $this->conn);
+    $this->assertIsA($query, 'lmbDeleteQuery');
+    $this->assertEqual($query->getTable(), 'test_db_table');
+    $this->assertIdentical($this->conn, $query->getConnection());
+  }
+
+  function testDeleteQueryUsingDefaultConnection()
+  {
+    $query = lmbDBAL :: deleteQuery('test_db_table');
+    $this->assertIsA($query, 'lmbDeleteQuery');
+    $this->assertEqual($query->getTable(), 'test_db_table');
+  }
 }
 ?>

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbSimpleDbTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbSimpleDbTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/lmbSimpleDbTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -74,7 +74,9 @@
     $this->db->insert('test_db_table', array('title' =>  'wow', 'description' => 'description'));
     $this->db->insert('test_db_table', array('title' =>  'wow', 'description' => 'description2'));
 
-    $this->assertEqual($this->db->update('test_db_table', array('description' =>  'new_description')), 2);
+    $this->assertEqual($this->db->countAffected(), 0);
+    $this->db->update('test_db_table', array('description' =>  'new_description'));
+    $this->assertEqual($this->db->countAffected(), 2);
 
     $stmt = $this->conn->newStatement("SELECT * FROM test_db_table");
     $records = $stmt->getRecordSet();
@@ -94,12 +96,12 @@
     $this->db->insert('test_db_table', array('title' =>  'wow', 'description' => 'description2'));
     $this->db->insert('test_db_table', array('title' =>  'yo', 'description' => 'description3'));
 
-    $res = $this->db->update('test_db_table',
-                              array('description' =>  'new_description', 'title' => 'wow2'),
-                              new lmbSQLFieldCriteria('title', 'wow'));
+    $this->assertEqual($this->db->countAffected(), 0);
+    $this->db->update('test_db_table',
+                      array('description' =>  'new_description', 'title' => 'wow2'),
+                      new lmbSQLFieldCriteria('title', 'wow'));
+    $this->assertEqual($this->db->countAffected(), 2);
 
-    $this->assertEqual($res, 2);
-
     $stmt = $this->conn->newStatement("SELECT * FROM test_db_table ORDER BY id");
     $records = $stmt->getRecordSet();
 
@@ -147,7 +149,9 @@
     $this->db->insert('test_db_table', $data[0]);
     $this->db->insert('test_db_table', $data[1]);
 
-    $this->assertEqual($this->db->delete('test_db_table'), 2);
+    $this->assertEqual($this->db->countAffected(), 0);
+    $this->db->delete('test_db_table');
+    $this->assertEqual($this->db->countAffected(), 2);
 
     $stmt = $this->conn->newStatement("SELECT * FROM test_db_table");
     $records = $stmt->getRecordSet();
@@ -165,8 +169,9 @@
     $this->db->insert('test_db_table', $data[0]);
     $this->db->insert('test_db_table', $data[1]);
 
-    $this->assertEqual($this->db->delete('test_db_table',
-                                         new lmbSQLFieldCriteria('description', 'description')), 1);
+    $this->assertEqual($this->db->countAffected(), 0);
+    $this->db->delete('test_db_table',new lmbSQLFieldCriteria('description', 'description'));
+    $this->assertEqual($this->db->countAffected(), 1);
 
     $stmt = $this->conn->newStatement("SELECT * FROM test_db_table");
     $records = $stmt->getRecordSet();

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbDeleteQueryTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbDeleteQueryTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbDeleteQueryTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,9 +2,9 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/criteria/lmbSQLFieldCriteria.class.php');
 lmb_require('limb/dbal/src/lmbSimpleDb.class.php');
@@ -12,12 +12,12 @@
 
 class lmbDeleteQueryTest extends UnitTestCase
 {
-  var $query;
-  var $db;
+  protected $query;
+  protected $db;
 
   function setUp()
   {
-    $toolkit = lmbToolkit :: save();
+    $toolkit = lmbToolkit :: instance();
     $this->conn = $toolkit->getDefaultDbConnection();
     $this->db = new lmbSimpleDb($this->conn);
 
@@ -47,7 +47,7 @@
     $this->assertEqual($rs->count(), 0);
   }
 
-  function testDeleteFiltered()
+  function testDeleteWithCondition()
   {
     $this->db->insert('test_db_table', array('id' => 100));
     $this->db->insert('test_db_table', array('id' => 101));
@@ -64,5 +64,19 @@
     $this->assertEqual($arr[1]['id'], 102);
     $this->assertEqual(sizeof($arr), 2);
   }
+
+  function testChaining()
+  {
+    $this->db->insert('test_db_table', array('id' => 100));
+    $this->db->insert('test_db_table', array('id' => 101));
+
+    $query = new lmbDeleteQuery('test_db_table', $this->conn);
+    $query->where('id=100')->execute();
+
+    $rs = $this->db->select('test_db_table');
+    $arr = $rs->getArray();
+    $this->assertEqual($arr[0]['id'], 101);
+    $this->assertEqual(sizeof($arr), 1);
+  }
 }
 ?>

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbInsertQueryTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbInsertQueryTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbInsertQueryTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,10 +1,10 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/query/lmbInsertQuery.class.php');
 lmb_require('limb/dbal/src/lmbSimpleDb.class.php');
@@ -16,7 +16,7 @@
 
   function setUp()
   {
-    $toolkit = lmbToolkit :: save();
+    $toolkit = lmbToolkit :: instance();
     $this->conn = $toolkit->getDefaultDbConnection();
     $this->db = new lmbSimpleDb($this->conn);
 

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectQueryTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectQueryTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectQueryTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -2,355 +2,20 @@
 /*
  * Limb PHP Framework
  *
- * @link http://limb-project.com 
+ * @link http://limb-project.com
  * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
-require_once('limb/dbal/tests/common.inc.php');
-lmb_require('limb/dbal/src/criteria/lmbSQLRawCriteria.class.php');
-lmb_require('limb/dbal/src/criteria/lmbSQLTableFieldCriteria.class.php');
 lmb_require('limb/dbal/src/query/lmbSelectQuery.class.php');
-lmb_require('limb/dbal/src/drivers/lmbDbConnection.interface.php');
-lmb_require('limb/dbal/src/drivers/lmbDbStatement.interface.php');
 
-Mock :: generate('lmbDbConnection', 'MockConnection');
-Mock :: generate('lmbDbStatement', 'MockStatement');
-
 class lmbSelectQueryTest extends UnitTestCase
 {
-  var $conn;
-
-  function setUp()
+  function testConstruct()
   {
-    $this->conn = new ConnectionTestStub();
-  }
+    $sql = new lmbSelectQuery('foo');
 
-  function testSelect()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test', $this->conn);
-
-    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
+    $this->assertEqual($sql->getTables(), array('foo'));
   }
 
-  function testNoFields()
-  {
-    $sql = new lmbSelectQuery('SELECT %fields% FROM test', $this->conn);
-
-    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
-  }
-
-  function testAddFieldWithFields()
-  {
-    $sql = new lmbSelectQuery("SELECT t3 \n%fields%,t4 FROM test", $this->conn);
-
-    $sql->addField('t1');
-    $sql->addField('t2');
-
-    $this->assertEqual($sql->toString(), "SELECT t3 \n,'t1','t2',t4 FROM test");
-  }
-
-  function testNoFieldsAdded()
-  {
-    $sql = new lmbSelectQuery("SELECT t3 \n%fields%,t4 FROM test", $this->conn);
-
-    $this->assertEqual($sql->toString(), "SELECT t3 \n,t4 FROM test");
-  }
-
-  function testAddFieldNoFields()
-  {
-    $sql = new lmbSelectQuery('SELECT %fields% FROM test', $this->conn);
-
-    $sql->addField('t1');
-    $sql->addField('t2');
-
-    $this->assertEqual($sql->toString(), "SELECT 't1','t2' FROM test");
-  }
-
-  function testAddFieldWithAlias()
-  {
-    $sql = new lmbSelectQuery('SELECT %fields% FROM test', $this->conn);
-
-    $sql->addField('t1', 'a1');
-    $sql->addField('t2', 'a2');
-
-    $this->assertEqual($sql->toString(), "SELECT 't1' as 'a1','t2' as 'a2' FROM test");
-  }
-
-  function testNoAddTable()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test %tables%', $this->conn);
-
-    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
-  }
-
-  function testAddTable()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test \n\t%tables%", $this->conn);
-
-    $sql->addTable('test2');
-    $sql->addTable('test3');
-
-    $this->assertEqual($sql->toString(), "SELECT * FROM test \n\t,'test2','test3'");
-  }
-
-  function testAddTableWithAlias()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test \n\t%tables%", $this->conn);
-
-    $sql->addTable('test2', 't2');
-    $sql->addTable('test3');
-
-    $this->assertEqual($sql->toString(), "SELECT * FROM test \n\t,'test2' 't2','test3'");
-  }
-
-  function testAddLeftJoin()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test %left_join%', $this->conn);
-
-    $sql->addLeftJoin('article', array('test.article_id' => 'article.id'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test LEFT JOIN 'article' ON 'test.article_id'='article.id'");
-  }
-
-  function testEmptyCondition()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test %where%', $this->conn);
-
-    $this->assertEqual($sql->toString(),
-                       'SELECT * FROM test');
-  }
-
-  function testAddCondition()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test WHERE \n%where%", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test WHERE \nc1=:c1:");
-  }
-
-  function testAddConditionNoWhereClause()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test \n%where%", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test \nWHERE c1=:c1:");
-  }
-
-  function testAddConditionNoHint()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test WHERE 1=1", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-    $this->assertEqual($sql->toString(), "SELECT * FROM test WHERE 1=1");
-  }
-
-  function testAddSeveralConditions()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test %where%', $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       'SELECT * FROM test WHERE c1=:c1: AND c2=:c2:');
-  }
-
-  function testAddConditionToExistingConditions()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test WHERE t1=t1\n %where%", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test WHERE t1=t1\n AND c1=:c1: AND c2=:c2:");
-  }
-
-  function testAddConditionToExistingConditionsWithOrder()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test WHERE t1=t1\n\n %where% \n\tORDER BY t1", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test WHERE t1=t1\n\n AND c1=:c1: AND c2=:c2: \n\tORDER BY t1");
-  }
-
-  function testAddConditionToExistingConditionsWithGroup()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test WHERE t1=t1\n\n %where% \n\tGROUP BY t1", $this->conn);
-
-    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test WHERE t1=t1\n\n AND c1=:c1: AND c2=:c2: \n\tGROUP BY t1");
-  }
-
-  function testEmptyOrder()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test \n%order%", $this->conn);
-
-    $this->assertEqual($sql->toString(),
-                       'SELECT * FROM test');
-  }
-
-  function testAddOrderNoOrderClause()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test \n%order%", $this->conn);
-
-    $sql->addOrder('t1');
-    $sql->addOrder('t2', 'DESC');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test \nORDER BY t1 ASC,t2 DESC");
-  }
-
-  function testAddOrderWithOrderClause()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test ORDER BY\n %order%", $this->conn);
-
-    $sql->addOrder('t1');
-    $sql->addOrder('t2', 'DESC');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test ORDER BY\n t1 ASC,t2 DESC");
-  }
-
-  function testAddOrderWithOrderClause2()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test ORDER BY t0 DESC\n %order%", $this->conn);
-
-    $sql->addOrder('t1');
-    $sql->addOrder('t2', 'DESC');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test ORDER BY t0 DESC\n ,t1 ASC,t2 DESC");
-  }
-
-  function testAddOrderWithOrderClause3()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test ORDER BY t0 DESC\n %order%", $this->conn);
-
-    $this->assertEqual($sql->toString(),
-                       'SELECT * FROM test ORDER BY t0 DESC');
-  }
-
-  function testNoGroupsAdded()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test', $this->conn);
-
-    $this->assertEqual($sql->toString(),
-                       'SELECT * FROM test');
-  }
-
-  function testNoGroupsAdded2()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY t0 \n%group%", $this->conn);
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY t0");
-  }
-
-  function testAddGroupBy()
-  {
-    $sql = new lmbSelectQuery('SELECT * FROM test %group%', $this->conn);
-
-    $sql->addGroupBy('t1');
-    $sql->addGroupBy('t2');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY 't1','t2'");
-  }
-
-  function testAddGroupByWithGroupByClause()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY \n%group%", $this->conn);
-
-    $sql->addGroupBy('t1');
-    $sql->addGroupBy('t2');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY \n't1','t2'");
-  }
-
-  function testAddGroupByWithGroupByClause2()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY t0 \n%group%", $this->conn);
-
-    $sql->addGroupBy('t1');
-    $sql->addGroupBy('t2');
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY t0 \n,'t1','t2'");
-  }
-
-  function testAddHavingNoGroupBy()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test %having%", $this->conn);
-
-    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
-
-    try
-    {
-      $sql->toString();
-      $this->assertTrue(false);
-    }
-    catch(lmbException $e){}
-  }
-
-  function testAddHaving()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY id %having%", $this->conn);
-
-    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY id HAVING c1=:c1: AND c2=:c2:");
-  }
-
-  function testAddHavingToExistingHaving()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY id HAVING id=1 %having%", $this->conn);
-
-    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY id HAVING id=1 AND c1=:c1: AND c2=:c2:");
-  }
-
-  function testAddHavingWithExistingOrder()
-  {
-    $sql = new lmbSelectQuery("SELECT * FROM test GROUP BY id HAVING id=1 %having% ORDER BY id", $this->conn);
-
-    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
-    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
-
-    $this->assertEqual($sql->toString(),
-                       "SELECT * FROM test GROUP BY id HAVING id=1 AND c1=:c1: AND c2=:c2: ORDER BY id");
-  }
-
-  function testGetStatement()
-  {
-    $conn = new MockConnection();
-    $stmt = new MockStatement();
-
-    $conn->expectOnce('newStatement');
-    $stmt->expectOnce('set', array('p0t_id', 5));
-    $conn->setReturnReference('newStatement', $stmt);
-
-    $sql = new lmbSelectQuery('SELECT * FROM test %where%', $conn);
-    $sql->addCriteria(new lmbSQLTableFieldCriteria('t.id', 5));
-
-    $sql->getStatement();
-  }
 }
 ?>

Added: 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectRawQueryTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectRawQueryTest.class.php	                        (rev 0)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbSelectRawQueryTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -0,0 +1,394 @@
+<?php
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
+ */
+require_once('limb/dbal/tests/common.inc.php');
+lmb_require('limb/dbal/src/criteria/lmbSQLRawCriteria.class.php');
+lmb_require('limb/dbal/src/criteria/lmbSQLTableFieldCriteria.class.php');
+lmb_require('limb/dbal/src/query/lmbSelectRawQuery.class.php');
+lmb_require('limb/dbal/src/drivers/lmbDbConnection.interface.php');
+lmb_require('limb/dbal/src/drivers/lmbDbStatement.interface.php');
+
+Mock :: generate('lmbDbConnection', 'MockConnection');
+Mock :: generate('lmbDbStatement', 'MockStatement');
+
+class lmbSelectRawQueryTest extends UnitTestCase
+{
+  protected $conn;
+
+  function setUp()
+  {
+    //this stub uses ' quoting for simpler testing
+    $this->conn = new ConnectionTestStub();
+  }
+
+  function testSelect()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test', $this->conn);
+
+    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
+  }
+
+  function testNoFields()
+  {
+    $sql = new lmbSelectRawQuery('SELECT %fields% FROM test', $this->conn);
+
+    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
+  }
+
+  function testAddFieldWithFields()
+  {
+    $sql = new lmbSelectRawQuery("SELECT t3 \n%fields%,t4 FROM test", $this->conn);
+
+    $sql->addField('t1');
+    $sql->addField('t2');
+
+    $this->assertEqual($sql->toString(), "SELECT t3 \n,'t1','t2',t4 FROM test");
+  }
+
+  function testNoFieldsAdded()
+  {
+    $sql = new lmbSelectRawQuery("SELECT t3 \n%fields%,t4 FROM test", $this->conn);
+
+    $this->assertEqual($sql->toString(), "SELECT t3 \n,t4 FROM test");
+  }
+
+  function testAddFieldNoFields()
+  {
+    $sql = new lmbSelectRawQuery('SELECT %fields% FROM test', $this->conn);
+
+    $sql->addField('t1');
+    $sql->addField('t2');
+
+    $this->assertEqual($sql->toString(), "SELECT 't1','t2' FROM test");
+  }
+
+  function testAddFieldWithAlias()
+  {
+    $sql = new lmbSelectRawQuery('SELECT %fields% FROM test', $this->conn);
+
+    $sql->addField('t1', 'a1');
+    $sql->addField('t2', 'a2');
+
+    $this->assertEqual($sql->toString(), "SELECT 't1' as 'a1','t2' as 'a2' FROM test");
+  }
+
+  function testNoAddTable()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %tables%', $this->conn);
+
+    $this->assertEqual($sql->toString(), 'SELECT * FROM test');
+  }
+
+  function testAddTable()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n\t%tables%", $this->conn);
+
+    $sql->addTable('test2');
+    $sql->addTable('test3');
+
+    $this->assertEqual($sql->toString(), "SELECT * FROM test \n\t,'test2','test3'");
+  }
+
+  function testAddTableWithAlias()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n\t%tables%", $this->conn);
+
+    $sql->addTable('test2', 't2');
+    $sql->addTable('test3');
+
+    $this->assertEqual($sql->toString(), "SELECT * FROM test \n\t,'test2' 't2','test3'");
+  }
+
+  function testAddSameTable()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n\t%tables%", $this->conn);
+
+    $sql->addTable('test2', 'a');
+    $sql->addTable('test2', 'b');
+
+    $this->assertEqual($sql->toString(), "SELECT * FROM test \n\t,'test2' 'a','test2' 'b'");
+  }
+
+  function testAddLeftJoin()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %left_join%', $this->conn);
+
+    $sql->addLeftJoin('article', 'id', 'test', 'article_id');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test LEFT JOIN 'article' ON 'article.id'='test.article_id'");
+  }
+
+  function testEmptyCondition()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %where%', $this->conn);
+
+    $this->assertEqual($sql->toString(),
+                       'SELECT * FROM test');
+  }
+
+  function testAddCondition()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test WHERE \n%where%", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test WHERE \nc1=:c1:");
+  }
+
+  function testAddConditionNoWhereClause()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n%where%", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test \nWHERE c1=:c1:");
+  }
+
+  function testAddConditionNoHint()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test WHERE 1=1", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+    $this->assertEqual($sql->toString(), "SELECT * FROM test WHERE 1=1");
+  }
+
+  function testAddSeveralConditions()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %where%', $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       'SELECT * FROM test WHERE c1=:c1: AND c2=:c2:');
+  }
+
+  function testAddConditionToExistingConditions()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test WHERE t1=t1\n %where%", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test WHERE t1=t1\n AND c1=:c1: AND c2=:c2:");
+  }
+
+  function testAddConditionToExistingConditionsWithOrder()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test WHERE t1=t1\n\n %where% \n\tORDER BY t1", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test WHERE t1=t1\n\n AND c1=:c1: AND c2=:c2: \n\tORDER BY t1");
+  }
+
+  function testAddConditionToExistingConditionsWithGroup()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test WHERE t1=t1\n\n %where% \n\tGROUP BY t1", $this->conn);
+
+    $sql->addCriteria(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addCriteria(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test WHERE t1=t1\n\n AND c1=:c1: AND c2=:c2: \n\tGROUP BY t1");
+  }
+
+  function testEmptyOrder()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n%order%", $this->conn);
+
+    $this->assertEqual($sql->toString(),
+                       'SELECT * FROM test');
+  }
+
+  function testAddOrderNoOrderClause()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test \n%order%", $this->conn);
+
+    $sql->addOrder('t1');
+    $sql->addOrder('t2', 'DESC');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test \nORDER BY 't1' ASC,'t2' DESC");
+  }
+
+  function testAddOrderWithOrderClause()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test ORDER BY\n %order%", $this->conn);
+
+    $sql->addOrder('t1');
+    $sql->addOrder('t2', 'DESC');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test ORDER BY\n 't1' ASC,'t2' DESC");
+  }
+
+  function testAddOrderWithOrderClause2()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test ORDER BY t0 DESC\n %order%", $this->conn);
+
+    $sql->addOrder('t1');
+    $sql->addOrder('t2', 'DESC');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test ORDER BY t0 DESC\n ,'t1' ASC,'t2' DESC");
+  }
+
+  function testAddOrderWithOrderClause3()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test ORDER BY t0 DESC\n %order%", $this->conn);
+
+    $this->assertEqual($sql->toString(),
+                       'SELECT * FROM test ORDER BY t0 DESC');
+  }
+
+  function testNoGroupsAdded()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test', $this->conn);
+
+    $this->assertEqual($sql->toString(),
+                       'SELECT * FROM test');
+  }
+
+  function testNoGroupsAdded2()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY t0 \n%group%", $this->conn);
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY t0");
+  }
+
+  function testAddGroupBy()
+  {
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %group%', $this->conn);
+
+    $sql->addGroupBy('t1');
+    $sql->addGroupBy('t2');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY 't1','t2'");
+  }
+
+  function testAddGroupByWithGroupByClause()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY \n%group%", $this->conn);
+
+    $sql->addGroupBy('t1');
+    $sql->addGroupBy('t2');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY \n't1','t2'");
+  }
+
+  function testAddGroupByWithGroupByClause2()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY t0 \n%group%", $this->conn);
+
+    $sql->addGroupBy('t1');
+    $sql->addGroupBy('t2');
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY t0 \n,'t1','t2'");
+  }
+
+  function testAddHavingNoGroupBy()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test %having%", $this->conn);
+
+    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
+
+    try
+    {
+      $sql->toString();
+      $this->assertTrue(false);
+    }
+    catch(lmbException $e){}
+  }
+
+  function testAddHaving()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY id %having%", $this->conn);
+
+    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY id HAVING c1=:c1: AND c2=:c2:");
+  }
+
+  function testAddHavingToExistingHaving()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY id HAVING id=1 %having%", $this->conn);
+
+    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY id HAVING id=1 AND c1=:c1: AND c2=:c2:");
+  }
+
+  function testAddHavingWithExistingOrder()
+  {
+    $sql = new lmbSelectRawQuery("SELECT * FROM test GROUP BY id HAVING id=1 %having% ORDER BY id", $this->conn);
+
+    $sql->addHaving(new lmbSQLRawCriteria('c1=:c1:'));
+    $sql->addHaving(new lmbSQLRawCriteria('c2=:c2:'));
+
+    $this->assertEqual($sql->toString(),
+                       "SELECT * FROM test GROUP BY id HAVING id=1 AND c1=:c1: AND c2=:c2: ORDER BY id");
+  }
+
+  function testGetStatement()
+  {
+    $conn = new MockConnection();
+    $stmt = new MockStatement();
+
+    $conn->expectOnce('newStatement');
+    $stmt->expectOnce('set', array('p0t_id', 5));
+    $conn->setReturnReference('newStatement', $stmt);
+
+    $sql = new lmbSelectRawQuery('SELECT * FROM test %where%', $conn);
+    $sql->addCriteria(new lmbSQLTableFieldCriteria('t.id', 5));
+
+    $sql->getStatement();
+  }
+
+  function testChaining()
+  {
+    $sql = new lmbSelectRawQuery($this->conn);
+    $string = $sql->from('test')->
+              from('test', 'test2')->
+              field('foo', 'f')->
+              join('test', 'id', 'test2', 'id')->
+              order('id', 'desc')->
+              group('id')->
+              having('id=1')->
+              where('id=2')->
+              toString();
+
+   $this->assertEqual($string,
+                      "SELECT 'foo' as 'f' FROM 'test','test' 'test2' " .
+                      "LEFT JOIN 'test' ON 'test.id'='test2.id' " .
+                      "WHERE id=2 GROUP BY 'id' HAVING id=1 ORDER BY 'id' desc");
+  }
+
+  function testFetchUsingDefaultConnection()
+  {
+    $sql = new lmbSelectRawQuery('SELECT 1=1');
+    $rs = $sql->fetch();
+    $this->assertEqual($rs->count(), 1);
+    $this->assertEqual($rs[0], true);
+  }
+}
+?>

Modified: 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbUpdateQueryTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbUpdateQueryTest.class.php	2007-07-02 06:34:26 UTC (rev 6038)
+++ 3.x/trunk/limb/dbal/tests/cases/non-driver/query/lmbUpdateQueryTest.class.php	2007-07-02 12:51:09 UTC (rev 6039)
@@ -1,10 +1,10 @@
 <?php
-/*
- * Limb PHP Framework
- *
- * @link http://limb-project.com 
- * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
- * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
+/*
+ * Limb PHP Framework
+ *
+ * @link http://limb-project.com
+ * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
+ * @license    LGPL http://www.gnu.org/copyleft/lesser.html
  */
 lmb_require('limb/dbal/src/criteria/lmbSQLFieldCriteria.class.php');
 lmb_require('limb/dbal/src/lmbSimpleDb.class.php');
@@ -17,7 +17,7 @@
 
   function setUp()
   {
-    $toolkit = lmbToolkit :: save();
+    $toolkit = lmbToolkit :: instance();
     $this->conn = $toolkit->getDefaultDbConnection();
     $this->db = new lmbSimpleDb($this->conn);
 
@@ -109,7 +109,7 @@
 
     $rs = $this->db->select('test_db_table');
     $rs->rewind();
-    $record = $rs->current();
+    $record = $rs->current(); //this one is not changed
     $this->assertEqual($record->get('id'), 100);
     $this->assertEqual($record->get('title'), '');
     $this->assertEqual($record->get('description'), '');
@@ -120,5 +120,34 @@
     $this->assertEqual($record->get('title'), $title);
     $this->assertEqual($record->get('description'), $description);
   }
+
+  function testChaining()
+  {
+    $this->db->insert('test_db_table', array('id' => 100));
+    $this->db->insert('test_db_table', array('id' => 101));
+
+    $description = 'Some description';
+    $title = 'Some title';
+
+    $query = new lmbUpdateQuery('test_db_table', $this->conn);
+    $query->set(array('description' => $description))->
+            field('title', $title)->
+            rawField('id = id + 10')->
+            where('id=101')->
+            execute();
+
+    $rs = $this->db->select('test_db_table');
+    $rs->rewind();
+    $record = $rs->current(); //this one is not changed
+    $this->assertEqual($record->get('id'), 100);
+    $this->assertEqual($record->get('title'), '');
+    $this->assertEqual($record->get('description'), '');
+
+    $rs->next();
+    $record = $rs->current();
+    $this->assertEqual($record->get('id'), 111);
+    $this->assertEqual($record->get('title'), $title);
+    $this->assertEqual($record->get('description'), $description);
+  }
 }
 ?>



More information about the limb-svn mailing list