Skip to content

Commit 8e87317

Browse files
committed
Making composite keys tests pass in SQLServer
1 parent b89392f commit 8e87317

File tree

3 files changed

+82
-53
lines changed

3 files changed

+82
-53
lines changed

src/Database/Dialect/SqliteDialectTrait.php

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,9 @@
1414
*/
1515
namespace Cake\Database\Dialect;
1616

17+
use Cake\Database\Dialect\TumpleComparisonTranslatorTrait;
1718
use Cake\Database\ExpressionInterface;
1819
use Cake\Database\Expression\FunctionExpression;
19-
use Cake\Database\Expression\IdentifierExpression;
20-
use Cake\Database\Expression\QueryExpression;
21-
use Cake\Database\Expression\TupleComparison;
22-
use Cake\Database\Query;
2320
use Cake\Database\SqlDialectTrait;
2421

2522
/**
@@ -28,6 +25,7 @@
2825
trait SqliteDialectTrait {
2926

3027
use SqlDialectTrait;
28+
use TumpleComparisonTranslatorTrait;
3129

3230
/**
3331
* String used to start a database identifier quoting to make it safe
@@ -97,54 +95,6 @@ protected function _transformFunctionExpression(FunctionExpression $expression)
9795
}
9896
}
9997

100-
/**
101-
* Receives a TupleExpression and changes it so that it conforms to this
102-
* SQL dialect.
103-
*
104-
* @param \Cake\Database\Expression\TupleComparison $expression
105-
* @param \Cake\Database\Query $query
106-
* @return void
107-
*/
108-
protected function _transformTupleComparison(TupleComparison $expression, $query) {
109-
$fields = $expression->getField();
110-
111-
if (!is_array($fields)) {
112-
return;
113-
}
114-
115-
$value = $expression->getValue();
116-
$op = $expression->type();
117-
$true = new QueryExpression('1');
118-
119-
if ($value instanceof Query) {
120-
$selected = array_values($value->clause('select'));
121-
foreach ($fields as $i => $field) {
122-
$value->andWhere([$field . " $op" => new IdentifierExpression($selected[$i])]);
123-
}
124-
$value->select($true, true);
125-
$expression->field($true);
126-
$expression->type('=');
127-
return;
128-
}
129-
130-
$surrogate = $query->connection()
131-
->newQuery()
132-
->select($true);
133-
134-
foreach ($value as $tuple) {
135-
$surrogate->orWhere(function($exp) use ($fields, $tuple) {
136-
foreach ($tuple as $i => $value) {
137-
$exp->add([$fields[$i] => $value]);
138-
}
139-
return $exp;
140-
});
141-
}
142-
143-
$expression->field($true);
144-
$expression->value($surrogate);
145-
$expression->type('=');
146-
}
147-
14898
/**
14999
* Transforms an insert query that is meant to insert multiple rows at a time,
150100
* otherwise it leaves the query untouched.

src/Database/Dialect/SqlserverDialectTrait.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515
namespace Cake\Database\Dialect;
1616

17+
use Cake\Database\Dialect\TupleComparisonTranslatorTrait;
1718
use Cake\Database\Expression\FunctionExpression;
1819
use Cake\Database\SqlDialectTrait;
1920

@@ -24,6 +25,7 @@
2425
trait SqlserverDialectTrait {
2526

2627
use SqlDialectTrait;
28+
use TupleComparisonTranslatorTrait;
2729

2830
/**
2931
* String used to start a database identifier quoting to make it safe
@@ -91,7 +93,8 @@ protected function _insertQueryTranslator($query) {
9193
protected function _expressionTranslators() {
9294
$namespace = 'Cake\Database\Expression';
9395
return [
94-
$namespace . '\FunctionExpression' => '_transformFunctionExpression'
96+
$namespace . '\FunctionExpression' => '_transformFunctionExpression',
97+
$namespace . '\TupleComparison' => '_transformTupleComparison'
9598
];
9699
}
97100

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
4+
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
5+
*
6+
* Licensed under The MIT License
7+
* For full copyright and license information, please see the LICENSE.txt
8+
* Redistributions of files must retain the above copyright notice.
9+
*
10+
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
11+
* @link http://cakephp.org CakePHP(tm) Project
12+
* @since 3.0.0
13+
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
14+
*/
15+
namespace Cake\Database\Dialect;
16+
17+
use Cake\Database\Expression\IdentifierExpression;
18+
use Cake\Database\Expression\QueryExpression;
19+
use Cake\Database\Expression\TupleComparison;
20+
use Cake\Database\Query;
21+
22+
/**
23+
* Provides a translator method for tuple comparisons
24+
*/
25+
trait TupleComparisonTranslatorTrait {
26+
27+
/**
28+
*
29+
* Receives a TupleExpression and changes it so that it conforms to this
30+
* SQL dialect.
31+
*
32+
* @param \Cake\Database\Expression\TupleComparison $expression
33+
* @param \Cake\Database\Query $query
34+
* @return void
35+
*/
36+
protected function _transformTupleComparison(TupleComparison $expression, $query) {
37+
$fields = $expression->getField();
38+
39+
if (!is_array($fields)) {
40+
return;
41+
}
42+
43+
$value = $expression->getValue();
44+
$op = $expression->type();
45+
$true = new QueryExpression('1');
46+
47+
if ($value instanceof Query) {
48+
$selected = array_values($value->clause('select'));
49+
foreach ($fields as $i => $field) {
50+
$value->andWhere([$field . " $op" => new IdentifierExpression($selected[$i])]);
51+
}
52+
$value->select($true, true);
53+
$expression->field($true);
54+
$expression->type('=');
55+
return;
56+
}
57+
58+
$surrogate = $query->connection()
59+
->newQuery()
60+
->select($true);
61+
62+
foreach ($value as $tuple) {
63+
$surrogate->orWhere(function($exp) use ($fields, $tuple) {
64+
foreach ($tuple as $i => $value) {
65+
$exp->add([$fields[$i] => $value]);
66+
}
67+
return $exp;
68+
});
69+
}
70+
71+
$expression->field($true);
72+
$expression->value($surrogate);
73+
$expression->type('=');
74+
}
75+
76+
}

0 commit comments

Comments
 (0)