Skip to content

Commit

Permalink
Initial code for a BETWEEN SQL expression object
Browse files Browse the repository at this point in the history
  • Loading branch information
lorenzo committed Oct 26, 2014
1 parent 0cb1799 commit 76cc182
Showing 1 changed file with 114 additions and 0 deletions.
114 changes: 114 additions & 0 deletions src/Database/Expression/BetweenExpression.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Database\Expression;

use Cake\Database\ExpressionInterface;
use Cake\Database\ValueBinder;

/**
* An expression object that represents a SQL BETWEEN snippet
*
* @internal
*/
class BetweenExpression implements ExpressionInterface {

/**
* The first value in the expression
*
* @var mixed
*/
protected $_field;

/**
* The first value in the expression
*
* @var mixed
*/
protected $_from;

/**
* The second value in the expression
*
* @var mixed
*/
protected $_to;

/**
* Constructor
*
* @param mixed $value the value to use as the operand for the expression
* @param int $mode either UnaryExpression::PREFIX or UnaryExpression::POSTFIX
*/
public function __construct($field, $from, $to, $type = null) {
$this->_field = $field;
$this->_from = $from;
$this->_to = $to;
$this->$type = $type;
}

/**
* Converts the expression to its string representation
*
* @param \Cake\Database\ValueBinder $generator Placeholder generator object
* @return string
*/
public function sql(ValueBinder $generator) {
$parts = [
'from' => $this->_from,
'to' => $this->_to
];

$field = $this->_field;
if ($field instanceof ExpressionInterface) {
$field = $field->sql($generator);
}

foreach ($parts as $name => $part) {
if ($field instanceof ExpressionInterface) {
$parts[$name] = $part->sql($generator);
continue;
}
$parts[$name] = $this->_bindValue($part, $generator, $this->_type);
}

return sprintf('%s BETWEEN %s AND %s', $field, $parts['from'], $parts['to']);
}

/**
* {@inheritDoc}
*
*/
public function traverse(callable $callable) {
foreach ([$this->_field, $this->_from, $this->_to] as $part) {
if ($part instanceof ExpressionInterface) {
$callable($this->_value);
}
}
}

/**
* Registers a value in the placeholder generator and returns the generated placeholder
*
* @param mixed $value The value to bind
* @param \Cake\Database\ValueBinder $generator The value binder to use
* @param string $type The type of $value
* @return string generated placeholder
*/
protected function _bindValue($value, $generator, $type) {
$placeholder = $generator->placeholder('c');
$generator->bind($placeholder, $value, $type);
return $placeholder;
}
}

0 comments on commit 76cc182

Please sign in to comment.