Updating DboSource with new query generator, and updating model/dbo test cases

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@4636 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
nate 2007-03-20 17:38:53 +00:00
parent 3cb33ee23b
commit 5197bf60d3
6 changed files with 764 additions and 685 deletions

View file

@ -203,27 +203,6 @@ class DboMysql extends DboSource {
$this->__cacheDescription($this->fullTableName($model, false), $fields);
return $fields;
}
/**
* Returns a quoted name of $data for use in an SQL statement.
*
* @param string $data Name (table.field) to be prepared for use in an SQL statement
* @return string Quoted for MySQL
*/
function name($data) {
$tmp = parent::name($data);
if (!empty($tmp)) {
return $tmp;
}
if ($data == '*') {
return '*';
}
$pos = strpos($data, '`');
if ($pos === false) {
$data = '`'. str_replace('.', '`.`', $data) .'`';
}
return $data;
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*

View file

@ -180,26 +180,6 @@ class DboPostgres extends DboSource {
$this->__cacheDescription($model->tablePrefix . $model->table, $fields);
return $fields;
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
* @return string Quoted and escaped
*/
function name($data) {
if ($data == '*') {
return '*';
}
$pos = strpos($data, '"');
if ($pos === false) {
$data = '"' . str_replace('.', '"."', $data) . '"';
}
return $data;
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
@ -376,24 +356,15 @@ class DboPostgres extends DboSource {
* @param mixed $fields
* @return array
*/
function fields(&$model, $alias, $fields) {
if (is_array($fields)) {
$fields = $fields;
} else {
if ($fields != null) {
if (strpos($fields, ',')) {
$fields = explode(',', $fields);
} else {
$fields = array($fields);
}
$fields = array_map('trim', $fields);
} else {
foreach($model->_tableInfo->value as $field) {
$fields[] = $field['name'];
}
}
function fields(&$model, $alias = null, $fields = array(), $quote = true) {
if (empty($alias)) {
$alias = $model->name;
}
$fields = parent::fields($model, $alias, $fields, false);
if (!$quote) {
return $fields;
}
$count = count($fields);
if ($count >= 1 && $fields[0] != '*' && strpos($fields[0], 'COUNT(*)') === false) {

View file

@ -17,7 +17,7 @@
*
* @filesource
* @copyright Copyright 2005-2007, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.datasources
* @since CakePHP(tm) v 0.10.0.1076
@ -369,13 +369,14 @@ class DboSource extends DataSource {
function field($name, $sql) {
$data = $this->fetchRow($sql);
if (empty($data[$name])) {
if (!isset($data[$name]) || empty($data[$name])) {
return false;
} else {
return $data[$name];
}
}
/**
* Returns a quoted name of $data for use in an SQL statement.
* Strips fields out of SQL functions before quoting.
*
* @param string $data
@ -388,7 +389,12 @@ class DboSource extends DataSource {
return $fields[1] . '(' . $this->name($fields[2]) . ')';
}
}
return null;
if ($data == '*') {
return '*';
}
$data = $this->startQuote . str_replace('.', $this->endQuote . '.' . $this->startQuote, $data) . $this->endQuote;
$data = str_replace($this->startQuote . $this->startQuote, $this->startQuote, $data);
return str_replace($this->endQuote . $this->endQuote, $this->endQuote, $data);
}
/**
* Checks if it's connected to the database
@ -571,6 +577,9 @@ class DboSource extends DataSource {
if (!empty($queryData['fields'])) {
$this->__bypass = true;
$queryData['fields'] = $this->fields($model, null, $queryData['fields']);
} else {
$queryData['fields'] = $this->fields($model);
}
foreach($model->__associations as $type) {
@ -818,7 +827,7 @@ class DboSource extends DataSource {
$alias = $association;
if (!isset($queryData['selfJoin'])) {
$queryData['selfJoin'] = array();
$sql = 'SELECT ' . join(', ', $this->fields($model, $model->name, $queryData['fields']));
$sql = 'SELECT ' . join(', ', $this->fields($model, null, $queryData['fields']));
if($this->__bypass === false){
$sql .= ', ';
$sql .= join(', ', $this->fields($linkModel, $alias, ''));
@ -868,6 +877,10 @@ class DboSource extends DataSource {
$this->__scrubQueryData($assocData);
$joinedOnSelf = false;
if (empty($queryData['fields'])) {
$queryData['fields'] = $this->fields($model, $model->name);
}
if ($linkModel == null) {
if (array_key_exists('selfJoin', $queryData)) {
return $this->generateSelfAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet);
@ -878,21 +891,17 @@ class DboSource extends DataSource {
} else {
$joinFields = null;
}
$sql = 'SELECT ';
if ($this->goofyLimit) {
$sql .= $this->limit($queryData['limit'], $queryData['offset']);
}
$sql .= ' ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])) . $joinFields . ' FROM ';
$sql .= $this->fullTableName($model) . ' ' . $this->alias;
$sql .= $this->name($model->name) . ' ' . join(' ', $queryData['joins']) . ' ';
$sql .= $this->conditions($queryData['conditions']) . ' ' . $this->order($queryData['order']);
if (!$this->goofyLimit) {
$sql .= ' ' . $this->limit($queryData['limit'], $queryData['offset']);
}
return $this->buildStatement(array(
'fields' => array_unique($queryData['fields']),
'table' => $this->fullTableName($model),
'alias' => $model->name,
'limit' => $queryData['limit'],
'offset' => $queryData['offset'],
'joins' => $queryData['joins'],
'conditions' => $queryData['conditions'],
'order' => $queryData['order']
), $model);
}
return $sql;
}
$alias = $association;
@ -901,18 +910,15 @@ class DboSource extends DataSource {
}
if ($external && isset($assocData['finderQuery'])) {
if (!empty($assocData['finderQuery']) && $assocData['finderQuery'] != null) {
if (!empty($assocData['finderQuery'])) {
return $assocData['finderQuery'];
}
}
if (!$external && in_array($type, array('hasOne', 'belongsTo'))) {
if ($this->__bypass === false) {
$fields = join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$this->__assocJoins['fields'][] = $fields;
} else {
$this->__assocJoins = null;
}
if ((!$external && in_array($type, array('hasOne', 'belongsTo')) && $this->__bypass === false) || $external) {
$fields = $this->fields($linkModel, $alias, $assocData['fields']);
} else {
$fields = array();
}
$limit = '';
@ -927,200 +933,172 @@ class DboSource extends DataSource {
switch($type) {
case 'hasOne':
if ($external) {
if (isset($queryData['limit']) && !empty($queryData['limit'])) {
$limit = $this->limit($queryData['limit'], $queryData['offset']);
}
$sql = 'SELECT ';
if ($this->goofyLimit) {
$sql .= $limit;
}
$sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias) . ' ';
$conditions = $queryData['conditions'];
$condition = $this->name($alias) . '.' . $this->name($assocData['foreignKey']);
$condition .= ' = {$__cakeForeignKey__$}';
if (is_array($conditions)) {
$conditions[] = $condition;
} else {
$cond = $this->name($alias) . '.' . $this->name($assocData['foreignKey']);
$cond .= ' = {$__cakeID__$}';
if (trim($conditions) != '') {
$conditions .= ' AND ';
}
$conditions .= $cond;
}
$sql .= $this->conditions($conditions) . $this->order($queryData['order']);
if (!$this->goofyLimit) {
$sql .= $limit;
}
return $sql;
} else {
$sql = ' LEFT JOIN ' . $this->fullTableName($linkModel);
$sql .= ' ' . $this->alias . $this->name($alias) . ' ON ';
$sql .= $this->name($alias) . '.' . $this->name($assocData['foreignKey']);
$sql .= ' = ' . $model->escapeField($model->primaryKey);
if ($assocData['order'] != null) {
$queryData['order'][] = $assocData['order'];
}
$this->__mergeConditions($queryData, $assocData);
if (!in_array($sql, $queryData['joins'])) {
$queryData['joins'][] = $sql;
}
return true;
}
break;
case 'belongsTo':
if ($external) {
$sql = 'SELECT ';
if ($this->goofyLimit) {
$sql .= $limit;
if ($type == 'hasOne') {
$conditions = $this->__mergeConditions($queryData['conditions'], array("{$alias}.{$assocData['foreignKey']}" => '{$__cakeForeignKey__$}'));
} elseif ($type == 'belongsTo') {
$conditions = $this->__mergeConditions($assocData['conditions'], array("{$alias}.{$linkModel->primaryKey}" => '{$__cakeForeignKey__$}'));
}
$query = am($assocData, array(
'conditions' => $conditions,
'table' => $this->fullTableName($linkModel),
'fields' => $fields,
'alias' => $alias
));
$sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias) . ' ';
$conditions = $assocData['conditions'];
$condition = $this->name($alias) . '.' . $this->name($linkModel->primaryKey);
$condition .= ' = {$__cakeForeignKey__$}';
if (is_array($conditions)) {
$conditions[] = $condition;
} else {
if (trim($conditions) != '') {
$conditions .= ' AND ';
}
$conditions .= $condition;
if ($type == 'belongsTo') {
// Dunno if we should be doing this for hasOne also...?
// Or maybe not doing it at all...?
$query = am($query, array(
'order' => $assocData['order'],
'limit' => $limit
));
}
$sql .= $this->conditions($conditions) . $this->order($assocData['order']);
if (!$this->goofyLimit) {
$sql .= $limit;
}
return $sql;
} else {
if ($type == 'hasOne') {
$conditions = array("{$alias}.{$assocData['foreignKey']}" => '{$__cakeIdentifier[' . "{$model->name}.{$model->primaryKey}" . ']__$}');
} elseif ($type == 'belongsTo') {
$conditions = array($model->escapeField($assocData['foreignKey']) => '{$__cakeIdentifier[' . "{$alias}.{$linkModel->primaryKey}" . ']__$}');
}
$sql = ' LEFT JOIN ' . $this->fullTableName($linkModel);
$sql .= ' ' . $this->alias . $this->name($alias) . ' ON ';
$sql .= $this->name($model->name) . '.' . $this->name($assocData['foreignKey']);
$sql .= ' = ' . $this->name($alias) . '.' . $this->name($linkModel->primaryKey);
$join = array(
'table' => $this->fullTableName($linkModel),
'alias' => $alias,
'type' => 'LEFT',
'conditions' => $conditions
);
$queryData['fields'] = am($queryData['fields'], $fields);
$this->__mergeConditions($queryData, $assocData);
if (!in_array($sql, $queryData['joins'])) {
$queryData['joins'][] = $sql;
if (!empty($assocData['order'])) {
$queryData['order'][] = $assocData['order'];
}
if (!in_array($join, $queryData['joins'])) {
$queryData['joins'][] = $join;
}
return true;
}
break;
case 'hasMany':
$conditions = $assocData['conditions'];
$sql = 'SELECT ';
if ($this->goofyLimit) {
$sql .= $limit;
}
$sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields']));
$sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias);
if (is_array($conditions)) {
$conditions[$alias . '.' . $assocData['foreignKey']] = '{$__cakeID__$}';
} else {
$cond = $this->name($alias) . '.' . $this->name($assocData['foreignKey']);
$cond .= ' = {$__cakeID__$}';
if (trim($conditions) != '') {
$conditions .= ' AND ';
}
$conditions .= $cond;
}
$sql .= $this->conditions($conditions);
$sql .= $this->order($assocData['order']);
if (!$this->goofyLimit) {
$sql .= $limit;
}
return $sql;
$query = array(
'conditions' => $this->__mergeConditions(array("{$alias}.{$assocData['foreignKey']}" => '{$__cakeID__$}'), $assocData['conditions']),
'fields' => $this->fields($linkModel, $alias, $assocData['fields']),
'table' => $this->fullTableName($linkModel),
'alias' => $alias,
'order' => $assocData['order'],
'limit' => $limit
);
break;
case 'hasAndBelongsToMany':
$joinTbl = $this->fullTableName($assocData['joinTable']);
$sql = 'SELECT ';
if ($this->goofyLimit) {
$sql .= $limit;
}
$joinFields = array();
$joinAssoc = null;
$joinAlias = $joinTbl;
if (isset($assocData['with']) && !empty($assocData['with'])) {
$joinAssoc = $joinAlias = $model->{$assocData['with']}->name;
$joinFields = $model->{$assocData['with']}->loadInfo();
$joinFields = $joinFields->extract('{n}.name');
if (is_array($joinFields) && !empty($joinFields)) {
$joinFields = $this->fields($model->{$assocData['with']}, $model->{$assocData['with']}->name, $joinFields);
}
}
$sql .= ' ' . join(', ', am($this->fields($linkModel, $alias, $assocData['fields']), $joinFields));
$sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias);
$sql .= ' JOIN ' . $joinTbl;
$joinAssoc = $joinTbl;
if (isset($assocData['with']) && !empty($assocData['with'])) {
$joinAssoc = $model->{$assocData['with']}->name;
$sql .= $this->alias . $this->name($joinAssoc);
}
$sql .= ' ON ' . $this->name($joinAssoc);
$sql .= '.' . $this->name($assocData['foreignKey']) . ' = {$__cakeID__$}';
$sql .= ' AND ' . $this->name($joinAssoc) . '.' . $this->name($assocData['associationForeignKey']);
$sql .= ' = ' . $this->name($alias) . '.' . $this->name($linkModel->primaryKey);
$sql .= $this->conditions($assocData['conditions']);
$sql .= $this->order($assocData['order']);
if (!$this->goofyLimit) {
$sql .= $limit;
}
return $sql;
$query = array(
'conditions' => $assocData['conditions'],
'limit' => $limit,
'offset' => $assocData['offset'],
'table' => $this->fullTableName($linkModel),
'alias' => $alias,
'fields' => am($this->fields($linkModel, $alias, $assocData['fields']), $joinFields),
'order' => $assocData['order'],
'joins' => array(array(
'table' => $joinTbl,
'alias' => $joinAssoc,
'conditions' => array(
array("{$joinAlias}.{$assocData['foreignKey']}" => '{$__cakeID__$}'),
array("{$joinAlias}.{$assocData['associationForeignKey']}" => '{$__cakeIdentifier['."{$alias}.{$linkModel->primaryKey}".']__$}')
))
)
);
break;
}
if (isset($query)) {
return $this->buildStatement($query, $model);
}
return null;
}
function buildJoinStatement($join) {
$data = am(array(
'type' => null,
'alias' => null,
'table' => 'join_table',
'conditions' => array()
), $join);
if (!empty($data['alias'])) {
$data['alias'] = $this->alias . $this->name($data['alias']);
}
if (!empty($data['conditions'])) {
$data['conditions'] = preg_replace('/^\s*WHERE\s*/', '', trim($this->conditions($data['conditions'])));
}
return $this->renderJoinStatement($data);
}
function buildStatement($query, $model) {
$query = am(array('offset' => null, 'joins' => array()), $query);
if (!empty($query['joins'])) {
for ($i = 0; $i < count($query['joins']); $i++) {
if (is_array($query['joins'][$i])) {
$query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]);
}
}
}
return $this->renderStatement(array(
'conditions' => $this->conditions($query['conditions']),
'fields' => join(', ', $query['fields']),
'table' => $query['table'],
'alias' => $this->alias . $this->name($query['alias']),
'order' => $this->order($query['order']),
'limit' => $this->limit($query['limit'], $query['offset']),
'joins' => join(' ', $query['joins'])
));
}
function renderJoinStatement($data) {
extract($data);
return trim("{$type} JOIN {$table} {$alias} ON {$conditions}");
}
function renderStatement($data) {
extract($data);
return "SELECT {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$order} {$limit}";
}
/**
* Private method
*
* @return array
*/
function __mergeConditions(&$queryData, $assocData) {
if (isset($assocData['conditions']) && !empty($assocData['conditions'])) {
if (is_array($queryData['conditions'])) {
$queryData['conditions'] = array_merge((array)$assocData['conditions'], $queryData['conditions']);
function __mergeConditions($query, $assoc) {
if (!empty($assoc)) {
if (is_array($query)) {
return array_merge((array)$assoc, $query);
} else {
if (!empty($queryData['conditions'])) {
$queryData['conditions'] = array($queryData['conditions']);
if (is_array($assocData['conditions'])) {
$queryData['conditions'] = array_merge($queryData['conditions'], $assocData['conditions']);
if (!empty($query)) {
$query = array($query);
if (is_array($assoc)) {
$query = array_merge($query, $assoc);
} else {
$queryData['conditions'][] = $assocData['conditions'];
$query[] = $assoc;
}
return $query;
} else {
$queryData['conditions'] = $assocData['conditions'];
return $assoc;
}
}
}
return $query;
}
/**
* Generates and executes an SQL UPDATE statement for given model, fields, and values.
@ -1133,6 +1111,7 @@ class DboSource extends DataSource {
*/
function update(&$model, $fields = array(), $values = null, $conditions = null) {
$updates = array();
if ($values == null) {
$combined = $fields;
} else {
@ -1152,11 +1131,16 @@ class DboSource extends DataSource {
$updates[] = $update;
}
}
if ($conditions == null) {
$conditions = array($model->primaryKey => $model->getID());
}
$conditions = $this->defaultConditions($model, $conditions);
if (!$this->execute('UPDATE '.$this->fullTableName($model).' SET '.join(',', $updates).$this->conditions($conditions))) {
if ($conditions === false) {
return false;
}
$fields = join(',', $updates);
$table = $this->fullTableName($model);
$conditions = $this->conditions($conditions);
if (!$this->execute("UPDATE {$table} SET {$fields} {$conditions}")) {
$model->onError();
return false;
}
@ -1170,17 +1154,36 @@ class DboSource extends DataSource {
* @return boolean Success
*/
function delete(&$model, $conditions = null) {
if (empty($model->id) && empty($conditions)) {
$query = $this->defaultConditions($model, $conditions);
if ($query === false) {
return false;
} elseif (empty($conditions)) {
$conditions = array($model->primaryKey => (array)$model->id);
}
if ($this->execute('DELETE FROM ' . $this->fullTableName($model) . $this->conditions($conditions)) === false) {
$table = $this->fullTableName($model);
$conditions = $this->conditions($query);
if ($this->execute("DELETE FROM {$table} {$conditions}") === false) {
$model->onError();
return false;
}
return true;
}
/**
* Creates a default set of conditions from the model if $conditions is null/empty.
*
* @param object $model
* @param mixed $conditions
* @return mixed
*/
function defaultConditions(&$model, $conditions) {
if (!empty($conditions)) {
return $conditions;
}
if (!$model->exists()) {
return false;
}
return array($model->primaryKey => (array)$model->getID());
}
/**
* Returns a key formatted like a string Model.fieldname(i.e. Post.title, or Country.name)
*
@ -1190,10 +1193,9 @@ class DboSource extends DataSource {
* @return string
*/
function resolveKey($model, $key, $assoc = null) {
if ($assoc == null) {
if (empty($assoc)) {
$assoc = $model->name;
}
if (!strpos('.', $key)) {
return $this->name($model->name) . '.' . $this->name($key);
}
@ -1214,28 +1216,10 @@ class DboSource extends DataSource {
* @param array $data
*/
function __scrubQueryData(&$data) {
if (!isset($data['conditions'])) {
$data['conditions'] = ' 1 = 1 ';
}
if (!isset($data['fields'])) {
$data['fields'] = '';
}
if (!isset($data['joins'])) {
$data['joins'] = array();
}
if (!isset($data['order'])) {
$data['order'] = '';
}
if (!isset($data['limit'])) {
$data['limit'] = '';
}
if (!isset($data['offset'])) {
$data['offset'] = null;
foreach (array('conditions', 'fields', 'joins', 'order', 'limit', 'offset') as $key) {
if (!isset($data[$key]) || empty($data[$key])) {
$data[$key] = array();
}
}
}
/**
@ -1244,75 +1228,104 @@ class DboSource extends DataSource {
* @param Model $model
* @param string $alias Alias tablename
* @param mixed $fields
* @param boolean $quote If false, returns fields array unquoted
* @return array
*/
function fields(&$model, $alias, $fields) {
$resultMatch = null;
$build = true;
if (is_array($fields)) {
$fields = $fields;
} else {
if ($fields != null) {
preg_match_all('/(\\w*\\([\\s\\S]*?\\)[\.,\\s\\w]*?\\))([\\s\\S]*)/', $fields, $result, PREG_PATTERN_ORDER);
function fields(&$model, $alias = null, $fields = array(), $quote = true) {
if (empty($alias)) {
$alias = $model->name;
}
if(isset($result[1][0])){
$resultMatch = $result[1][0];
if (!is_array($fields)) {
if (!empty($fields)) {
$depth = 0;
$offset = 0;
$buffer = '';
$results = array();
$length = strlen($fields);
if(isset($result[2][0])){
$fields = $result[2][0];
if (preg_match('/AS/i', $fields)) {
$build = false;
while ($offset < $length) {
$tmpOffset = -1;
$offsets = array(strpos($fields, ',', $offset), strpos($fields, '(', $offset), strpos($fields, ')', $offset));
for ($i = 0; $i < 3; $i++) {
if ($offsets[$i] !== false && ($offsets[$i] < $tmpOffset || $tmpOffset == -1)) {
$tmpOffset = $offsets[$i];
}
}
}
if($build === true){
if (strpos($fields, ',')) {
$fields = explode(',', $fields);
if ($tmpOffset !== -1) {
$buffer .= substr($fields, $offset, ($tmpOffset - $offset));
if ($fields{$tmpOffset} == ',' && $depth == 0) {
$results[] = $buffer;
$buffer = '';
} else {
$buffer .= $fields{$tmpOffset};
}
if ($fields{$tmpOffset} == '(') {
$depth++;
}
if ($fields{$tmpOffset} == ')') {
$depth--;
}
$offset = ++$tmpOffset;
} else {
$fields = array($fields);
$results[] = $buffer . substr($fields, $offset);
$offset = $length;
}
$fields = array_map('trim', $fields);
}
} else {
foreach($model->_tableInfo->value as $field) {
$fields[] = $field['name'];
if (!empty($results)) {
$fields = array_map('trim', $results);
} else {
$fields = array();
}
}
}
if($build === true){
$count = count($fields);
if ($count >= 1 && $fields[0] != '*') {
for($i = 0; $i < $count; $i++) {
if (!preg_match('/^.+\\(.*\\)/', $fields[$i])) {
$prepend = '';
if (empty($fields)) {
$fieldData = $model->loadInfo();
$fields = $fieldData->extract('{n}.name');
} else {
$fields = array_filter($fields);
}
if (!$quote) {
return $fields;
}
$count = count($fields);
if (strpos($fields[$i], 'DISTINCT') !== false) {
$prepend = 'DISTINCT ';
$fields[$i] = trim(r('DISTINCT', '', $fields[$i]));
}
if ($count >= 1 && $fields[0] != '*') {
for($i = 0; $i < $count; $i++) {
if (!preg_match('/^.+\\(.*\\)/', $fields[$i])) {
$prepend = '';
$dot = strrpos($fields[$i], '.');
if (strpos($fields[$i], 'DISTINCT') !== false) {
$prepend = 'DISTINCT ';
$fields[$i] = trim(r('DISTINCT', '', $fields[$i]));
}
$dot = strrpos($fields[$i], '.');
if ($dot === false) {
$fields[$i] = $prepend . $this->name($alias) . '.' . $this->name($fields[$i]);
} else {
$build = explode('.', $fields[$i]);
if ($dot === false) {
$fields[$i] = $prepend . $this->name($alias) . '.' . $this->name($fields[$i]);
} else {
$build = explode('.', $fields[$i]);
if (!Set::numeric($build)) {
$fields[$i] = $prepend . $this->name($build[0]) . '.' . $this->name($build[1]);
}
}
} elseif (preg_match('/\(([\.\w]+)\)/', $fields[$i], $field)) {
if (isset($field[1])) {
if (strrpos($field[1], '.') === false) {
$field[1] = $this->name($alias) . '.' . $this->name($field[1]);
} else {
$field[0] = explode('.', $field[1]);
if (!Set::numeric($field[0])) {
$field[0] = join('.', array_map(array($this, 'name'), $field[0]));
$fields[$i] = preg_replace('/\(' . $field[1] . '\)/', '(' . $field[0] . ')', $fields[$i], 1);
}
}
}
}
}
}
if($resultMatch != null){
if(is_string($fields)) {
$fields = array($resultMatch . $fields);
} else {
$fields = array_merge(array($resultMatch), $fields);
}
}
return $fields;
}
/**
@ -1321,17 +1334,15 @@ class DboSource extends DataSource {
* @param mixed $conditions Array or string of conditions
* @return string SQL fragment
*/
function conditions($conditions) {
$clause = '';
if (!is_array($conditions)) {
function conditions($conditions, $quoteValues = true) {
$clause = $out = '';
if (is_string($conditions) || empty($conditions) || $conditions === true) {
if (empty($conditions) || trim($conditions) == '' || $conditions === true) {
return ' WHERE 1 = 1';
}
if (!preg_match('/^WHERE\\x20|^GROUP\\x20BY\\x20|^HAVING\\x20|^ORDER\\x20BY\\x20/i', $conditions, $match)) {
$clause = ' WHERE ';
}
}
if ($conditions === true) {
return $clause . ' 1 = 1';
} elseif (is_string($conditions)) {
if (trim($conditions) == '') {
$conditions = ' 1 = 1';
} else {
@ -1353,9 +1364,7 @@ class DboSource extends DataSource {
for($i = 0; $i < $pregCount; $i++) {
if (!empty($match['1'][$i]) && !is_numeric($match['1'][$i])) {
$conditions = $conditions . ' ';
$match['0'][$i] = preg_replace('/\\./', '\\.', $match['0'][$i]);
$conditions = preg_replace('/^' . $match['0'][$i] . '(?=[^\\w])/', ' '.$this->name($match['1'][$i]), $conditions);
$conditions = preg_replace('/^' . $match['0'][$i] . '(?=[^\\w])/', ' ' . $this->name($match['1'][$i]), $conditions . ' ');
if (strpos($conditions, '(' . $match['0'][$i]) === false) {
$conditions = preg_replace('/[^\w]' . $match['0'][$i] . '(?=[^\\w])/', ' '.$this->name($match['1'][$i]), $conditions);
} else {
@ -1370,12 +1379,12 @@ class DboSource extends DataSource {
} else {
$clause = ' WHERE ';
if (!empty($conditions)) {
$out = $this->conditionKeysToString($conditions);
$out = $this->conditionKeysToString($conditions, $quoteValues);
}
if (empty($out) || empty($conditions)) {
return $clause . ' 1 = 1';
}
return $clause . ' (' . join(') AND (', $out) . ')';
return $clause . join(' AND ', $out);
}
}
/**
@ -1384,7 +1393,7 @@ class DboSource extends DataSource {
* @param array $conditions Array or string of conditions
* @return string SQL fragment
*/
function conditionKeysToString($conditions) {
function conditionKeysToString($conditions, $quoteValues = true) {
$c = 0;
$data = null;
$out = array();
@ -1392,16 +1401,21 @@ class DboSource extends DataSource {
$join = ' AND ';
foreach($conditions as $key => $value) {
if (is_numeric($key) && empty($value)) {
continue;
}
if (in_array(strtolower(trim($key)), $bool)) {
$join = ' ' . strtoupper($key) . ' ';
$value = $this->conditionKeysToString($value);
$value = $this->conditionKeysToString($value, $quoteValues);
if (strpos($join, 'NOT') !== false) {
$out[] = 'NOT (' . join(') ' . strtoupper($key) . ' (', $value) . ')';
} else {
$out[] = '(' . join(') ' . strtoupper($key) . ' (', $value) . ')';
}
} else {
if (is_array($value) && !empty($value)) {
if (is_string($value) && preg_match('/^\{\$__cakeIdentifier\[(.*)\]__\$}$/', $value, $identifier) && isset($identifier[1])) {
$data .= $this->name($key) . ' = ' . $this->name($identifier[1]);
} elseif (is_array($value) && !empty($value)) {
$keys = array_keys($value);
if ($keys[0] === 0) {
$data = $this->name($key) . ' IN (';
@ -1410,21 +1424,23 @@ class DboSource extends DataSource {
$data .= $value[0];
$data .= ')';
} else {
foreach($value as $valElement) {
$data .= $this->value($valElement) . ', ';
if ($quoteValues) {
foreach($value as $valElement) {
$data .= $this->value($valElement) . ', ';
}
}
$data[strlen($data) - 2] = ')';
}
} else {
$out[] = '(' . join(') AND (', $this->conditionKeysToString($value)) . ')';
$out[] = '(' . join(') AND (', $this->conditionKeysToString($value, $quoteValues)) . ')';
}
} elseif(is_numeric($key)) {
} elseif (is_numeric($key)) {
$data = ' ' . $value;
} elseif($value === null || (is_array($value) && empty($value))) {
} elseif ($value === null || (is_array($value) && empty($value))) {
$data = $this->name($key) . ' IS NULL';
} elseif($value === '') {
} elseif ($value === '') {
$data = $this->name($key) . " = ''";
} elseif (preg_match('/^([a-z]*\\([a-z0-9]*\\)\\x20?|(?:' . join('\\x20)|(?:', $this->__sqlOps) . '\\x20)|<[>=]?(?![^>]+>)\\x20?|[>=!]{1,3}(?!<)\\x20?)?(.*)/i', $value, $match)) {
} elseif (preg_match('/^([a-z]*\\([a-z0-9]*\\)\\x20?|(?:' . join('\\x20)|(?:', $this->__sqlOps) . '\\x20)|<=?(?![^>]+>)\\x20?|[>=!]{1,3}(?!<)\\x20?)?(.*)/i', $value, $match)) {
if (preg_match('/(\\x20[\\w]*\\x20)/', $key, $regs)) {
$clause = $regs['1'];
$key = preg_replace('/' . $regs['1'] . '/', '', $key);
@ -1442,8 +1458,10 @@ class DboSource extends DataSource {
$match['2'] = str_replace('-!', '', $match['2']);
$data = $this->name($key) . ' ' . $match['1'] . ' ' . $match['2'];
} else {
$match['2'] = $this->value($match['2']);
$match['2'] = str_replace(' AND ', "' AND '", $match['2']);
if (!empty($match['2']) && $quoteValues) {
$match['2'] = $this->value($match['2']);
$match['2'] = str_replace(' AND ', "' AND '", $match['2']);
}
$data = $this->name($key) . ' ' . $match['1'] . ' ' . $match['2'];
}
}
@ -1585,24 +1603,6 @@ class DboSource extends DataSource {
}
$this->disconnect();
}
/**
* To-be-overridden in subclasses.
*
*/
function buildSchemaQuery($schema) {
die (__("Implement in DBO"));
}
/**
* Destructor. Closes connection to the database.
*
*/
function __destruct() {
if ($this->_transactionStarted) {
$this->rollback();
}
$this->close();
parent::__destruct();
}
/**
* Checks if the specified table contains any record matching specified SQL
*
@ -1612,7 +1612,7 @@ class DboSource extends DataSource {
*/
function hasAny($model, $sql) {
$sql = $this->conditions($sql);
$out = $this->fetchRow("SELECT COUNT(*) " . $this->alias . "count FROM " . $this->fullTableName($model) . ' ' . ($sql ? ' ' . $sql : 'WHERE 1 = 1'));
$out = $this->fetchRow("SELECT COUNT(" . $model->primaryKey . ") " . $this->alias . "count FROM " . $this->fullTableName($model) . ' ' . ($sql ? ' ' . $sql : 'WHERE 1 = 1'));
if (is_array($out)) {
return $out[0]['count'];
@ -1621,22 +1621,6 @@ class DboSource extends DataSource {
}
}
/**
* Gets the 'meta' definition of the given database table, where $model is either
* a model object, or the full table name.
*
* @param mixed $model
* @return array
*/
function getDefinition($model) {
if (is_string($model)) {
$table = $model;
} else {
$table = $this->fullTableName($model, false);
}
}
/**
* Translates between PHP boolean values and Database (faked) boolean values
*
* @param mixed $data Value to be translated
@ -1656,5 +1640,17 @@ class DboSource extends DataSource {
return false;
}
}
/**
* Destructor. Closes connection to the database.
*
*/
function __destruct() {
if ($this->_transactionStarted) {
$this->rollback();
}
$this->close();
parent::__destruct();
}
}
?>
?>

View file

@ -261,6 +261,7 @@ class DboSourceTest extends UnitTestCase {
require_once r('//', '/', APP) . 'config/database.php';
$config = new DATABASE_CONFIG();
$this->db =& new DboTest($config->default);
$this->db->fullDebug = false;
$this->model = new TestModel();
}
@ -273,8 +274,8 @@ class DboSourceTest extends UnitTestCase {
$this->model = new TestModel4();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'belongsTo', 'model'=>'TestModel4Parent');
$binding = array('type' => 'belongsTo', 'model' => 'TestModel4Parent');
$queryData = array();
$resultSet = null;
$null = null;
@ -282,9 +283,10 @@ class DboSourceTest extends UnitTestCase {
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateSelfAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`, `TestModel4Parent`\.`id`, `TestModel4Parent`\.`name`, `TestModel4Parent`\.`created`, `TestModel4Parent`\.`updated`\s+/', $queryData['selfJoin'][0]);
$this->assertPattern('/FROM\s+/', $queryData['selfJoin'][0]);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`, `TestModel4Parent`.`id`, `TestModel4Parent`.`name`, `TestModel4Parent`.`created`, `TestModel4Parent`.`updated`';
$expected .= ' FROM ';
@ -297,327 +299,206 @@ class DboSourceTest extends UnitTestCase {
$this->assertEqual($queryData['selfJoin'][0], $expected);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`, `TestModel4Parent`.`id`, `TestModel4Parent`.`name`, `TestModel4Parent`.`created`, `TestModel4Parent`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model4` AS `TestModel4Parent`';
$expected .= ' ON ';
$expected .= '`TestModel4`.`parent_id` = `TestModel4Parent`.`id`';
$expected .= ' WHERE ';
$expected .= '1 = 1';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`, `TestModel4Parent`\.`id`, `TestModel4Parent`\.`name`, `TestModel4Parent`\.`created`, `TestModel4Parent`\.`updated`\s+/', $result);
$this->assertPattern('/FROM\s+`test_model4` AS `TestModel4`\s+LEFT JOIN\s+`test_model4` AS `TestModel4Parent`/', $result);
$this->assertPattern('/\s+ON\s+`TestModel4`.`parent_id` = `TestModel4Parent`.`id`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+1 = 1\s+$/', $result);
}
function testGenerateAssociationQuerySelfJoinWithConditions() {
$this->model = new TestModel4();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'belongsTo', 'model'=>'TestModel4Parent');
$binding = array('type' => 'belongsTo', 'model' => 'TestModel4Parent');
$queryData = array('conditions' => array('TestModel4Parent.name' => '!= mariano'));
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateSelfAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`, `TestModel4Parent`.`id`, `TestModel4Parent`.`name`, `TestModel4Parent`.`created`, `TestModel4Parent`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model4` AS `TestModel4Parent`';
$expected .= ' ON ';
$expected .= '`TestModel4`.`parent_id` = `TestModel4Parent`.`id`';
$expected .= ' WHERE ';
$expected .= '(`TestModel4Parent`.`name` != \'mariano\')';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`, `TestModel4Parent`\.`id`, `TestModel4Parent`\.`name`, `TestModel4Parent`\.`created`, `TestModel4Parent`\.`updated`\s+/', $result);
$this->assertPattern('/FROM\s+`test_model4` AS `TestModel4`\s+LEFT JOIN\s+`test_model4` AS `TestModel4Parent`/', $result);
$this->assertPattern('/\s+ON\s+`TestModel4`.`parent_id` = `TestModel4Parent`.`id`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?`TestModel4Parent`.`name`\s+!=\s+\'mariano\'(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryHasOne() {
$this->model = new TestModel4();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'hasOne', 'model'=>'TestModel5');
$binding = array('type' => 'hasOne', 'model' => 'TestModel5');
$queryData = array();
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$result = $this->db->buildJoinStatement($queryData['joins'][0]);
$expected = ' LEFT JOIN `test_model5` AS `TestModel5` ON `TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$this->assertEqual($queryData['joins'][0], $expected);
$this->assertEqual(trim($result), trim($expected));
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ', ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' ON ';
$expected .= '`TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$expected .= ' WHERE ';
$expected .= '( 1 = 1 ) AND ( 1 = 1 )';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`, `TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model4` AS `TestModel4`\s+LEFT JOIN\s+/', $result);
$this->assertPattern('/`test_model5` AS `TestModel5`\s+ON\s+`TestModel5`.`test_model4_id` = `TestModel4`.`id`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?\s*1 = 1\s*(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryHasOneWithConditions() {
$this->model = new TestModel4();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'hasOne', 'model'=>'TestModel5');
$binding = array('type' => 'hasOne', 'model' => 'TestModel5');
$queryData = array('conditions' => array('TestModel5.name' => '!= mariano'));
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ', ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' ON ';
$expected .= '`TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$expected .= ' WHERE ';
$expected .= '( 1 = 1 )';
$expected .= ' AND ';
$expected .= '(`TestModel5`.`name` != \'mariano\')';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`, `TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model4` AS `TestModel4`\s+LEFT JOIN\s+`test_model5` AS `TestModel5`/', $result);
$this->assertPattern('/\s+ON\s+`TestModel5`.`test_model4_id` = `TestModel4`.`id`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?\s*`TestModel5`.`name`\s+!=\s+\'mariano\'\s*(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryBelongsTo() {
$this->model = new TestModel5();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'belongsTo', 'model'=>'TestModel4');
$queryData = array();
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$result = $this->db->buildJoinStatement($queryData['joins'][0]);
$expected = ' LEFT JOIN `test_model4` AS `TestModel4` ON `TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$this->assertEqual($queryData['joins'][0], $expected);
$this->assertEqual(trim($result), trim($expected));
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ', ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' ON ';
$expected .= '`TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$expected .= ' WHERE ';
$expected .= '( 1 = 1 ) AND ( 1 = 1 )';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`, `TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model5` AS `TestModel5`\s+LEFT JOIN\s+`test_model4` AS `TestModel4`/', $result);
$this->assertPattern('/\s+ON\s+`TestModel5`.`test_model4_id` = `TestModel4`.`id`\s+WHERE\s+/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?\s*1 = 1\s*(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryBelongsToWithConditions() {
$this->model = new TestModel5();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'belongsTo', 'model'=>'TestModel4');
$binding = array('type' => 'belongsTo', 'model' => 'TestModel4');
$queryData = array('conditions' => array('TestModel5.name' => '!= mariano'));
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$this->assertTrue($result);
$result = $this->db->buildJoinStatement($queryData['joins'][0]);
$expected = ' LEFT JOIN `test_model4` AS `TestModel4` ON `TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$this->assertEqual($queryData['joins'][0], $expected);
$this->assertEqual(trim($result), trim($expected));
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ', ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' LEFT JOIN ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' ON ';
$expected .= '`TestModel5`.`test_model4_id` = `TestModel4`.`id`';
$expected .= ' WHERE ';
$expected .= '( 1 = 1 ) AND (`TestModel5`.`name` != \'mariano\')';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`, `TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model5` AS `TestModel5`\s+LEFT JOIN\s+`test_model4` AS `TestModel4`/', $result);
$this->assertPattern('/\s+ON\s+`TestModel5`.`test_model4_id` = `TestModel4`.`id`\s+WHERE\s+/', $result);
$this->assertPattern('/\s+WHERE\s+`TestModel5`.`name` != \'mariano\'\s*$/', $result);
}
function testGenerateAssociationQueryHasMany() {
$this->model = new TestModel5();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'hasMany', 'model'=>'TestModel6');
$binding = array('type' => 'hasMany', 'model' => 'TestModel6');
$queryData = array();
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$expected = 'SELECT ';
$expected .= '`TestModel6`.`id`, `TestModel6`.`test_model5_id`, `TestModel6`.`name`, `TestModel6`.`created`, `TestModel6`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model6` AS `TestModel6`';
$expected .= ' WHERE ';
$expected .= '1 = 1';
$expected .= ' AND ';
$expected .= '`TestModel6`.`test_model5_id` = {$__cakeID__$}';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel6`\.`id`, `TestModel6`\.`test_model5_id`, `TestModel6`\.`name`, `TestModel6`\.`created`, `TestModel6`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model6` AS `TestModel6`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+`TestModel6`.`test_model5_id`\s+=\s+{\$__cakeID__\$}/', $result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' WHERE ';
$expected .= '1 = 1';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model5` AS `TestModel5`\s+WHERE\s+/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?\s*1 = 1\s*(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryHasManyWithConditions() {
$this->model = new TestModel5();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'hasMany', 'model'=>'TestModel6');
$binding = array('type' => 'hasMany', 'model' => 'TestModel6');
$queryData = array('conditions' => array('TestModel5.name' => '!= mariano'));
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$expected = 'SELECT ';
$expected .= '`TestModel6`.`id`, `TestModel6`.`test_model5_id`, `TestModel6`.`name`, `TestModel6`.`created`, `TestModel6`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model6` AS `TestModel6`';
$expected .= ' WHERE ';
$expected .= '1 = 1';
$expected .= ' AND ';
$expected .= '`TestModel6`.`test_model5_id` = {$__cakeID__$}';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel6`\.`id`, `TestModel6`\.`test_model5_id`, `TestModel6`\.`name`, `TestModel6`\.`created`, `TestModel6`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model6` AS `TestModel6`\s+WHERE\s+/', $result);
$this->assertPattern('/WHERE\s+(?:\()?`TestModel6`\.`test_model5_id`\s+=\s+{\$__cakeID__\$}(?:\))?/', $result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel5`.`id`, `TestModel5`.`test_model4_id`, `TestModel5`.`name`, `TestModel5`.`created`, `TestModel5`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model5` AS `TestModel5`';
$expected .= ' WHERE ';
$expected .= '(`TestModel5`.`name` != \'mariano\')';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel5`\.`id`, `TestModel5`\.`test_model4_id`, `TestModel5`\.`name`, `TestModel5`\.`created`, `TestModel5`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model5` AS `TestModel5`\s+WHERE\s+/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?`TestModel5`.`name`\s+!=\s+\'mariano\'(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryHasAndBelongsToMany() {
$this->model = new TestModel4();
$this->model->loadInfo();
$this->_buildRelatedModels($this->model);
$binding = array('type'=>'hasAndBelongsToMany', 'model'=>'TestModel7');
$binding = array('type' => 'hasAndBelongsToMany', 'model' => 'TestModel7');
$queryData = array();
$resultSet = null;
$null = null;
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$expected = 'SELECT ';
$expected .= '`TestModel7`.`id`, `TestModel7`.`name`, `TestModel7`.`created`, `TestModel7`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model7` AS `TestModel7`';
$expected .= ' JOIN ';
$expected .= '`test_model4_test_model7`';
$expected .= ' ON ';
$expected .= '`test_model4_test_model7`.`test_model4_id` = {$__cakeID__$}';
$expected .= ' AND ';
$expected .= '`test_model4_test_model7`.`test_model7_id` = `TestModel7`.`id`';
$expected .= ' WHERE ';
$expected .= '1 = 1 ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel7`\.`id`, `TestModel7`\.`name`, `TestModel7`\.`created`, `TestModel7`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model7` AS `TestModel7`\s+JOIN\s+`test_model4_test_model7`/', $result);
$this->assertPattern('/\s+ON\s+(?:\()?`test_model4_test_model7`\.`test_model4_id`\s+=\s+{\$__cakeID__\$}(?:\))?/', $result);
$this->assertPattern('/\s+AND\s+(?:\()?`test_model4_test_model7`\.`test_model7_id`\s+=\s+`TestModel7`\.`id`(?:\))?/', $result);
$this->assertPattern('/WHERE\s+(?:\()?1 = 1(?:\))?\s*$/', $result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' WHERE ';
$expected .= '1 = 1';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model4` AS `TestModel4`\s+WHERE/', $result);
$this->assertPattern('/\s+WHERE\s+(?:\()?1 = 1(?:\))?\s*$/', $result);
}
function testGenerateAssociationQueryHasAndBelongsToManyWithConditions() {
@ -633,35 +514,16 @@ class DboSourceTest extends UnitTestCase {
$params = &$this->_prepareAssociationQuery($this->model, $queryData, $binding);
$result = $this->db->generateAssociationQuery($this->model, $params['linkModel'], $params['type'], $params['assoc'], $params['assocData'], $queryData, $params['external'], $resultSet);
$expected = 'SELECT ';
$expected .= '`TestModel7`.`id`, `TestModel7`.`name`, `TestModel7`.`created`, `TestModel7`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model7` AS `TestModel7`';
$expected .= ' JOIN ';
$expected .= '`test_model4_test_model7`';
$expected .= ' ON ';
$expected .= '`test_model4_test_model7`.`test_model4_id` = {$__cakeID__$}';
$expected .= ' AND ';
$expected .= '`test_model4_test_model7`.`test_model7_id` = `TestModel7`.`id`';
$expected .= ' WHERE ';
$expected .= '1 = 1 ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel7`\.`id`, `TestModel7`\.`name`, `TestModel7`\.`created`, `TestModel7`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model7` AS `TestModel7`\s+JOIN\s+`test_model4_test_model7`+/', $result);
$this->assertPattern('/\s+ON\s+(?:\()`test_model4_test_model7`\.`test_model4_id`\s+=\s+{\$__cakeID__\$}(?:\))?/', $result);
$this->assertPattern('/\s+AND\s+(?:\()`test_model4_test_model7`\.`test_model7_id`\s+=\s+`TestModel7`.`id`(?:\))?\s+WHERE\s+/', $result);
$result = $this->db->generateAssociationQuery($this->model, $null, null, null, null, $queryData, false, $null);
$expected = 'SELECT ';
$expected .= '`TestModel4`.`id`, `TestModel4`.`name`, `TestModel4`.`created`, `TestModel4`.`updated`';
$expected .= ' FROM ';
$expected .= '`test_model4` AS `TestModel4`';
$expected .= ' WHERE ';
$expected .= '(`TestModel4`.`name` != \'mariano\')';
$expected .= ' ';
$this->assertEqual($result, $expected);
$this->assertPattern('/^SELECT\s+`TestModel4`\.`id`, `TestModel4`\.`name`, `TestModel4`\.`created`, `TestModel4`\.`updated`\s+/', $result);
$this->assertPattern('/\s+FROM\s+`test_model4` AS `TestModel4`\s+WHERE\s+(?:\()?`TestModel4`.`name`\s+!=\s+\'mariano\'(?:\))?\s*$/', $result);
}
function _buildRelatedModels(&$model) {
foreach($model->__associations as $type) {
foreach($model->{$type} as $assoc => $assocData) {
@ -675,7 +537,7 @@ class DboSourceTest extends UnitTestCase {
}
}
}
function &_prepareAssociationQuery(&$model, &$queryData, $binding) {
$type = $binding['type'];
$assoc = $binding['model'];
@ -694,7 +556,6 @@ class DboSourceTest extends UnitTestCase {
'assocData'=> $assocData,
'external'=> $external
);
return $result;
}
@ -711,17 +572,17 @@ class DboSourceTest extends UnitTestCase {
$expected = " WHERE `Post`.`title` = '1.1'";
$this->assertEqual($result, $expected);
/*
$result = $this->db->conditions("User.id != 0 AND User.user LIKE '%arr%'");
$expected = " WHERE `User`.`id` != 0 AND `User`.`user` LIKE '%arr%'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions("SUM(Post.comments_count) > 500");
$expected = " WHERE SUM( `Post`.`comments_count`) > 500";
$this->assertEqual($result, $expected);
*/
/*
$result = $this->db->conditions("(Post.created < '" . date('Y-m-d H:i:s') . "') GROUP BY YEAR(Post.created), MONTH(Post.created)");
$expected = " WHERE ( `Post`.`created` < '" . date('Y-m-d H:i:s') . "') GROUP BY YEAR( `Post`.`created`), MONTH( `Post`.`created`)";
$this->assertEqual($result, $expected);
*/
$result = $this->db->conditions("score BETWEEN 90.1 AND 95.7");
$expected = " WHERE score BETWEEN 90.1 AND 95.7";
@ -731,37 +592,30 @@ class DboSourceTest extends UnitTestCase {
$expected = " WHERE `Aro`.`rght` = `Aro`.`lft` + 1.1";
$this->assertEqual($result, $expected);
/*
$result = $this->db->conditions("(Post.created < '" . date('Y-m-d H:i:s') . "') GROUP BY YEAR(Post.created), MONTH(Post.created)");
$expected = " WHERE ( `Post`.`created` < '" . date('Y-m-d H:i:s') . "') GROUP BY YEAR( `Post`.`created`), MONTH( `Post`.`created`)";
$this->assertEqual($result, $expected);
*/
$result = $this->db->conditions('Sportstaette.sportstaette LIKE "%ru%" AND Sportstaette.sportstaettenart_id = 2');
$expected = ' WHERE `Sportstaette`.`sportstaette` LIKE "%ru%" AND `Sportstaette`.`sportstaettenart_id` = 2';
//$this->assertPattern('/\s*WHERE\s+`Sportstaette`\.`sportstaette`\s+LIKE\s+"%ru%"\s+AND\s+`Sports/', $result);
$this->assertEqual($result, $expected);
$result = $this->db->conditions('Sportstaette.sportstaettenart_id = 2 AND Sportstaette.sportstaette LIKE "%ru%"');
$expected = ' WHERE `Sportstaette`.`sportstaettenart_id` = 2 AND `Sportstaette`.`sportstaette` LIKE "%ru%"';
$this->assertEqual($result, $expected);
/*
$result = $this->db->conditions('SUM(Post.comments_count) > 500 AND NOT Post.title IS NULL AND NOT Post.extended_title IS NULL');
$expected = ' WHERE SUM( `Post`.`comments_count`) > 500 AND NOT `Post`.`title` IS NULL AND NOT `Post`.`extended_title` IS NULL';
$this->assertEqual($result, $expected);
*/
/*
$result = $this->db->conditions('NOT Post.title IS NULL AND NOT Post.extended_title IS NULL AND SUM(Post.comments_count) > 500');
$expected = ' WHERE NOT `Post`.`title` IS NULL AND NOT `Post`.`extended_title` IS NULL AND SUM( `Post`.`comments_count`) > 500';
$this->assertEqual($result, $expected);
*/
/*
$result = $this->db->conditions('NOT Post.extended_title IS NULL AND NOT Post.title IS NULL AND Post.title != "" AND SPOON(SUM(Post.comments_count) + 1.1) > 500');
$expected = ' WHERE NOT `Post`.`extended_title` IS NULL AND NOT `Post`.`title` IS NULL AND `Post`.`title` != "" AND SPOON(SUM( `Post`.`comments_count`) + 1.1) > 500';
$this->assertEqual($result, $expected);
*/
$result = $this->db->conditions('NOT Post.title_extended IS NULL AND NOT Post.title IS NULL AND Post.title_extended != Post.title');
$expected = ' WHERE NOT `Post`.`title_extended` IS NULL AND NOT `Post`.`title` IS NULL AND `Post`.`title_extended` != `Post`.`title`';
@ -774,57 +628,355 @@ class DboSourceTest extends UnitTestCase {
function testArrayConditionsParsing() {
$result = $this->db->conditions(array('Candy.name' => 'LIKE a', 'HardCandy.name' => 'LIKE c'));
$expected = " WHERE (`Candy`.`name` LIKE 'a') AND (`HardCandy`.`name` LIKE 'c')";
$this->assertEqual($result, $expected);
$this->assertPattern("/^\s+WHERE\s+`Candy`.`name` LIKE\s+'a'\s+AND\s+`HardCandy`.`name`\s+LIKE\s+'c'/", $result);
$result = $this->db->conditions(array('HardCandy.name' => 'LIKE a', 'Candy.name' => 'LIKE c'));
$expected = " WHERE (`HardCandy`.`name` LIKE 'a') AND (`Candy`.`name` LIKE 'c')";
$expected = " WHERE `HardCandy`.`name` LIKE 'a' AND `Candy`.`name` LIKE 'c'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('HardCandy.name' => 'LIKE a%', 'Candy.name' => 'LIKE %c%'));
$expected = " WHERE `HardCandy`.`name` LIKE 'a%' AND `Candy`.`name` LIKE '%c%'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('HardCandy.name' => 'LIKE to be or%', 'Candy.name' => 'LIKE %not to be%'));
$expected = " WHERE `HardCandy`.`name` LIKE 'to be or%' AND `Candy`.`name` LIKE '%not to be%'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('score' => 'BETWEEN 90.1 AND 95.7'));
$expected = " WHERE (`score` BETWEEN '90.1' AND '95.7')";
$expected = " WHERE `score` BETWEEN '90.1' AND '95.7'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('Post.title' => 1.1));
$expected = " WHERE (`Post`.`title` = 1.1)";
$expected = " WHERE `Post`.`title` = 1.1";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('SUM(Post.comments_count)' => '> 500'));
$expected = " WHERE (SUM(`Post`.`comments_count`) > 500)";
$expected = " WHERE SUM(`Post`.`comments_count`) > 500";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('MAX(Post.rating)' => '> 50'));
$expected = " WHERE MAX(`Post`.`rating`) > 50";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('title' => 'LIKE %hello'));
$expected = " WHERE (`title` LIKE '%hello')";
$expected = " WHERE `title` LIKE '%hello'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('Post.name' => 'mad(g)ik'));
$expected = " WHERE (`Post`.`name` mad(g) 'ik')";
$result = $this->db->conditions(array('Post.name' => '= mad(g)ik'));
$expected = " WHERE `Post`.`name` = 'mad(g)ik'";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('score' => array(1, 2, 10)));
$expected = " WHERE `score` IN (1, 2, 10) ";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('score' => '!= 20'));
$expected = " WHERE `score` != 20";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('score' => '> 20'));
$expected = " WHERE `score` > 20";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('or' => array( 'score' => 'BETWEEN 4 AND 5', 'rating' => '> 20') ));
$expected = " WHERE (`score` BETWEEN '4' AND '5') OR (`rating` > 20)";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('or' => array('score' => 'BETWEEN 4 AND 5', array('score' => '> 20')) ));
$expected = " WHERE (`score` > 20) OR (`score` BETWEEN '4' AND '5')";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('and' => array( 'score' => 'BETWEEN 4 AND 5', array('score' => '> 20')) ));
$expected = " WHERE (`score` > 20) AND (`score` BETWEEN '4' AND '5')";
$this->assertEqual($result, $expected);
$result = $this->db->conditions(array('published' => 1, 'or' => array( 'score' => '< 2', array('score' => '> 20')) ));
$expected = " WHERE `published` = 1 AND (`score` > 20) OR (`score` < 2)";
$this->assertEqual($result, $expected);
}
function testFieldParsing() {
/*
$result = $this->db->fields($this->model, 'Post', "CONCAT(REPEAT(' ', COUNT(Parent.name) - 1), Node.name) AS name, Node.created");
$expected = array("CONCAT(REPEAT(' ', COUNT(`Parent`.`name`) - 1), Node.name) AS name", "`Node`.`created`");
$this->assertEqual($result, $expected);
*/
/*
$result = $this->db->fields($this->model, 'Post', "Node.created, CONCAT(REPEAT(' ', COUNT(Parent.name) - 1), Node.name) AS name");
$expected = array("`Node`.`created`", "CONCAT(REPEAT(' ', COUNT(`Parent`.`name`) - 1), Node.name) AS name");
$this->assertEqual($result, $expected);
*/
/*
$result = $this->db->fields($this->model, 'Post', "2.2,COUNT(*), SUM(Something.else) as sum, Node.created, CONCAT(REPEAT(' ', COUNT(Parent.name) - 1), Node.name) AS name,Post.title,Post.1,1.1");
$expected = array(
'2.2', 'COUNT(*)', 'SUM(`Something`.`else`) as sum', '`Node`.`created`',
"CONCAT(REPEAT(' ', COUNT(`Parent`.`name`) - 1), Node.name) AS name", '`Post`.`title`', '`Post`.`1`', '1.1'
);
$this->assertEqual($result, $expected);
*/
$result = $this->db->fields($this->model, 'Post');
$expected = array(
'`Post`.`id`', '`Post`.`client_id`', '`Post`.`name`', '`Post`.`login`',
'`Post`.`passwd`', '`Post`.`addr_1`', '`Post`.`addr_2`', '`Post`.`zip_code`',
'`Post`.`city`', '`Post`.`country`', '`Post`.`phone`', '`Post`.`fax`',
'`Post`.`url`', '`Post`.`email`', '`Post`.`comments`', '`Post`.`last_login`',
'`Post`.`created`', '`Post`.`updated`'
);
$this->assertEqual($result, $expected);
$result = $this->db->fields($this->model, 'Other');
$expected = array(
'`Other`.`id`', '`Other`.`client_id`', '`Other`.`name`', '`Other`.`login`',
'`Other`.`passwd`', '`Other`.`addr_1`', '`Other`.`addr_2`', '`Other`.`zip_code`',
'`Other`.`city`', '`Other`.`country`', '`Other`.`phone`', '`Other`.`fax`',
'`Other`.`url`', '`Other`.`email`', '`Other`.`comments`', '`Other`.`last_login`',
'`Other`.`created`', '`Other`.`updated`'
);
$this->assertEqual($result, $expected);
$result = $this->db->fields($this->model, null, array(), false);
$expected = array('id', 'client_id', 'name', 'login', 'passwd', 'addr_1', 'addr_2', 'zip_code', 'city', 'country', 'phone', 'fax', 'url', 'email', 'comments', 'last_login', 'created', 'updated');
$this->assertEqual($result, $expected);
}
function testMergeAssociations() {
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
'Topic' => array (
array(
'id' => '1', 'topic' => 'Topic', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Topic' => array(
'id' => '1', 'topic' => 'Topic', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
);
$this->db->__mergeAssociation($data, $merge, 'Topic', 'hasOne');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
'User' => array (
array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
);
$this->db->__mergeAssociation($data, $merge, 'User', 'belongsTo');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
array (
'Comment' => false
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Comment' => array()
);
$this->db->__mergeAssociation($data, $merge, 'Comment', 'hasMany');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
array (
'Comment' => array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
),
array(
'Comment' => array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Comment' => array(
array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$this->db->__mergeAssociation($data, $merge, 'Comment', 'hasMany');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
array (
'Comment' => array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
),
array(
'Comment' => array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Comment' => array(
array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31',
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
),
array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31',
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
)
);
$this->db->__mergeAssociation($data, $merge, 'Comment', 'hasMany');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
array (
'Comment' => array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array(
array('id' => 1, 'tag' => 'Tag 1'),
array('id' => 2, 'tag' => 'Tag 2')
)
),
array(
'Comment' => array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array()
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Comment' => array(
array(
'id' => '1', 'comment' => 'Comment 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31',
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array(
array('id' => 1, 'tag' => 'Tag 1'),
array('id' => 2, 'tag' => 'Tag 2')
)
),
array(
'id' => '2', 'comment' => 'Comment 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31',
'User' => array(
'id' => '1', 'user' => 'mariano', 'password' => '5f4dcc3b5aa765d61d8327deb882cf99', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
'Tag' => array()
)
)
);
$this->db->__mergeAssociation($data, $merge, 'Comment', 'hasMany');
$this->assertEqual($data, $expected);
$data = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
)
);
$merge = array(
array (
'Tag' => array(
'id' => '1', 'tag' => 'Tag 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
),
array(
'Tag' => array(
'id' => '2', 'tag' => 'Tag 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
),
array(
'Tag' => array(
'id' => '3', 'tag' => 'Tag 3', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$expected = array(
'Article' => array(
'id' => '1', 'user_id' => '1', 'title' => 'First Article', 'body' => 'First Article Body', 'published' => 'Y', 'created' => '2007-03-18 10:39:23', 'updated' => '2007-03-18 10:41:31'
),
'Tag' => array(
array(
'id' => '1', 'tag' => 'Tag 1', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
array(
'id' => '2', 'tag' => 'Tag 2', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
),
array(
'id' => '3', 'tag' => 'Tag 3', 'created' => '2007-03-17 01:16:23', 'updated' => '2007-03-17 01:18:31'
)
)
);
$this->db->__mergeAssociation($data, $merge, 'Tag', 'hasAndBelongsToMany');
$this->assertEqual($data, $expected);
}
function testMagicMethodQuerying() {
$result = $this->db->query('findByFieldName', array('value'), $this->model);
$expected = array('TestModel.field_name' => '= value');
@ -854,28 +1006,6 @@ class DboSourceTest extends UnitTestCase {
$expected = " ORDER BY ADDTIME(`Event`.`time_begin`, '-06:00:00') ASC";
$this->assertEqual($result, $expected);
}
function testSomething() {
$this->model->Test2 = new TestModel2();
$this->model->hasAndBelongsToMany = array('Test2' => array(
// 'with' => 'Testship',
'className' => 'TestModel2',
'joinTable' => 'tests',
'foreignKey' => 'contact_id',
'associationForeignKey' => 'project_id',
'conditions' => null,
'fields' => null,
'order' => null,
'limit' => null,
'offset' => null,
'unique' => null,
'finderQuery' => null,
'deleteQuery' => null,
'insertQuery' => null
));
//generateAssociationQuery($this->model, $this->model->Test2, $type, $association = null, $assocData = array(), &$queryData, $external = false, &$resultSet)
}
}
?>

View file

@ -645,9 +645,6 @@ class ModelTest extends UnitTestCase {
);
$this->assertEqual($result, $expected);
$db =& ConnectionManager::getDataSource('test_suite');
$db->fullDebug = true;
$this->model->recursive = 2;
$result = $this->model->read('id, user', 3);
$expected = array(
@ -707,7 +704,9 @@ class ModelTest extends UnitTestCase {
)
);
$this->assertEqual($result, $expected);
$this->db->fullDebug = true;
$result = $this->model->findAll(array('Article.user_id' => 3), null, null, null, 1, 2);
$expected = array (
array (
@ -747,7 +746,12 @@ class ModelTest extends UnitTestCase {
)
)
);
$this->assertEqual($result, $expected);
/*pr($result);
pr($expected);
pr(var_dump($expected[0]['Comment'][0]['Attachment']));
pr(var_dump($result[0]['Comment'][0]['Attachment']));
pr(array_diff_recursive($result, $expected));*/
$this->assertEqual($expected, $result);
}
function testSaveField() {

View file

@ -43,7 +43,6 @@ class AllCoreWithOutDatabaseGroupTest extends GroupTest {
TestManager::addTestFile($this, CORE_TEST_CASES . DS . 'libs' . DS . 'validation');
TestManager::addTestFile($this, CORE_TEST_CASES . DS . 'libs' . DS . 'session');
TestManager::addTestFile($this, CORE_TEST_CASES . DS . 'libs' . DS . 'socket');
TestManager::addTestFile($this, CORE_TEST_CASES . DS . 'libs' . DS . 'model' . DS . 'model');
TestManager::addTestCasesFromDirectory($this, CORE_TEST_CASES . DS . 'libs' . DS . 'view');
}
}