Browse Source

Initial code for a BETWEEN SQL expression object

Jose Lorenzo Rodriguez 11 years ago
parent
commit
76cc182886
1 changed files with 114 additions and 0 deletions
  1. 114 0
      src/Database/Expression/BetweenExpression.php

+ 114 - 0
src/Database/Expression/BetweenExpression.php

@@ -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;
+	}
+}