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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        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);
        }
Exemple #13
0
        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);
        }
Exemple #14
0
        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);
        }
Exemple #15
0
        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);
        }
Exemple #16
0
        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);
        }
Exemple #17
0
        /// <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);
            }
        }