/** * Query for a related resource set or resource set reference pointed by the * given segment descriptor and update the descriptor with the result. * * @param SegmentDescriptor &$segmentDescriptor Describes the related resource * to query. * * @return void */ private function _handleSegmentTargetsToRelatedResource(SegmentDescriptor &$segmentDescriptor) { $projectedProperty = $segmentDescriptor->getProjectedProperty(); $projectedPropertyKind = $projectedProperty->getKind(); if ($projectedPropertyKind == ResourcePropertyKind::RESOURCESET_REFERENCE) { if ($segmentDescriptor->isSingleResult()) { $entityInstance = $this->_provider->getResourceFromRelatedResourceSet($segmentDescriptor->getPrevious()->getTargetResourceSetWrapper()->getResourceSet(), $segmentDescriptor->getPrevious()->getResult(), $segmentDescriptor->getTargetResourceSetWrapper()->getResourceSet(), $projectedProperty, $segmentDescriptor->getKeyDescriptor()); $segmentDescriptor->setResult($entityInstance); } else { $entityInstances = $this->_provider->getRelatedResourceSet($segmentDescriptor->getPrevious()->getTargetResourceSetWrapper()->getResourceSet(), $segmentDescriptor->getPrevious()->getResult(), $segmentDescriptor->getTargetResourceSetWrapper()->getResourceSet(), $segmentDescriptor->getProjectedProperty(), $this->_requestDescription->getInternalFilterInfo(), null, null, null, null); $segmentDescriptor->setResult($entityInstances); } } else { if ($projectedPropertyKind == ResourcePropertyKind::RESOURCE_REFERENCE) { $entityInstance = $this->_provider->getRelatedResourceReference($segmentDescriptor->getPrevious()->getTargetResourceSetWrapper()->getResourceSet(), $segmentDescriptor->getPrevious()->getResult(), $segmentDescriptor->getTargetResourceSetWrapper()->getResourceSet(), $segmentDescriptor->getProjectedProperty()); $segmentDescriptor->setResult($entityInstance); } else { //Unexpected state } } }
/** * Gets reference to the ResourceProperty instance targetted by * the resource path, ResourceProperty will present in the * following cases: * if the last segement descriptor describes * (a) resource set (after 1 level) * http://server/NW.svc/Customers('ALFKI')/Orders * http://server/NW.svc/Customers('ALFKI')/Orders(123) * http://server/NW.svc/Customers('ALFKI')/$links/Orders * (b) resource set reference * http://server/NW.svc/Orders(123)/Customer * http://server/NW.svc/Orders(123)/$links/Customer * (c) $count * http://server/NW.svc/Customers/$count * (d) Primitive * http://server/NW.svc/Customers('ALFKI')/Country * (e) $value on primitive type * http://server/NW.svc/Customers('ALFKI')/Country/$value * (f) Complex * http://server/NW.svc/Customers('ALFKI')/Address * (g) Bag * http://server/NW.svc/Employees(123)/Emails * (h) MLE * http://server/NW.svc/Employees(123)/$value * * ResourceType will be absent (NULL) in the following cases: * if the last segment descriptor describes * (a) If last segment is the only segment pointing to * ResourceSet (single or multiple) * http://server/NW.svc/Customers * http://server/NW.svc/Customers('ALFKI') * (b) Named Stream * http://server/NW.svc/Employees(123)/Thumnail48_48 * (c) metadata * http://server/NW.svc/$metadata * (d) service directory * http://server/NW.svc * (e) $bath * http://server/NW.svc/$batch * * @return ResourceProperty/NULL */ public function getProjectedProperty() { return $this->_lastSegmentDescriptor->getProjectedProperty(); }