/** * @covers WindowsAzure\Table\TableRestProxy::queryEntities * @covers WindowsAzure\Table\TableRestProxy::_addOptionalQuery * @covers WindowsAzure\Table\TableRestProxy::_encodeODataUriValues * @covers WindowsAzure\Table\TableRestProxy::_encodeODataUriValue * @covers WindowsAzure\Table\Internal\AtomReaderWriter::_parseBody * @covers WindowsAzure\Table\Internal\AtomReaderWriter::parseEntities * @covers WindowsAzure\Table\Internal\AtomReaderWriter::_parseOneEntity * @covers WindowsAzure\Common\Internal\ServiceRestProxy::sendContext */ public function testQueryEntitiesWithGetTop() { // Setup $name = 'queryentitieswithgettop'; $pk1 = '123'; $pk2 = '124'; $pk3 = '125'; $e1 = TestResources::getTestEntity($pk1, '1'); $e2 = TestResources::getTestEntity($pk2, '2'); $e3 = TestResources::getTestEntity($pk3, '3'); $this->createTable($name); $this->restProxy->insertEntity($name, $e1); $this->restProxy->insertEntity($name, $e2); $this->restProxy->insertEntity($name, $e3); $query = new Query(); $query->setTop(1); $options = new QueryEntitiesOptions(); $options->setQuery($query); // Test $result = $this->restProxy->queryEntities($name, $options); // Assert $entities = $result->getEntities(); $this->assertCount(1, $entities); $this->assertEquals($pk1, $entities[0]->getPartitionKey()); }
/** * @covers WindowsAzure\Table\Models\QueryEntitiesOptions::addSelectField * @covers WindowsAzure\Table\Models\QueryEntitiesOptions::getSelectFields */ public function testAddSelectField() { // Setup $options = new QueryEntitiesOptions(); $field = 'customerId'; $expected = array($field); // Test $options->addSelectField($field); // Assert $this->assertEquals($expected, $options->getSelectFields()); }
/** * @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 testCheckQueryEntitiesOptions() { $options = new QueryEntitiesOptions(); $query = new Query(); $nextPartitionKey = 'aaa'; $nextRowKey = 'bbb'; $this->assertNull($options->getNextPartitionKey(), 'Default QueryEntitiesOptions->getNextPartitionKey'); $this->assertNull($options->getNextRowKey(), 'Default QueryEntitiesOptions->getNextRowKey'); $this->assertNotNull($options->getQuery(), 'Default QueryEntitiesOptions->getQuery'); $options->setNextPartitionKey($nextPartitionKey); $options->setNextRowKey($nextRowKey); $options->setQuery($query); $this->assertEquals($nextPartitionKey, $options->getNextPartitionKey(), 'Set QueryEntitiesOptions->getNextPartitionKey'); $this->assertEquals($nextRowKey, $options->getNextRowKey(), 'Set QueryEntitiesOptions->getNextRowKey'); $this->assertEquals($query, $options->getQuery(), 'Set QueryEntitiesOptions->getQuery'); $options->addSelectField('bar'); $options->addSelectField('baz'); $this->assertNotNull($options->getSelectFields(), 'Add $options->getSelectFields'); $this->assertNotNull($options->getQuery()->getSelectFields(), 'Add $options->getQuery->getSelectFields'); $this->assertEquals(2, count($options->getSelectFields()), 'Add $options->getSelectFields->size'); $this->assertEquals(2, count($options->getQuery()->getSelectFields()), 'Add $options->getQuery->getSelectFields->size'); $filter = Filter::applyConstant('foo', EdmType::STRING); $options->setFilter($filter); $options->setSelectFields(null); $options->setTop(TableServiceFunctionalTestData::IntegerMAX_VALUE); $this->assertEquals($filter, $options->getFilter(), 'Set $options->getFilter'); $this->assertEquals($filter, $options->getQuery()->getFilter(), 'Set $options->getQuery->getFilter'); $this->assertNull($options->getSelectFields(), 'Set $options->getSelectFields'); $this->assertNull($options->getQuery()->getSelectFields(), 'Set $options->getQuery->getSelectFields'); $this->assertEquals(TableServiceFunctionalTestData::IntegerMAX_VALUE, $options->getTop(), 'Set $options->getTop'); $this->assertEquals(TableServiceFunctionalTestData::IntegerMAX_VALUE, $options->getQuery()->getTop(), 'Set $options->getQuery->getTop'); }
/** * @param $table * @param string $parsed_filter * @param string $fields * @param array $extras * @param bool $parse_results * * @throws \Exception * @return array */ protected function queryEntities($table, $parsed_filter = '', $fields = null, $extras = [], $parse_results = false) { $options = new QueryEntitiesOptions(); $options->setSelectFields([]); if (!empty($fields) && ApiOptions::FIELDS_ALL != $fields) { if (!is_array($fields)) { $fields = array_map('trim', explode(',', trim($fields, ','))); } $options->setSelectFields($fields); } $limit = intval(ArrayUtils::get($extras, ApiOptions::LIMIT, 0)); if ($limit > 0) { $options->setTop($limit); } if (!empty($parsed_filter)) { $query = new QueryStringFilter($parsed_filter); $options->setFilter($query); } try { /** @var QueryEntitiesResult $result */ $result = $this->parent->getConnection()->queryEntities($table, $options); /** @var Entity[] $entities */ $entities = $result->getEntities(); if ($parse_results) { return static::parseEntitiesToRecords($entities); } return $entities; } catch (ServiceException $ex) { throw new InternalServerErrorException("Failed to filter items from '{$table}' on Windows Azure Tables service.\n" . $ex->getMessage()); } }
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 entities for the given table name * * @param string $table The name of * the table. * @param Models\QueryEntitiesOptions|string|Models\Filter $options Coule be * optional parameters, query string or filter to apply. * * @return Models\QueryEntitiesResult * * @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179421.aspx */ public function queryEntities($table, $options = null) { Validate::isString($table, 'table'); Validate::notNullOrEmpty($table, 'table'); $method = Resources::HTTP_GET; $headers = array(); $postParams = array(); $queryParams = array(); $statusCode = Resources::STATUS_OK; $path = $table; if (is_null($options)) { $options = new QueryEntitiesOptions(); } else { if (is_string($options)) { $queryString = $options; $options = new QueryEntitiesOptions(); $options->setFilter(Filter::applyQueryString($queryString)); } else { if ($options instanceof Filter) { $filter = $options; $options = new QueryEntitiesOptions(); $options->setFilter($filter); } } } $queryParams = $this->_addOptionalQuery($queryParams, $options->getQuery()); $this->addOptionalQueryParam($queryParams, Resources::QP_TIMEOUT, $options->getTimeout()); $this->addOptionalQueryParam($queryParams, Resources::QP_NEXT_PK, $options->getNextPartitionKey()); $this->addOptionalQueryParam($queryParams, Resources::QP_NEXT_RK, $options->getNextRowKey()); $this->addOptionalHeader($headers, Resources::CONTENT_TYPE, Resources::XML_ATOM_CONTENT_TYPE); if (!is_null($options->getQuery())) { $dsHeader = Resources::DATA_SERVICE_VERSION; $maxdsValue = Resources::MAX_DATA_SERVICE_VERSION_VALUE; $fields = $options->getQuery()->getSelectFields(); $hasSelect = !empty($fields); if ($hasSelect) { $this->addOptionalHeader($headers, $dsHeader, $maxdsValue); } } $response = $this->send($method, $headers, $queryParams, $postParams, $path, $statusCode); $entities = $this->_atomSerializer->parseEntities($response->getBody()); return QueryEntitiesResult::create($response->getHeader(), $entities); }
/** * @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()'); }