diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Cloud/DocumentService/Adapter/SimpleDb/Query.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Cloud/DocumentService/Adapter/SimpleDb/Query.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,175 @@ +_adapter = $adapter; + if (null !== $collectionName) { + $this->from($collectionName); + } + } + + /** + * Get adapter + * + * @return Zend_Cloud_DocumentService_Adapter_SimpleDb + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Assemble the query into a format the adapter can utilize + * + * @var string $collectionName Name of collection from which to select + * @return string + */ + public function assemble($collectionName = null) + { + $adapter = $this->getAdapter()->getClient(); + $select = null; + $from = null; + $where = null; + $order = null; + $limit = null; + foreach ($this->getClauses() as $clause) { + list($name, $args) = $clause; + + switch ($name) { + case self::QUERY_SELECT: + $select = $args[0]; + break; + case self::QUERY_FROM: + if (null === $from) { + // Only allow setting FROM clause once + $from = $adapter->quoteName($args); + } + break; + case self::QUERY_WHERE: + $statement = $this->_parseWhere($args[0], $args[1]); + if (null === $where) { + $where = $statement; + } else { + $operator = empty($args[2]) ? 'AND' : $args[2]; + $where .= ' ' . $operator . ' ' . $statement; + } + break; + case self::QUERY_WHEREID: + $statement = $this->_parseWhere('ItemName() = ?', array($args)); + if (null === $where) { + $where = $statement; + } else { + $operator = empty($args[2]) ? 'AND' : $args[2]; + $where .= ' ' . $operator . ' ' . $statement; + } + break; + case self::QUERY_ORDER: + $order = $adapter->quoteName($args[0]); + if (isset($args[1])) { + $order .= ' ' . $args[1]; + } + break; + case self::QUERY_LIMIT: + $limit = $args; + break; + default: + // Ignore unknown clauses + break; + } + } + + if (empty($select)) { + $select = "*"; + } + if (empty($from)) { + if (null === $collectionName) { + require_once 'Zend/Cloud/DocumentService/Exception.php'; + throw new Zend_Cloud_DocumentService_Exception("Query requires a FROM clause"); + } + $from = $adapter->quoteName($collectionName); + } + $query = "select $select from $from"; + if (!empty($where)) { + $query .= " where $where"; + } + if (!empty($order)) { + $query .= " order by $order"; + } + if (!empty($limit)) { + $query .= " limit $limit"; + } + return $query; + } + + /** + * Parse a where statement into service-specific language + * + * @todo Ensure this fulfills the entire SimpleDB query specification for WHERE + * @param string $where + * @param array $args + * @return string + */ + protected function _parseWhere($where, $args) + { + if (!is_array($args)) { + $args = (array) $args; + } + $adapter = $this->getAdapter()->getClient(); + $i = 0; + while (false !== ($pos = strpos($where, '?'))) { + $where = substr_replace($where, $adapter->quote($args[$i]), $pos); + ++$i; + } + if (('(' != $where[0]) || (')' != $where[strlen($where) - 1])) { + $where = '(' . $where . ')'; + } + return $where; + } + }