/** * @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()); }
/** * @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()'); }