<?php
/**
* 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_Cloud
* @subpackage DocumentService
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/*
* @see Zend_Cloud_DocumentService_QueryAdapter
*/
require_once 'Zend/Cloud/DocumentService/QueryAdapter.php';
/**
* Class implementing Query adapter for working with Azure queries in a
* structured way
*
* @todo Look into preventing a query injection attack.
* @category Zend
* @package Zend_Cloud
* @subpackage DocumentService
* @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
implements Zend_Cloud_DocumentService_QueryAdapter
{
/**
* Azure concrete query
*
* @var Zend_Service_WindowsAzure_Storage_TableEntityQuery
*/
protected $_azureSelect;
/**
* Constructor
*
* @param null|Zend_Service_WindowsAzure_Storage_TableEntityQuery $select Table select object
* @return void
*/
public function __construct($select = null)
{
if (!$select instanceof Zend_Service_WindowsAzure_Storage_TableEntityQuery) {
require_once 'Zend/Service/WindowsAzure/Storage/TableEntityQuery.php';
$select = new Zend_Service_WindowsAzure_Storage_TableEntityQuery();
}
$this->_azureSelect = $select;
}
/**
* SELECT clause (fields to be selected)
*
* Does nothing for Azure.
*
* @param string $select
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
*/
public function select($select)
{
return $this;
}
/**
* FROM clause (table name)
*
* @param string $from
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
*/
public function from($from)
{
$this->_azureSelect->from($from);
return $this;
}
/**
* WHERE clause (conditions to be used)
*
* @param string $where
* @param mixed $value Value or array of values to be inserted instead of ?
* @param string $op Operation to use to join where clauses (AND/OR)
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
*/
public function where($where, $value = null, $op = 'and')
{
if (!empty($value) && !is_array($value)) {
// fix buglet in Azure - numeric values are quoted unless passed as an array
$value = array($value);
}
$this->_azureSelect->where($where, $value, $op);
return $this;
}
/**
* WHERE clause for item ID
*
* This one should be used when fetching specific rows since some adapters
* have special syntax for primary keys
*
* @param array $value Row ID for the document (PartitionKey, RowKey)
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
*/
public function whereId($value)
{
if (!is_array($value)) {
require_once 'Zend/Cloud/DocumentService/Exception.php';
throw new Zend_Cloud_DocumentService_Exception('Invalid document key');
}
$this->_azureSelect->wherePartitionKey($value[0])->whereRowKey($value[1]);
return $this;
}
/**
* LIMIT clause (how many rows to return)
*
* @param int $limit
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
*/
public function limit($limit)
{
$this->_azureSelect->top($limit);
return $this;
}
/**
* ORDER BY clause (sorting)
*
* @todo Azure service doesn't seem to support this yet; emulate?
* @param string $sort Column to sort by
* @param string $direction Direction - asc/desc
* @return Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
* @throws Zend_Cloud_OperationNotAvailableException
*/
public function order($sort, $direction = 'asc')
{
require_once 'Zend/Cloud/OperationNotAvailableException.php';
throw new Zend_Cloud_OperationNotAvailableException('No support for sorting for Azure yet');
}
/**
* Get Azure select query
*
* @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
*/
public function getAzureSelect()
{
return $this->_azureSelect;
}
/**
* Assemble query
*
* Simply return the WindowsAzure table entity query object
*
* @return Zend_Service_WindowsAzure_Storage_TableEntityQuery
*/
public function assemble()
{
return $this->getAzureSelect();
}
}