示例#1
0
 /**
  * @covers WindowsAzure\Table\Models\Filters\Filter::applyNot
  * @covers WindowsAzure\Table\Models\Filters\Filter::applyConstant
  */
 public function testApplyNot()
 {
     // Setup
     $operand = Filter::applyConstant('test', EdmType::STRING);
     // Test
     $actual = Filter::applyNot($operand);
     // Assert
     $this->assertEquals($operand, $actual->getOperand());
 }
示例#2
0
 /**
  * @covers WindowsAzure\Table\Models\Query::setFilter
  * @covers WindowsAzure\Table\Models\Query::getFilter
  */
 public function testSetFilter()
 {
     // Setup
     $query = new Query();
     $expected = Filter::applyConstant('constValue', EdmType::STRING);
     // Test
     $query->setFilter($expected);
     // Assert
     $this->assertEquals($expected, $query->getFilter());
 }
 private static function cloneRemoveEqNotInTopLevelWorker($filter, $depth)
 {
     if ($filter instanceof PropertyNameFilter) {
         $ret = new PropertyNameFilter($filter->getPropertyName());
         return $ret;
     } else {
         if ($filter instanceof ConstantFilter) {
             $ret = new ConstantFilter($filter->getEdmType(), $filter->getValue());
             return $ret;
         } else {
             if ($filter instanceof UnaryFilter) {
                 $operand = self::cloneRemoveEqNotInTopLevelWorker($filter->getOperand(), $depth + 1);
                 $ret = new UnaryFilter($filter->getOperator(), $operand);
                 return $ret;
             } else {
                 if ($filter instanceof BinaryFilter) {
                     if ($filter->getOperator() == 'eq' && $depth != 0) {
                         return Filter::applyConstant(false);
                     }
                     $left = self::cloneRemoveEqNotInTopLevelWorker($filter->getLeft(), $depth + 1);
                     $right = self::cloneRemoveEqNotInTopLevelWorker($filter->getRight(), $depth + 1);
                     $ret = new BinaryFilter($left, $filter->getOperator(), $right);
                     return $ret;
                 } else {
                     if ($filter instanceof QueryStringFilter) {
                         $ret = new QueryStringFilter($filter->getQueryString());
                         return $ret;
                     } else {
                         var_dump($filter);
                         throw new \Exception();
                     }
                 }
             }
         }
     }
 }
 /**
  * @covers WindowsAzure\Table\TableRestProxy::queryTables
  * @covers WindowsAzure\Table\TableRestProxy::_buildFilterExpression
  * @covers WindowsAzure\Table\TableRestProxy::_buildFilterExpressionRec
  * @covers WindowsAzure\Table\TableRestProxy::_addOptionalQuery
  * @covers WindowsAzure\Table\TableRestProxy::_encodeODataUriValues
  * @covers WindowsAzure\Table\TableRestProxy::_encodeODataUriValue
  * @covers WindowsAzure\Table\Models\EdmType::serializeQueryValue
  * @covers WindowsAzure\Table\Models\QueryTablesResult::create
  * @covers WindowsAzure\Table\Internal\AtomReaderWriter::_parseBody
  * @covers WindowsAzure\Table\Internal\AtomReaderWriter::parseTableEntries
  * @covers WindowsAzure\Common\Internal\ServiceRestProxy::sendContext
  */
 public function testQueryTablesWithFilterOption()
 {
     $this->skipIfEmulated();
     // Setup
     $name1 = 'wquerytableswithfilteroption1';
     $name2 = 'querytableswithfilteroption2';
     $name3 = 'querytableswithfilteroption3';
     $prefix = 'q';
     $prefixFilter = Filter::applyAnd(Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant($prefix, EdmType::STRING)), Filter::applyLe(Filter::applyPropertyName('TableName'), Filter::applyConstant($prefix . '{', EdmType::STRING)));
     $this->createTable($name1);
     $this->createTable($name2);
     $this->createTable($name3);
     // Test
     $result = $this->restProxy->queryTables($prefixFilter);
     // Assert
     $tables = $result->getTables();
     $this->assertCount(2, $tables);
     $this->assertEquals($name2, $tables[0]);
     $this->assertEquals($name3, $tables[1]);
 }
 /**
  * @covers WindowsAzure\Table\TableRestProxy::deleteEntity
  * @covers WindowsAzure\Table\TableRestProxy::insertEntity
  */
 public function testDeleteEntityTroublesomeRowKey()
 {
     // TODO: Fails because of https://github.com/WindowsAzure/azure-sdk-for-php/issues/180
     // The service does not allow the following common characters in keys:
     // 35 '#'
     // 47 '/'
     // 63 '?'
     // 92 '\'
     // In addition, the following values are not allowed, as they make the URL bad:
     // 0-31, 127-159
     // That still leaves several options for making troublesome keys
     // spaces
     // single quotes
     // Unicode
     // These need to be properly encoded when passed on the URL, else there will be trouble
     $table = TableServiceFunctionalTestData::$TEST_TABLE_NAMES[0];
     $e = new Entity();
     $e->setRowKey('row\'Key\'');
     $e->setPartitionKey('niceKey');
     $this->restProxy->insertEntity($table, $e);
     $this->restProxy->deleteEntity($table, $e->getPartitionKey(), $e->getRowKey());
     $qopts = new QueryEntitiesOptions();
     $qopts->setFilter(Filter::applyEq(Filter::applyPropertyName('RowKey'), Filter::applyConstant($e->getRowKey(), EdmType::STRING)));
     $queryres = $this->restProxy->queryEntities($table, $qopts);
     $this->assertEquals(0, count($queryres->getEntities()), 'entities returned');
     $e = new Entity();
     $e->setRowKey('row Key');
     $e->setPartitionKey('niceKey');
     $this->restProxy->insertEntity($table, $e);
     $this->restProxy->deleteEntity($table, $e->getPartitionKey(), $e->getRowKey());
     $qopts = new QueryEntitiesOptions();
     $qopts->setFilter(Filter::applyEq(Filter::applyPropertyName('RowKey'), Filter::applyConstant($e->getRowKey(), EdmType::STRING)));
     $queryres = $this->restProxy->queryEntities($table, $qopts);
     $this->assertEquals(0, count($queryres->getEntities()), 'entities returned');
     $e = new Entity();
     $e->setRowKey('row ' . TableServiceFunctionalTestData::getUnicodeString());
     $e->setPartitionKey('niceKey');
     $this->restProxy->insertEntity($table, $e);
     $this->restProxy->deleteEntity($table, $e->getPartitionKey(), $e->getRowKey());
     $qopts = new QueryEntitiesOptions();
     $qopts->setFilter(Filter::applyEq(Filter::applyPropertyName('RowKey'), Filter::applyConstant($e->getRowKey(), EdmType::STRING)));
     $queryres = $this->restProxy->queryEntities($table, $qopts);
     $this->assertEquals(0, count($queryres->getEntities()), 'entities returned');
     $this->clearTable($table);
 }
 public function testCheckConstantFilter()
 {
     $filter = new ConstantFilter(EdmType::STRING, null);
     $this->assertNotNull($filter, 'Default $filter');
     $this->assertNull($filter->getValue(), 'Default ConstantFilter->getValue');
     $value = 'foo';
     $filter = new ConstantFilter(EdmType::STRING, $value);
     $this->assertEquals($value, $filter->getValue(), 'Set ConstantFilter->getValue');
     // Now check the factory.
     $value = 'bar';
     $filter = Filter::applyConstant($value, EdmType::STRING);
     $this->assertEquals($value, $filter->getValue(), 'constant factory ConstantFilter->getValue');
 }
 static function getInterestingQueryTablesOptions()
 {
     $ret = array();
     $options = new QueryTablesOptions();
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $options->setTop(2);
     $options->setPrefix(self::$nonExistTablePrefix);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $options->setTop(-2);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[1]), Filter::applyPropertyName('TableName'));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[2]), Filter::applyPropertyName('TableName'));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyAnd(Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[1]), Filter::applyPropertyName('TableName')), Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[2]), Filter::applyPropertyName('TableName')));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyAnd(Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[1])), Filter::applyLe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[2])));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyOr(Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[1])), Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[2])));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyAnd(Filter::applyEq(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[1])), Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[0])));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyOr(Filter::applyEq(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[1])), Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[2])));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyOr(Filter::applyEq(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[1])), Filter::applyEq(Filter::applyPropertyName('TableName'), Filter::applyConstant(self::$TEST_TABLE_NAMES[2])));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $filter = Filter::applyOr(Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[1]), Filter::applyPropertyName('TableName')), Filter::applyEq(Filter::applyConstant(self::$TEST_TABLE_NAMES[2]), Filter::applyPropertyName('TableName')));
     $options->setFilter($filter);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $options->setPrefix(self::$nonExistTablePrefix);
     array_push($ret, $options);
     if (!Configuration::isEmulated()) {
         $options = new QueryTablesOptions();
         $options->setPrefix(self::$testUniqueId);
         array_push($ret, $options);
     }
     $options = new QueryTablesOptions();
     $nextTableName = self::$TEST_TABLE_NAMES[1];
     $options->setNextTableName($nextTableName);
     array_push($ret, $options);
     $options = new QueryTablesOptions();
     $nextTableName = self::$nonExistTablePrefix;
     $options->setNextTableName($nextTableName);
     array_push($ret, $options);
     return $ret;
 }
 private static function addBinaryFilter($name, $edmType, $values)
 {
     $counter = 0;
     $ret = array();
     foreach ($values as $o) {
         $f = self::getBinaryFilterFromIndex($counter, Filter::applyPropertyName($name), Filter::applyConstant($o, $edmType));
         $q = new Query();
         $q->setFilter($f);
         $qeo = new QueryEntitiesOptions();
         $qeo->setQuery($q);
         array_push($ret, $qeo);
         $counter = ($counter + 1) % 6;
     }
     return $ret;
 }
 /**
  * Quries tables in the given storage account.
  * 
  * @param Models\QueryTablesOptions|string|Models\Filter $options Could be
  * optional parameters, table prefix or filter to apply.
  * 
  * @return Models\QueryTablesResult
  * 
  * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179405.aspx
  */
 public function queryTables($options = null)
 {
     $method = Resources::HTTP_GET;
     $headers = array();
     $postParams = array();
     $queryParams = array();
     $statusCode = Resources::STATUS_OK;
     $path = 'Tables';
     if (is_null($options)) {
         $options = new QueryTablesOptions();
     } else {
         if (is_string($options)) {
             $prefix = $options;
             $options = new QueryTablesOptions();
             $options->setPrefix($prefix);
         } else {
             if ($options instanceof Filter) {
                 $filter = $options;
                 $options = new QueryTablesOptions();
                 $options->setFilter($filter);
             }
         }
     }
     $query = $options->getQuery();
     $next = $options->getNextTableName();
     $prefix = $options->getPrefix();
     $timeout = $options->getTimeout();
     if (!empty($prefix)) {
         // Append Max char to end '{' is 1 + 'z' in AsciiTable ==> upperBound
         // is prefix + '{'
         $prefixFilter = Filter::applyAnd(Filter::applyGe(Filter::applyPropertyName('TableName'), Filter::applyConstant($prefix, EdmType::STRING)), Filter::applyLe(Filter::applyPropertyName('TableName'), Filter::applyConstant($prefix . '{', EdmType::STRING)));
         if (is_null($query)) {
             $query = new Models\Query();
         }
         if (is_null($query->getFilter())) {
             // use the prefix filter if the query filter is null
             $query->setFilter($prefixFilter);
         } else {
             // combine and use the prefix filter if the query filter exists
             $combinedFilter = Filter::applyAnd($query->getFilter(), $prefixFilter);
             $query->setFilter($combinedFilter);
         }
     }
     $queryParams = $this->_addOptionalQuery($queryParams, $query);
     $this->addOptionalQueryParam($queryParams, Resources::QP_NEXT_TABLE_NAME, $next);
     $this->addOptionalQueryParam($queryParams, Resources::QP_TIMEOUT, $timeout);
     // One can specify the NextTableName option to get table entities starting
     // from the specified name. However, there appears to be an issue in the
     // Azure Table service where this does not engage on the server unless
     // $filter appears in the URL. The current behavior is to just ignore the
     // NextTableName options, which is not expected or easily detectable.
     if (array_key_exists(Resources::QP_NEXT_TABLE_NAME, $queryParams) && !array_key_exists(Resources::QP_FILTER, $queryParams)) {
         $queryParams[Resources::QP_FILTER] = Resources::EMPTY_STRING;
     }
     $response = $this->send($method, $headers, $queryParams, $postParams, $path, $statusCode);
     $tables = $this->_atomSerializer->parseTableEntries($response->getBody());
     return QueryTablesResult::create($response->getHeader(), $tables);
 }
 /**
  * @covers WindowsAzure\Table\TableRestProxy::insertEntity
  * @covers WindowsAzure\Table\TableRestProxy::queryEntities
  */
 public function testQueryEntitiesWithFilterWorks()
 {
     // Arrange
     $table = self::$testTable5;
     $numberOfEntries = 5;
     $entities = array();
     for ($i = 0; $i < $numberOfEntries; $i++) {
         $entity = new Entity();
         $entity->setPartitionKey('001');
         $entity->setRowKey('queryEntitiesWithFilterWorks-' . $i);
         $entity->addProperty('test', EdmType::BOOLEAN, $i % 2 == 0);
         $entity->addProperty('test2', EdmType::STRING, '\'value" ' . $i);
         $entity->addProperty('test3', EdmType::INT32, $i);
         $entity->addProperty('test4', EdmType::INT64, strval('12345678901' + $i));
         $entity->addProperty('test5', EdmType::DATETIME, new \DateTime('2012-01-0' . $i));
         $entity->addProperty('test6', EdmType::BINARY, chr($i));
         $entity->addProperty('test7', EdmType::GUID, Utilities::getGuid());
         $entities[$i] = $entity;
         $this->restProxy->insertEntity($table, $entity);
     }
     // Act
     $f = Filter::applyEq(Filter::applyPropertyName('RowKey'), Filter::applyConstant('queryEntitiesWithFilterWorks-3', EdmType::STRING));
     $q = new Query();
     $q->setFilter($f);
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $q->setFilter(Filter::applyQueryString('RowKey eq \'queryEntitiesWithFilterWorks-3\''));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test'), Filter::applyConstant(true, EdmType::BOOLEAN)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(3, count($result->getEntities()), 'count($result->getEntities())');
     // Act
     $q = new Query();
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test2'), Filter::applyConstant('\'value" 3', EdmType::STRING)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test4'), Filter::applyConstant(12345678903, EdmType::INT64)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-2', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test5'), Filter::applyConstant(new \DateTime('2012-01-03'), EdmType::DATETIME)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $ent3 = $entities[3];
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test6'), Filter::applyConstant(chr(3), EdmType::BINARY)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
     // Act
     $q = new Query();
     $ent3 = $entities[3];
     $q->setFilter(Filter::applyEq(Filter::applyPropertyName('test7'), Filter::applyConstant($ent3->getPropertyValue('test7'), EdmType::GUID)));
     $qeo = new QueryEntitiesOptions();
     $qeo->setQuery($q);
     $result = $this->restProxy->queryEntities($table, $qeo);
     // Assert
     $this->assertNotNull($result, '$result');
     $this->assertEquals(1, count($result->getEntities()), 'count($result->getEntities())');
     $resEnts = $result->getEntities();
     $this->assertEquals('queryEntitiesWithFilterWorks-3', $resEnts[0]->getRowKey(), '$resEnts[0]->getRowKey()');
 }