web/lib/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php	Fri Mar 11 15:05:35 2011 +0100
@@ -0,0 +1,350 @@
+<?php
+/**
+ * Zend Framework
+ *
+ * LICENSE
+ *
+ * This source file is subject to the new BSD license that is bundled
+ * with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://framework.zend.com/license/new-bsd
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@zend.com so we can send you a copy immediately.
+ *
+ * @category   Zend
+ * @package    Zend_Service_WindowsAzure
+ * @subpackage Storage
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: TableEntityQuery.php 23167 2010-10-19 17:53:31Z mabe $
+ */
+
+/**
+ * @category   Zend
+ * @package    Zend_Service_WindowsAzure
+ * @subpackage Storage
+ * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ */
+class Zend_Service_WindowsAzure_Storage_TableEntityQuery
+{
+    /**
+     * From
+     * 
+     * @var string
+     */
+	protected $_from  = '';
+	
+	/**
+	 * Where
+	 * 
+	 * @var array
+	 */
+	protected $_where = array();
+	
+	/**
+	 * Order by
+	 * 
+	 * @var array
+	 */
+	protected $_orderBy = array();
+	
+	/**
+	 * Top
+	 * 
+	 * @var int
+	 */
+	protected $_top = null;
+	
+	/**
+	 * Partition key
+	 * 
+	 * @var string
+	 */
+	protected $_partitionKey = null;
+
+	/**
+	 * Row key
+	 * 
+	 * @var string
+	 */
+	protected $_rowKey = null;
+	
+	/**
+	 * Select clause
+	 * 
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function select()
+	{
+		return $this;
+	}
+	
+	/**
+	 * From clause
+	 * 
+	 * @param string $name Table name to select entities from
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function from($name)
+	{
+		$this->_from = $name;
+		return $this;
+	}
+	
+	/**
+	 * Specify partition key
+	 * 
+	 * @param string $value Partition key to query for
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function wherePartitionKey($value = null)
+	{
+	    $this->_partitionKey = $value;
+	    return $this;
+	}
+	
+	/**
+	 * Specify row key
+	 * 
+	 * @param string $value Row key to query for
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function whereRowKey($value = null)
+	{
+	    $this->_rowKey = $value;
+	    return $this;
+	}
+	
+	/**
+	 * Add where clause
+	 * 
+	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
+	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
+	 * @param string       $cond        Condition for the clause (and/or/not)
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function where($condition, $value = null, $cond = '')
+	{
+	    $condition = $this->_replaceOperators($condition);
+	    
+	    if ($value !== null) {
+	        $condition = $this->_quoteInto($condition, $value);
+	    }
+	    
+		if (count($this->_where) == 0) {
+			$cond = '';
+		} else if ($cond !== '') {
+			$cond = ' ' . strtolower(trim($cond)) . ' ';
+		}
+		
+		$this->_where[] = $cond . $condition;
+		return $this;
+	}
+
+	/**
+	 * Add where clause with AND condition
+	 * 
+	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
+	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function andWhere($condition, $value = null)
+	{
+		return $this->where($condition, $value, 'and');
+	}
+	
+	/**
+	 * Add where clause with OR condition
+	 * 
+	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
+	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function orWhere($condition, $value = null)
+	{
+		return $this->where($condition, $value, 'or');
+	}
+	
+	/**
+	 * OrderBy clause
+	 * 
+	 * @param string $column    Column to sort by
+	 * @param string $direction Direction to sort (asc/desc)
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+	public function orderBy($column, $direction = 'asc')
+	{
+		$this->_orderBy[] = $column . ' ' . $direction;
+		return $this;
+	}
+    
+	/**
+	 * Top clause
+	 * 
+	 * @param int $top  Top to fetch
+	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
+	 */
+    public function top($top = null)
+    {
+        $this->_top  = (int)$top;
+        return $this;
+    }
+	
+    /**
+     * Assembles the query string
+     * 
+     * @param boolean $urlEncode Apply URL encoding to the query string
+     * @return string
+     */
+	public function assembleQueryString($urlEncode = false)
+	{
+		$query = array();
+		if (count($this->_where) != 0) {
+		    $filter = implode('', $this->_where);
+			$query[] = '$filter=' . ($urlEncode ? self::encodeQuery($filter) : $filter);
+		}
+		
+		if (count($this->_orderBy) != 0) {
+		    $orderBy = implode(',', $this->_orderBy);
+			$query[] = '$orderby=' . ($urlEncode ? self::encodeQuery($orderBy) : $orderBy);
+		}
+		
+		if ($this->_top !== null) {
+			$query[] = '$top=' . $this->_top;
+		}
+		
+		if (count($query) != 0) {
+			return '?' . implode('&', $query);
+		}
+		
+		return '';
+	}
+	
+	/**
+	 * Assemble from
+	 * 
+	 * @param boolean $includeParentheses Include parentheses? ()
+	 * @return string
+	 */
+	public function assembleFrom($includeParentheses = true)
+	{
+	    $identifier = '';
+	    if ($includeParentheses) {
+	        $identifier .= '(';
+	        
+	        if ($this->_partitionKey !== null) {
+	            $identifier .= 'PartitionKey=\'' . $this->_partitionKey . '\'';
+	        }
+	            
+	        if ($this->_partitionKey !== null && $this->_rowKey !== null) {
+	            $identifier .= ', ';
+	        }
+	            
+	        if ($this->_rowKey !== null) {
+	            $identifier .= 'RowKey=\'' . $this->_rowKey . '\'';
+	        }
+	            
+	        $identifier .= ')';
+	    }
+		return $this->_from . $identifier;
+	}
+	
+	/**
+	 * Assemble full query
+	 * 
+	 * @return string
+	 */
+	public function assembleQuery()
+	{
+		$assembledQuery = $this->assembleFrom();
+		
+		$queryString = $this->assembleQueryString();
+		if ($queryString !== '') {
+			$assembledQuery .= $queryString;
+		}
+		
+		return $assembledQuery;
+	}
+	
+	/**
+	 * Quotes a variable into a condition
+	 * 
+	 * @param string       $text   Condition, can contain question mark(s) (?) for parameter insertion.
+	 * @param string|array $value  Value(s) to insert in question mark (?) parameters.
+	 * @return string
+	 */
+	protected function _quoteInto($text, $value = null)
+	{
+		if (!is_array($value)) {
+	        $text = str_replace('?', '\'' . addslashes($value) . '\'', $text);
+	    } else {
+	        $i = 0;
+	        while(strpos($text, '?') !== false) {
+	            if (is_numeric($value[$i])) {
+	                $text = substr_replace($text, $value[$i++], strpos($text, '?'), 1);
+	            } else {
+	                $text = substr_replace($text, '\'' . addslashes($value[$i++]) . '\'', strpos($text, '?'), 1);
+	            }
+	        }
+	    }
+	    return $text;
+	}
+	
+	/**
+	 * Replace operators
+	 * 
+	 * @param string $text
+	 * @return string
+	 */
+	protected function _replaceOperators($text)
+	{
+	    $text = str_replace('==', 'eq',  $text);
+	    $text = str_replace('>',  'gt',  $text);
+	    $text = str_replace('<',  'lt',  $text);
+	    $text = str_replace('>=', 'ge',  $text);
+	    $text = str_replace('<=', 'le',  $text);
+	    $text = str_replace('!=', 'ne',  $text);
+	    
+	    $text = str_replace('&&', 'and', $text);
+	    $text = str_replace('||', 'or',  $text);
+	    $text = str_replace('!',  'not', $text);
+	    
+	    return $text;
+	}
+	
+	/**
+	 * urlencode a query
+	 * 
+	 * @param string $query Query to encode
+	 * @return string Encoded query
+	 */
+	public static function encodeQuery($query)
+	{
+		$query = str_replace('/', '%2F', $query);
+		$query = str_replace('?', '%3F', $query);
+		$query = str_replace(':', '%3A', $query);
+		$query = str_replace('@', '%40', $query);
+		$query = str_replace('&', '%26', $query);
+		$query = str_replace('=', '%3D', $query);
+		$query = str_replace('+', '%2B', $query);
+		$query = str_replace(',', '%2C', $query);
+		$query = str_replace('$', '%24', $query);
+		
+		
+		$query = str_replace(' ', '%20', $query);
+		
+		return $query;
+	}
+	
+	/**
+	 * __toString overload
+	 * 
+	 * @return string
+	 */
+	public function __toString()
+	{
+		return $this->assembleQuery();
+	}
+}
\ No newline at end of file