diff --git a/Cake/Database/FunctionsTrait.php b/Cake/Database/FunctionsBuilder.php similarity index 98% rename from Cake/Database/FunctionsTrait.php rename to Cake/Database/FunctionsBuilder.php index 8191cd1c7ef..429755a1093 100644 --- a/Cake/Database/FunctionsTrait.php +++ b/Cake/Database/FunctionsBuilder.php @@ -21,9 +21,9 @@ /** * Contains methods related to generating FunctionExpression objects * with most commonly used SQL functions. - * This trait is just a factory for FunctionExpression objects. + * This acts as a factory for FunctionExpression objects. */ -trait FunctionsTrait { +class FunctionsBuilder { /** * Returns a new instance of a FunctionExpression. This is used for generating diff --git a/Cake/Database/Query.php b/Cake/Database/Query.php index 6f533107ca2..521f7342dac 100644 --- a/Cake/Database/Query.php +++ b/Cake/Database/Query.php @@ -35,8 +35,6 @@ */ class Query implements ExpressionInterface, IteratorAggregate { - use FunctionsTrait; - /** * Connection instance to be used to execute this query * @@ -148,6 +146,13 @@ class Query implements ExpressionInterface, IteratorAggregate { */ protected $_valueBinder; +/** + * Instance of functions builder object used for generating arbitrary SQL functions + * + * @var FunctionsBuilder + */ + protected $_functionsBuilder; + /** * Constructor * @@ -1372,16 +1377,23 @@ public function newExpr() { } /** - * Returns a new instance of a FunctionExpression. This is used for generating - * arbitrary function calls in the final SQL string. + * Returns an instance of a functions builder object that can be used for + * generating arbitrary SQL functions. * - * @param string $name the name of the SQL function to constructed - * @param array $params list of params to be passed to the function - * @param array $types list of types for each function param - * @return FunctionExpression + * ### Example: + * + * {{{ + * $query->func()->count('*'); + * $query->func()->dateDiff(['2012-01-05', '2012-01-02']) + * }}} + * + * @return FunctionsBuilder */ - public function func($name, $params = [], $types = []) { - return new FunctionExpression($name, $params, $types); + public function func() { + if (empty($this->_functionsBuilder)) { + $this->_functionsBuilder = new FunctionsBuilder; + } + return $this->_functionsBuilder; } /** diff --git a/Cake/Test/TestCase/Database/FunctionsTraitTest.php b/Cake/Test/TestCase/Database/FunctionsBuilderTest.php similarity index 94% rename from Cake/Test/TestCase/Database/FunctionsTraitTest.php rename to Cake/Test/TestCase/Database/FunctionsBuilderTest.php index 144ec690457..928ee7f65e4 100644 --- a/Cake/Test/TestCase/Database/FunctionsTraitTest.php +++ b/Cake/Test/TestCase/Database/FunctionsBuilderTest.php @@ -16,25 +16,23 @@ */ namespace Cake\Test\TestCase\Database; -use Cake\Database\FunctionsTrait; +use Cake\Database\FunctionsBuilder; use Cake\Database\ValueBinder; /** - * Tests FunctionsTrait class + * Tests FunctionsBuilder class * **/ -class FunctionsTraitTest extends \Cake\TestSuite\TestCase { +class FunctionsBuilderTest extends \Cake\TestSuite\TestCase { /** - * Setups a mock for FunctionsTrait + * Setups a mock for FunctionsBuilder * * @return void */ public function setUp() { parent::setUp(); - $this->functions = $this->getObjectForTrait( - '\Cake\Database\FunctionsTrait' - ); + $this->functions = new FunctionsBuilder; } /** diff --git a/Cake/Test/TestCase/Database/QueryTest.php b/Cake/Test/TestCase/Database/QueryTest.php index 53ef0b87e51..aa8255a5ac8 100644 --- a/Cake/Test/TestCase/Database/QueryTest.php +++ b/Cake/Test/TestCase/Database/QueryTest.php @@ -1850,7 +1850,7 @@ public function testSQLFunctions() { $query = new Query($this->connection); $result = $query->select( function($q) { - return ['total' => $q->count('*')]; + return ['total' => $q->func()->count('*')]; } ) ->from('articles') @@ -1859,7 +1859,9 @@ function($q) { $this->assertEquals($expected, $result->fetchAll('assoc')); $query = new Query($this->connection); - $result = $query->select(['c' => $query->concat(['title' => 'literal', ' is appended'])]) + $result = $query->select([ + 'c' => $query->func()->concat(['title' => 'literal', ' is appended']) + ]) ->from('articles') ->order(['c' => 'ASC']) ->execute(); @@ -1872,19 +1874,19 @@ function($q) { $query = new Query($this->connection); $result = $query - ->select(['d' => $query->dateDiff(['2012-01-05', '2012-01-02'])]) + ->select(['d' => $query->func()->dateDiff(['2012-01-05', '2012-01-02'])]) ->execute(); $this->assertEquals([['d' => '3.0']], $result->fetchAll('assoc')); $query = new Query($this->connection); $result = $query - ->select(['d' => $query->now('date')]) + ->select(['d' => $query->func()->now('date')]) ->execute(); $this->assertEquals([['d' => date('Y-m-d')]], $result->fetchAll('assoc')); $query = new Query($this->connection); $result = $query - ->select(['d' => $query->now('time')]) + ->select(['d' => $query->func()->now('time')]) ->execute(); $this->assertWithinMargin( date('U'), @@ -1894,7 +1896,7 @@ function($q) { $query = new Query($this->connection); $result = $query - ->select(['d' => $query->now()]) + ->select(['d' => $query->func()->now()]) ->execute(); $this->assertWithinMargin( date('U'),