Example #1
0
 /**
  * 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());
     }
 }