public static bool MatchBindingPath(IEdmPathExpression bindingPath, IList <ODataSegmentTemplate> parsedSegments) { List <string> paths = bindingPath.PathSegments.ToList(); // If binding path only includes navigation property name, it matches. if (paths.Count == 1) { return(true); } int pathIndex = paths.Count - 2; // Skip the last segment which is navigation property name. // Match from tail to head. for (int segmentIndex = parsedSegments.Count - 1; segmentIndex >= 0; segmentIndex--) { ODataSegmentTemplate segment = parsedSegments[segmentIndex]; bool segmentIsNavigationPropertySegment = segment is NavigationSegmentTemplate; // Containment navigation property or complex property in binding path. if (segment is PropertySegmentTemplate || (segmentIsNavigationPropertySegment && segment.NavigationSource is IEdmContainedEntitySet)) { if (pathIndex < 0 || string.CompareOrdinal(paths[pathIndex], segment.Literal) != 0) { return(false); } pathIndex--; } else if (segment is CastSegmentTemplate) { // May need match type if the binding path contains type cast. if (pathIndex >= 0 && paths[pathIndex].Contains(".", System.StringComparison.Ordinal)) { if (string.CompareOrdinal(paths[pathIndex], segment.EdmType.AsElementType().FullTypeName()) != 0) { return(false); } pathIndex--; } } else if (segment is EntitySetSegmentTemplate || segment is SingletonSegmentTemplate || segmentIsNavigationPropertySegment) { // Containment navigation property in first if statement for NavigationPropertySegment. break; } } // Return true if all the segments in binding path have been matched. return(pathIndex == -1 ? true : false); }
public void ODataPathSegmentToTemplateHandler_Handles_Count() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); // Act handler.Handle(CountSegment.Instance); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <CountSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_DynamicPath() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); DynamicPathSegment segment = new DynamicPathSegment("any"); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <DynamicSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_PathTemplate() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); PathTemplateSegment segment = new PathTemplateSegment("{any}"); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <PathTemplateSegmentTemplate>(segmentTemplate); }
public void ParseODataUriTemplate_ForEntitySet() { // Arrange IODataPathTemplateParser parser = new DefaultODataPathTemplateParser(); // Act ODataPathTemplate path = parser.Parse(_edmModel, "Customers", null); // Assert Assert.NotNull(path); ODataSegmentTemplate pathSegment = Assert.Single(path); EntitySetSegmentTemplate setSegment = Assert.IsType <EntitySetSegmentTemplate>(pathSegment); Assert.Equal("Customers", setSegment.EntitySet.Name); }
public void ODataPathSegmentToTemplateHandler_Handles_Value() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); IEdmType intType = EdmCoreModel.Instance.GetInt32(false).Definition; ValueSegment segment = new ValueSegment(intType); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <ValueSegmentTemplate>(segmentTemplate); }
public void ParseODataUriTemplate_ForSingleton() { // Arrange IODataPathTemplateParser parser = new DefaultODataPathTemplateParser(); // Act ODataPathTemplate path = parser.Parse(_edmModel, "VipCustomer", null); // Assert Assert.NotNull(path); ODataSegmentTemplate pathSegment = Assert.Single(path); SingletonSegmentTemplate singletonSegment = Assert.IsType <SingletonSegmentTemplate>(pathSegment); Assert.Equal("VipCustomer", singletonSegment.Singleton.Name); }
public void ODataPathSegmentToTemplateHandler_Handles_Action() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); IEdmTypeReference intType = EdmCoreModel.Instance.GetInt32(false); IEdmAction action = new EdmAction("NS", "action", intType); OperationSegment segment = new OperationSegment(action, null); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <ActionSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_Property() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); EdmEntityType customer = new EdmEntityType("NS", "Customer"); IEdmStructuralProperty property = customer.AddStructuralProperty("Name", EdmPrimitiveTypeKind.String); PropertySegment segment = new PropertySegment(property); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <PropertySegmentTemplate>(segmentTemplate); }
public void CtorODataPathTemplate_SetsSegments_UsingList() { // Arrange ODataSegmentTemplate template = new Mock <ODataSegmentTemplate>().Object; IList <ODataSegmentTemplate> templates = new List <ODataSegmentTemplate> { template }; // Act ODataPathTemplate path = new ODataPathTemplate(templates); // Assert ODataSegmentTemplate actual = Assert.Single(path); Assert.Same(template, actual); }
public void ODataPathSegmentToTemplateHandler_Handles_Singleton() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); EdmEntityContainer entityContainer = new EdmEntityContainer("NS", "Default"); EdmEntityType customer = new EdmEntityType("NS", "Customer"); EdmSingleton me = entityContainer.AddSingleton("me", customer); SingletonSegment segment = new SingletonSegment(me); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <SingletonSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_EntitySet() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); EdmEntityContainer entityContainer = new EdmEntityContainer("NS", "Default"); EdmEntityType customer = new EdmEntityType("NS", "Customer"); EdmEntitySet customers = entityContainer.AddEntitySet("Customers", customer); EntitySetSegment segment = new EntitySetSegment(customers); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <EntitySetSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_FunctionImport() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); IEdmTypeReference intType = EdmCoreModel.Instance.GetInt32(false); EdmEntityContainer entityContainer = new EdmEntityContainer("NS", "Default"); IEdmFunction function = new EdmFunction("NS", "function", intType); IEdmFunctionImport functionImport = new EdmFunctionImport(entityContainer, "function", function); OperationImportSegment segment = new OperationImportSegment(functionImport, null); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <FunctionImportSegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_Key_AfterNavigationProperty() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); EdmEntityType customer = new EdmEntityType("NS", "Customer"); customer.AddKeys(customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32)); EdmEntityType order = new EdmEntityType("NS", "order"); order.AddKeys(order.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32)); IEdmNavigationProperty ordersNavProperty = customer.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo { Name = "Orders", Target = order, TargetMultiplicity = EdmMultiplicity.Many }); NavigationPropertyLinkSegment segment1 = new NavigationPropertyLinkSegment(ordersNavProperty, null); EdmEntityContainer entityContainer = new EdmEntityContainer("NS", "Default"); EdmEntitySet orders = entityContainer.AddEntitySet("Orders", order); IDictionary <string, object> keys = new Dictionary <string, object> { { "Id", "{relatedKey}" } }; KeySegment segment2 = new KeySegment(keys, order, orders); // Act handler.Handle(segment1); handler.Handle(segment2); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); NavigationLinkSegmentTemplate nlTemplate = Assert.IsType <NavigationLinkSegmentTemplate>(segmentTemplate); Assert.NotNull(nlTemplate.Key); }
public void ODataPathSegmentToTemplateHandler_Handles_AlternateKey() { // Arrange EdmModel model = new EdmModel(); EdmEntityType customer = new EdmEntityType("NS", "Customer"); customer.AddKeys(customer.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32)); IEdmStructuralProperty code = customer.AddStructuralProperty("Code", EdmPrimitiveTypeKind.Int32); model.AddElement(customer); EdmEntityContainer entityContainer = new EdmEntityContainer("NS", "Default"); EdmEntitySet customers = entityContainer.AddEntitySet("Customers", customer); model.AddElement(entityContainer); IDictionary <string, IEdmProperty> alternateKeys = new Dictionary <string, IEdmProperty> { { "Code", code } }; model.AddAlternateKeyAnnotation(customer, alternateKeys); IDictionary <string, object> keys = new Dictionary <string, object> { { "Code", "{Code}" } }; KeySegment segment = new KeySegment(keys, customer, customers); ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(model); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <KeySegmentTemplate>(segmentTemplate); }
public void ODataPathSegmentToTemplateHandler_Handles_NavigationPropertyLink() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); EdmEntityType customer = new EdmEntityType("NS", "customer"); EdmEntityType order = new EdmEntityType("NS", "order"); IEdmNavigationProperty ordersNavProperty = customer.AddUnidirectionalNavigation(new EdmNavigationPropertyInfo { Name = "Orders", Target = order, TargetMultiplicity = EdmMultiplicity.Many }); NavigationPropertyLinkSegment segment = new NavigationPropertyLinkSegment(ordersNavProperty, null); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <NavigationLinkSegmentTemplate>(segmentTemplate); }
/// <summary> /// Translate a KeySegment. /// </summary> /// <param name="segment">the segment to Translate</param> public override void Handle(KeySegment segment) { Func <KeySegmentTemplate> BuildKeyTemplate = () => { try { return(new KeySegmentTemplate(segment)); } catch { if (_model != null) { var alternateKeys = _model.ResolveAlternateKeyProperties(segment); if (alternateKeys != null) { return(new KeySegmentTemplate(segment, alternateKeys)); } } throw; } }; KeySegmentTemplate keyTemplate = BuildKeyTemplate(); ODataSegmentTemplate previous = _segmentTemplates.LastOrDefault(); NavigationLinkSegmentTemplate preRef = previous as NavigationLinkSegmentTemplate; if (preRef != null) { preRef.Key = keyTemplate; } else { _segmentTemplates.Add(keyTemplate); } }