/** * Gets the ResourceAssociationSet instance for the given source association end, * Note: Wrapper for IMetadataProvider::getResourceAssociationSet * method implementation * * @param ResourceSet $set Resource set of the source association end * @param ResourceType $type Resource type of the source association end * @param ResourceProperty $property Resource property of the source association end * * * @return ResourceAssociationSet|null Returns ResourceAssociationSet for the source * association end, NULL if no such * association end or resource set in the * other end of the association is invisible */ public function getResourceAssociationSet(ResourceSet $set, ResourceType $type, ResourceProperty $property) { $type = $this->_getResourceTypeWherePropertyIsDeclared($type, $property); $cacheKey = $set->getName() . '_' . $type->getName() . '_' . $property->getName(); if (array_key_exists($cacheKey, $this->associationSetCache)) { return $this->associationSetCache[$cacheKey]; } $associationSet = $this->metaProvider->getResourceAssociationSet($set, $type, $property); if (!is_null($associationSet)) { $thisAssociationSetEnd = $associationSet->getResourceAssociationSetEnd($set, $type, $property); $relatedAssociationSetEnd = $associationSet->getRelatedResourceAssociationSetEnd($set, $type, $property); //If $thisAssociationSetEnd or $relatedAssociationSetEnd //is null means the associationset //we got from the IDSMP::getResourceAssociationSet is invalid. //AssociationSet::getResourceAssociationSetEnd //return null, if AssociationSet's End1 or End2's resourceset name //is not matching with the name of //resource set wrapper (param1) and resource type is not assignable //from given resource type (param2) if (is_null($thisAssociationSetEnd) || is_null($relatedAssociationSetEnd)) { throw new ODataException(Messages::providersWrapperIDSMPGetResourceSetReturnsInvalidResourceSet($set->getName(), $type->getFullName(), $property->getName()), 500); } $relatedResourceSetWrapper = $this->_validateResourceSetAndGetWrapper($relatedAssociationSetEnd->getResourceSet()); if ($relatedResourceSetWrapper === null) { $associationSet = null; } else { $this->_validateResourceType($thisAssociationSetEnd->getResourceType()); $this->_validateResourceType($relatedAssociationSetEnd->getResourceType()); } } $this->associationSetCache[$cacheKey] = $associationSet; return $associationSet; }
public function testConfiguration4() { $customersResourceSet = $this->_northWindMetadata->resolveResourceSet('Customers'); $this->assertNotNull($customersResourceSet); $this->AssertEquals($this->_dataServiceConfiguration->getEntitySetAccessRule($customersResourceSet), EntitySetRights::NONE); try { $this->_dataServiceConfiguration->setEntitySetAccessRule('Customers', EntitySetRights::ALL + 1); $this->fail('An expected InvalidOperationException for \'page size and max result per collection mutual exclusion\' was not thrown for month'); } catch (\InvalidArgumentException $exception) { $this->AssertEquals('The argument \'$rights\' of \'setEntitySetAccessRule\' should be EntitySetRights enum value', $exception->getMessage()); } $this->_dataServiceConfiguration->setEntitySetAccessRule('Customers', EntitySetRights::READ_ALL); $this->AssertEquals($this->_dataServiceConfiguration->getEntitySetAccessRule($customersResourceSet), EntitySetRights::READ_ALL); try { $this->_dataServiceConfiguration->setEntitySetAccessRule('NonExistEntitySet', EntitySetRights::READ_MULTIPLE); $this->fail('An expected InvalidArgumentException for \'non-exist entity set name\' was not thrown for month'); } catch (\InvalidArgumentException $exception) { $this->AssertEquals('The given name \'NonExistEntitySet\' was not found in the entity sets', $exception->getMessage()); } }
public function testGetTypesDuplicateNames() { $fakeTypes = array(new ResourceType(new String(), ResourceTypeKind::PRIMITIVE, "FakeType1"), new ResourceType(new String(), ResourceTypeKind::PRIMITIVE, "FakeType1")); Phockito::when($this->mockMetadataProvider->getTypes())->return($fakeTypes); $wrapper = $this->getMockedWrapper(); try { $wrapper->getTypes(); $this->fail('An expected ODataException for entity type name repetition has not been thrown'); } catch (ODataException $exception) { $this->assertEquals(Messages::providersWrapperEntityTypeNameShouldBeUnique("FakeType1"), $exception->getMessage()); $this->assertEquals(500, $exception->getStatusCode()); } }
/** * Sets the maximum page size for an entity set resource. * * @param string $name Name of entity set resource for which to set * the page size. * @param int $pageSize Page size for the entity set resource that is * specified in name. * * @throws InvalidOperationException * @throws \InvalidArgumentException * * @return void */ public function setEntitySetPageSize($name, $pageSize) { $pageSize = $this->_checkIntegerNonNegativeParameter($pageSize, 'setEntitySetPageSize'); if ($this->_maxResultsPerCollection != PHP_INT_MAX) { throw new InvalidOperationException(Messages::configurationMaxResultAndPageSizeMutuallyExclusive()); } if ($pageSize == PHP_INT_MAX) { $pageSize = 0; } if (strcmp($name, '*') === 0) { $this->_defaultPageSize = $pageSize; } else { if (!$this->_provider->resolveResourceSet($name)) { throw new \InvalidArgumentException(Messages::configurationResourceSetNameNotFound($name)); } $this->_pageSizes[$name] = $pageSize; } }
/** * Test expression provider using real data */ public function testAnonymousFunction() { //Creates test data $data = $this->createTestData(); //Query for Customers with 'L' as second letter of CustomerID $result = $this->executeExpression('indexof(CustomerID, \'L\') eq 1', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $this->assertEquals('ALFKI', $result[0]->CustomerID); //Query for Customers with country as Germany $result = $this->executeExpression('Country eq \'Germany\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(2, count($result)); $this->assertEquals('Germany', $result[0]->Country); $this->assertEquals('Germany', $result[1]->Country); //Query for Customers with no address $result = $this->executeExpression('Address eq null', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $this->assertEquals('15b242e7-52eb-46bd-8f0e-6568b72cd9a6', $result[0]->CustomerGuid); //Query for Customers with non-primary address $result = $this->executeExpression('Address/Address2/IsPrimary eq false', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $this->assertEquals('Ann Devon', $result[0]->CustomerName); //Query for Customers with ID 'ALFKI' or 'EASTC' $result = $this->executeExpression('CustomerID eq \'ALFKI\' or CustomerID eq \'EASTC\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(2, count($result)); $this->assertEquals('ALFKI', $result[0]->CustomerID); $this->assertEquals('EASTC', $result[1]->CustomerID); //Query for Customers with an expression which evaluates to false $result = $this->executeExpression('1 add 2 eq 5', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(0, count($result)); //Query for all Orders $result = $this->executeExpression('true', $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), $data['Orders']); $this->assertEquals(5, count($result)); //Query for Order with ShipName as 'Speedy Express' $result = $this->executeExpression('ShipName eq \'Speedy Express\'', $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), $data['Orders']); $this->assertEquals(2, count($result)); foreach ($result as $order) { $this->assertEquals($order->ShipName, 'Speedy Express'); } //Query for Order with CustomerID as 'DUMON' $result = $this->executeExpression('Customer/CustomerID eq \'DUMON\'', $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), $data['Orders']); $this->assertEquals(3, count($result)); //Query for Orders with year of order as 1999 or 1995 $result = $this->executeExpression('year(OrderDate) eq 1999 or year(OrderDate) add 4 eq 1999', $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), $data['Orders']); foreach ($result as $order) { $this->assertContains($order->OrderDate, array(1999, 1995)); } //Query for Orders with date greater than 2000-11-11 $result = $this->executeExpression('OrderDate ge datetime\'2000-11-11\'', $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), $data['Orders']); foreach ($result as $order) { $this->assertGreaterThanOrEqual(0, DateTime::dateTimeCmp($order->OrderDate, '2000-11-11')); } //Query for Customer using different flavours of guid $result = $this->executeExpression('CustomerGuid eq guid\'15b242e7-52eb-46bd-8f0e-6568b72cd9a6\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $customer1 = $result[0]; $result = $this->executeExpression('CustomerGuid eq guid\'{15b242e7-52eb-46bd-8f0e-6568b72cd9a6}\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $customer2 = $result[0]; $result = $this->executeExpression('CustomerGuid eq guid\'(15b242e7-52eb-46bd-8f0e-6568b72cd9a6)\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $customer3 = $result[0]; $result = $this->executeExpression('CustomerGuid eq guid\'15b242e752eb46bd8f0e6568b72cd9a6\'', $this->northWindMetadata->resolveResourceSet('Customers')->getResourceType(), $data['Customers']); $this->assertEquals(1, count($result)); $customer4 = $result[0]; $this->assertEquals($customer1->CustomerID, $customer2->CustomerID); $this->assertEquals($customer3->CustomerID, $customer4->CustomerID); $this->assertEquals($customer1->CustomerID, $customer4->CustomerID); }
public function testParseExpression2() { $expressionProvider = new PHPExpressionProvider('$lt'); $filterExpression = 'UnitPrice ge 6'; $resourceType = $this->_northWindMetadata->resolveResourceSet('Order_Details')->getResourceType(); $filterInfo = ExpressionParser2::parseExpression2($filterExpression, $resourceType, $expressionProvider); $this->assertTrue(!is_null($filterInfo)); //There are no navigation properties in the expression so should be empty. $this->assertEquals(array(), $filterInfo->getNavigationPropertiesUsed()); $this->assertEquals('(!(is_null($lt->UnitPrice)) && ($lt->UnitPrice >= 6))', $filterInfo->getExpressionAsString()); $filterExpression = 'Order/Customer/CustomerID eq \'ANU\' or Product/ProductID gt 123 and UnitPrice ge 6'; $filterInfo = ExpressionParser2::parseExpression2($filterExpression, $resourceType, $expressionProvider); $this->assertTrue(!is_null($filterInfo)); $navigationsUsed = $filterInfo->getNavigationPropertiesUsed(); $this->assertTrue(!is_null($navigationsUsed)); $this->assertTrue(is_array($navigationsUsed)); $this->assertEquals(count($navigationsUsed), 2); //Order/Customer $this->assertTrue(is_array($navigationsUsed[0])); $this->assertEquals(count($navigationsUsed[0]), 2); //Product $this->assertTrue(is_array($navigationsUsed[1])); $this->assertEquals(count($navigationsUsed[1]), 1); //Verify 'Order/Customer' $this->assertTrue(is_object($navigationsUsed[0][0])); $this->assertTrue(is_object($navigationsUsed[0][1])); $this->assertTrue($navigationsUsed[0][0] instanceof ResourceProperty); $this->assertTrue($navigationsUsed[0][1] instanceof ResourceProperty); $this->assertEquals($navigationsUsed[0][0]->getName(), 'Order'); $this->assertEquals($navigationsUsed[0][1]->getName(), 'Customer'); //Verify 'Product' $this->assertTrue(is_object($navigationsUsed[1][0])); $this->assertTrue($navigationsUsed[1][0] instanceof ResourceProperty); $this->assertEquals($navigationsUsed[1][0]->getName(), 'Product'); $filterExpression = 'Customer/Address/LineNumber add 4 eq 8'; $resourceType = $this->_northWindMetadata->resolveResourceSet('Orders')->getResourceType(); $filterInfo = ExpressionParser2::parseExpression2($filterExpression, $resourceType, $expressionProvider); $this->assertTrue(!is_null($filterInfo)); $navigationsUsed = $filterInfo->getNavigationPropertiesUsed(); //Customer $this->assertTrue(!is_null($navigationsUsed)); $this->assertTrue(is_array($navigationsUsed)); $this->assertEquals(count($navigationsUsed), 1); $this->assertTrue(is_array($navigationsUsed[0])); $this->assertEquals(count($navigationsUsed[0]), 1); //Verify 'Customer' $this->assertTrue(is_object($navigationsUsed[0][0])); $this->assertTrue($navigationsUsed[0][0] instanceof ResourceProperty); $this->assertEquals($navigationsUsed[0][0]->getName(), 'Customer'); //Test with property acess expression in function call $filterExpression = 'replace(Customer/CustomerID, \'LFK\', \'RTT\') eq \'ARTTI\''; $filterInfo = ExpressionParser2::parseExpression2($filterExpression, $resourceType, $expressionProvider); $this->assertTrue(!is_null($filterInfo)); $navigationsUsed = $filterInfo->getNavigationPropertiesUsed(); //Customer $this->assertTrue(!is_null($navigationsUsed)); $this->assertTrue(is_array($navigationsUsed)); $this->assertEquals(count($navigationsUsed), 1); $this->assertTrue(is_array($navigationsUsed[0])); $this->assertEquals(count($navigationsUsed[0]), 1); //Verify 'Customer' $this->assertTrue(is_object($navigationsUsed[0][0])); $this->assertTrue($navigationsUsed[0][0] instanceof ResourceProperty); $this->assertEquals($navigationsUsed[0][0]->getName(), 'Customer'); }
public function testPropertyAccessExpression() { $expression = 'CustomerID'; $parser = new ExpressionParser($expression, $this->customersResourceType, false); $expr = $parser->parseFilter(); $this->assertTrue($expr instanceof PropertyAccessExpression); $this->assertTrue($expr->getType() instanceof String); $expression = 'Rating'; $parser->resetParser($expression); $expr = $parser->parseFilter(); $this->assertTrue($expr instanceof PropertyAccessExpression); $this->assertTrue($expr->getType() instanceof Int32); $expression = 'Address'; $parser->resetParser($expression); $expr = $parser->parseFilter(); $this->assertTrue($expr instanceof PropertyAccessExpression); $this->assertTrue($expr->getType() instanceof Navigation); $this->assertEquals('Address', $expr->getResourceType()->getFullName()); $expression = 'Address/LineNumber'; $parser->resetParser($expression); $expr = $parser->parseFilter(); $this->assertTrue($expr instanceof PropertyAccessExpression); $this->assertTrue($expr->getType() instanceof Int32); $this->assertEquals('Edm.Int32', $expr->getResourceType()->getFullName()); $this->assertEquals('Address', $expr->getParent()->getResourceType()->getFullName()); $expression = 'Address\\LineNumber'; $parser->resetParser($expression); try { $expr = $parser->parseFilter(); $this->fail('An expected ODataException for \'invalid chatacter\' has not been thrown'); } catch (ODataException $exception) { $this->assertEquals('Invalid character \'\\\' at position 7', $exception->getMessage()); } $expression = 'CustomerID1'; $parser->resetParser($expression); try { $expr = $parser->parseFilter(); $this->fail('An expected ODataException for \'No property exists\' has not been thrown'); } catch (ODataException $exception) { $this->assertEquals('No property \'CustomerID1\' exists in type \'Customer\' at position 0', $exception->getMessage()); } $expression = 'Address/InvalidLineNumber'; $parser->resetParser($expression); try { $expr = $parser->parseFilter(); $this->fail('An expected ODataException for \'No property exists\' has not been thrown'); } catch (ODataException $exception) { $this->assertEquals('No property \'InvalidLineNumber\' exists in type \'Address\' at position 8', $exception->getMessage()); } $expression = 'Orders/OrderID'; $parser->resetParser($expression); try { $expr = $parser->parseFilter(); $this->fail('An expected ODataException for collection property navigation was not thrown'); } catch (ODataException $exception) { $this->assertStringStartsWith('The \'Orders\' is an entity collection property of \'Customer\'', $exception->getMessage()); } $expression = 'Customer/CustomerID'; $parser = new ExpressionParser($expression, $this->northWindMetadata->resolveResourceSet('Orders')->getResourceType(), false); $expr = $parser->parseFilter(); $this->assertTrue($expr instanceof PropertyAccessExpression); $this->assertTrue($expr->getType() instanceof String); $this->assertEquals('Edm.String', $expr->getResourceType()->getFullName()); $expression = 'Customer/Orders/OrderID'; $parser->resetParser($expression); try { $expr = $parser->parseFilter(); $this->fail('An expected ODataException for collection property navigation was not thrown'); } catch (ODataException $exception) { $this->assertStringStartsWith('The \'Orders\' is an entity collection property of \'Customer\'', $exception->getMessage()); } }