web/lib/Zend/Service/WindowsAzure/Storage/TableEntityQuery.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 /**
       
     3  * Zend Framework
       
     4  *
       
     5  * LICENSE
       
     6  *
       
     7  * This source file is subject to the new BSD license that is bundled
       
     8  * with this package in the file LICENSE.txt.
       
     9  * It is also available through the world-wide-web at this URL:
       
    10  * http://framework.zend.com/license/new-bsd
       
    11  * If you did not receive a copy of the license and are unable to
       
    12  * obtain it through the world-wide-web, please send an email
       
    13  * to license@zend.com so we can send you a copy immediately.
       
    14  *
       
    15  * @category   Zend
       
    16  * @package    Zend_Service_WindowsAzure
       
    17  * @subpackage Storage
       
    18  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    20  * @version    $Id: TableEntityQuery.php 23167 2010-10-19 17:53:31Z mabe $
       
    21  */
       
    22 
       
    23 /**
       
    24  * @category   Zend
       
    25  * @package    Zend_Service_WindowsAzure
       
    26  * @subpackage Storage
       
    27  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    28  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    29  */
       
    30 class Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
    31 {
       
    32     /**
       
    33      * From
       
    34      * 
       
    35      * @var string
       
    36      */
       
    37 	protected $_from  = '';
       
    38 	
       
    39 	/**
       
    40 	 * Where
       
    41 	 * 
       
    42 	 * @var array
       
    43 	 */
       
    44 	protected $_where = array();
       
    45 	
       
    46 	/**
       
    47 	 * Order by
       
    48 	 * 
       
    49 	 * @var array
       
    50 	 */
       
    51 	protected $_orderBy = array();
       
    52 	
       
    53 	/**
       
    54 	 * Top
       
    55 	 * 
       
    56 	 * @var int
       
    57 	 */
       
    58 	protected $_top = null;
       
    59 	
       
    60 	/**
       
    61 	 * Partition key
       
    62 	 * 
       
    63 	 * @var string
       
    64 	 */
       
    65 	protected $_partitionKey = null;
       
    66 
       
    67 	/**
       
    68 	 * Row key
       
    69 	 * 
       
    70 	 * @var string
       
    71 	 */
       
    72 	protected $_rowKey = null;
       
    73 	
       
    74 	/**
       
    75 	 * Select clause
       
    76 	 * 
       
    77 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
    78 	 */
       
    79 	public function select()
       
    80 	{
       
    81 		return $this;
       
    82 	}
       
    83 	
       
    84 	/**
       
    85 	 * From clause
       
    86 	 * 
       
    87 	 * @param string $name Table name to select entities from
       
    88 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
    89 	 */
       
    90 	public function from($name)
       
    91 	{
       
    92 		$this->_from = $name;
       
    93 		return $this;
       
    94 	}
       
    95 	
       
    96 	/**
       
    97 	 * Specify partition key
       
    98 	 * 
       
    99 	 * @param string $value Partition key to query for
       
   100 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   101 	 */
       
   102 	public function wherePartitionKey($value = null)
       
   103 	{
       
   104 	    $this->_partitionKey = $value;
       
   105 	    return $this;
       
   106 	}
       
   107 	
       
   108 	/**
       
   109 	 * Specify row key
       
   110 	 * 
       
   111 	 * @param string $value Row key to query for
       
   112 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   113 	 */
       
   114 	public function whereRowKey($value = null)
       
   115 	{
       
   116 	    $this->_rowKey = $value;
       
   117 	    return $this;
       
   118 	}
       
   119 	
       
   120 	/**
       
   121 	 * Add where clause
       
   122 	 * 
       
   123 	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
       
   124 	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
       
   125 	 * @param string       $cond        Condition for the clause (and/or/not)
       
   126 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   127 	 */
       
   128 	public function where($condition, $value = null, $cond = '')
       
   129 	{
       
   130 	    $condition = $this->_replaceOperators($condition);
       
   131 	    
       
   132 	    if ($value !== null) {
       
   133 	        $condition = $this->_quoteInto($condition, $value);
       
   134 	    }
       
   135 	    
       
   136 		if (count($this->_where) == 0) {
       
   137 			$cond = '';
       
   138 		} else if ($cond !== '') {
       
   139 			$cond = ' ' . strtolower(trim($cond)) . ' ';
       
   140 		}
       
   141 		
       
   142 		$this->_where[] = $cond . $condition;
       
   143 		return $this;
       
   144 	}
       
   145 
       
   146 	/**
       
   147 	 * Add where clause with AND condition
       
   148 	 * 
       
   149 	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
       
   150 	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
       
   151 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   152 	 */
       
   153 	public function andWhere($condition, $value = null)
       
   154 	{
       
   155 		return $this->where($condition, $value, 'and');
       
   156 	}
       
   157 	
       
   158 	/**
       
   159 	 * Add where clause with OR condition
       
   160 	 * 
       
   161 	 * @param string       $condition   Condition, can contain question mark(s) (?) for parameter insertion.
       
   162 	 * @param string|array $value       Value(s) to insert in question mark (?) parameters.
       
   163 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   164 	 */
       
   165 	public function orWhere($condition, $value = null)
       
   166 	{
       
   167 		return $this->where($condition, $value, 'or');
       
   168 	}
       
   169 	
       
   170 	/**
       
   171 	 * OrderBy clause
       
   172 	 * 
       
   173 	 * @param string $column    Column to sort by
       
   174 	 * @param string $direction Direction to sort (asc/desc)
       
   175 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   176 	 */
       
   177 	public function orderBy($column, $direction = 'asc')
       
   178 	{
       
   179 		$this->_orderBy[] = $column . ' ' . $direction;
       
   180 		return $this;
       
   181 	}
       
   182     
       
   183 	/**
       
   184 	 * Top clause
       
   185 	 * 
       
   186 	 * @param int $top  Top to fetch
       
   187 	 * @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
       
   188 	 */
       
   189     public function top($top = null)
       
   190     {
       
   191         $this->_top  = (int)$top;
       
   192         return $this;
       
   193     }
       
   194 	
       
   195     /**
       
   196      * Assembles the query string
       
   197      * 
       
   198      * @param boolean $urlEncode Apply URL encoding to the query string
       
   199      * @return string
       
   200      */
       
   201 	public function assembleQueryString($urlEncode = false)
       
   202 	{
       
   203 		$query = array();
       
   204 		if (count($this->_where) != 0) {
       
   205 		    $filter = implode('', $this->_where);
       
   206 			$query[] = '$filter=' . ($urlEncode ? self::encodeQuery($filter) : $filter);
       
   207 		}
       
   208 		
       
   209 		if (count($this->_orderBy) != 0) {
       
   210 		    $orderBy = implode(',', $this->_orderBy);
       
   211 			$query[] = '$orderby=' . ($urlEncode ? self::encodeQuery($orderBy) : $orderBy);
       
   212 		}
       
   213 		
       
   214 		if ($this->_top !== null) {
       
   215 			$query[] = '$top=' . $this->_top;
       
   216 		}
       
   217 		
       
   218 		if (count($query) != 0) {
       
   219 			return '?' . implode('&', $query);
       
   220 		}
       
   221 		
       
   222 		return '';
       
   223 	}
       
   224 	
       
   225 	/**
       
   226 	 * Assemble from
       
   227 	 * 
       
   228 	 * @param boolean $includeParentheses Include parentheses? ()
       
   229 	 * @return string
       
   230 	 */
       
   231 	public function assembleFrom($includeParentheses = true)
       
   232 	{
       
   233 	    $identifier = '';
       
   234 	    if ($includeParentheses) {
       
   235 	        $identifier .= '(';
       
   236 	        
       
   237 	        if ($this->_partitionKey !== null) {
       
   238 	            $identifier .= 'PartitionKey=\'' . $this->_partitionKey . '\'';
       
   239 	        }
       
   240 	            
       
   241 	        if ($this->_partitionKey !== null && $this->_rowKey !== null) {
       
   242 	            $identifier .= ', ';
       
   243 	        }
       
   244 	            
       
   245 	        if ($this->_rowKey !== null) {
       
   246 	            $identifier .= 'RowKey=\'' . $this->_rowKey . '\'';
       
   247 	        }
       
   248 	            
       
   249 	        $identifier .= ')';
       
   250 	    }
       
   251 		return $this->_from . $identifier;
       
   252 	}
       
   253 	
       
   254 	/**
       
   255 	 * Assemble full query
       
   256 	 * 
       
   257 	 * @return string
       
   258 	 */
       
   259 	public function assembleQuery()
       
   260 	{
       
   261 		$assembledQuery = $this->assembleFrom();
       
   262 		
       
   263 		$queryString = $this->assembleQueryString();
       
   264 		if ($queryString !== '') {
       
   265 			$assembledQuery .= $queryString;
       
   266 		}
       
   267 		
       
   268 		return $assembledQuery;
       
   269 	}
       
   270 	
       
   271 	/**
       
   272 	 * Quotes a variable into a condition
       
   273 	 * 
       
   274 	 * @param string       $text   Condition, can contain question mark(s) (?) for parameter insertion.
       
   275 	 * @param string|array $value  Value(s) to insert in question mark (?) parameters.
       
   276 	 * @return string
       
   277 	 */
       
   278 	protected function _quoteInto($text, $value = null)
       
   279 	{
       
   280 		if (!is_array($value)) {
       
   281 	        $text = str_replace('?', '\'' . addslashes($value) . '\'', $text);
       
   282 	    } else {
       
   283 	        $i = 0;
       
   284 	        while(strpos($text, '?') !== false) {
       
   285 	            if (is_numeric($value[$i])) {
       
   286 	                $text = substr_replace($text, $value[$i++], strpos($text, '?'), 1);
       
   287 	            } else {
       
   288 	                $text = substr_replace($text, '\'' . addslashes($value[$i++]) . '\'', strpos($text, '?'), 1);
       
   289 	            }
       
   290 	        }
       
   291 	    }
       
   292 	    return $text;
       
   293 	}
       
   294 	
       
   295 	/**
       
   296 	 * Replace operators
       
   297 	 * 
       
   298 	 * @param string $text
       
   299 	 * @return string
       
   300 	 */
       
   301 	protected function _replaceOperators($text)
       
   302 	{
       
   303 	    $text = str_replace('==', 'eq',  $text);
       
   304 	    $text = str_replace('>',  'gt',  $text);
       
   305 	    $text = str_replace('<',  'lt',  $text);
       
   306 	    $text = str_replace('>=', 'ge',  $text);
       
   307 	    $text = str_replace('<=', 'le',  $text);
       
   308 	    $text = str_replace('!=', 'ne',  $text);
       
   309 	    
       
   310 	    $text = str_replace('&&', 'and', $text);
       
   311 	    $text = str_replace('||', 'or',  $text);
       
   312 	    $text = str_replace('!',  'not', $text);
       
   313 	    
       
   314 	    return $text;
       
   315 	}
       
   316 	
       
   317 	/**
       
   318 	 * urlencode a query
       
   319 	 * 
       
   320 	 * @param string $query Query to encode
       
   321 	 * @return string Encoded query
       
   322 	 */
       
   323 	public static function encodeQuery($query)
       
   324 	{
       
   325 		$query = str_replace('/', '%2F', $query);
       
   326 		$query = str_replace('?', '%3F', $query);
       
   327 		$query = str_replace(':', '%3A', $query);
       
   328 		$query = str_replace('@', '%40', $query);
       
   329 		$query = str_replace('&', '%26', $query);
       
   330 		$query = str_replace('=', '%3D', $query);
       
   331 		$query = str_replace('+', '%2B', $query);
       
   332 		$query = str_replace(',', '%2C', $query);
       
   333 		$query = str_replace('$', '%24', $query);
       
   334 		
       
   335 		
       
   336 		$query = str_replace(' ', '%20', $query);
       
   337 		
       
   338 		return $query;
       
   339 	}
       
   340 	
       
   341 	/**
       
   342 	 * __toString overload
       
   343 	 * 
       
   344 	 * @return string
       
   345 	 */
       
   346 	public function __toString()
       
   347 	{
       
   348 		return $this->assembleQuery();
       
   349 	}
       
   350 }