From 923cf27f65126fd1422b7c0d6da92a111bd4d221 Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Sat, 11 Jan 2014 16:44:10 +0100 Subject: [PATCH] Starting to implement a TupleComparison expression class, this will be used for eager loading associations with composite foreignKeys --- Cake/Database/Expression/Comparison.php | 9 +-- Cake/Database/Expression/TupleComparison.php | 59 +++++++++++++++++++ .../Expression/IdentifierExpressionTest.php | 1 - .../Expression/TupleComparisonTest.php | 42 +++++++++++++ 4 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 Cake/Database/Expression/TupleComparison.php create mode 100644 Test/TestCase/Database/Expression/TupleComparisonTest.php diff --git a/Cake/Database/Expression/Comparison.php b/Cake/Database/Expression/Comparison.php index 22379d98861..d2fa7c9e846 100644 --- a/Cake/Database/Expression/Comparison.php +++ b/Cake/Database/Expression/Comparison.php @@ -1,7 +1,5 @@ _field = $field; - $this->_value = $value; + $this->field($field); + $this->value($value); $this->type($conjuntion); if (is_string($type)) { $this->_type = $type; } + if (is_string($field) && isset($types[$this->_field])) { $this->_type = current($types); } - - $this->_conditions[$field] = $value; } /** diff --git a/Cake/Database/Expression/TupleComparison.php b/Cake/Database/Expression/TupleComparison.php new file mode 100644 index 00000000000..55f0dd2b8f7 --- /dev/null +++ b/Cake/Database/Expression/TupleComparison.php @@ -0,0 +1,59 @@ +_type = (array)$type; + } + +/** + * Convert the expression into a SQL fragment. + * + * @param Cake\Database\ValueBinder $generator Placeholder generator object + * @return string + */ + public function sql(ValueBinder $generator) { + $template = '(%s) %s (%s)'; + $values = []; + foreach ($this->getValue() as $i => $value) { + $values[] = $this->_bindValue( + $generator, + $value, + isset($this->_type[$i]) ? $this->_type[$i] : null + ); + } + $field = implode(', ', (array)$this->getField()); + return sprintf($template, $field, $this->_conjunction, implode(', ', $values)); + } + +} diff --git a/Test/TestCase/Database/Expression/IdentifierExpressionTest.php b/Test/TestCase/Database/Expression/IdentifierExpressionTest.php index ef3f1b5b374..d6f9e6153ff 100644 --- a/Test/TestCase/Database/Expression/IdentifierExpressionTest.php +++ b/Test/TestCase/Database/Expression/IdentifierExpressionTest.php @@ -1,6 +1,5 @@ assertEquals('(field1, field2) = (:c0, :c1)', $f->sql($binder)); + $this->assertSame(1, $binder->bindings()[':c0']['value']); + $this->assertSame(2, $binder->bindings()[':c1']['value']); + $this->assertSame('integer', $binder->bindings()[':c0']['type']); + $this->assertSame('integer', $binder->bindings()[':c1']['type']); + } + +}