Esempio n. 1
0
        /// <summary>
        /// Add semantic meaning to a Select or Expand Token
        /// </summary>
        /// <param name="elementType">the top level entity type.</param>
        /// <param name="entitySet">the top level entity set</param>
        /// <param name="expandToken">the syntactically parsed expand token</param>
        /// <param name="selectToken">the syntactically parsed select token</param>
        /// <param name="configuration">The configuration to use for parsing.</param>
        /// <returns>A select expand clause bound to metadata.</returns>
        public static SelectExpandClause Parse(
            IEdmEntityType elementType,
            IEdmEntitySet entitySet,
            ExpandToken expandToken,
            SelectToken selectToken,
            ODataUriParserConfiguration configuration)
        {
            expandToken = ExpandTreeNormalizer.NormalizeExpandTree(expandToken);
            selectToken = SelectTreeNormalizer.NormalizeSelectTree(selectToken);

            ExpandBinder       expandBinder = ExpandBinderFactory.Create(elementType, entitySet, configuration);
            SelectExpandClause clause       = expandBinder.Bind(expandToken);

            SelectBinder selectedPropertyBinder = new SelectBinder(configuration.Model, elementType, configuration.Settings.SelectExpandLimit, clause);

            clause = selectedPropertyBinder.Bind(selectToken);

            var prunedTree = SelectExpandTreeFinisher.PruneSelectExpandTree(clause);

            prunedTree.ComputeFinalSelectedItems();

            new ExpandDepthAndCountValidator(configuration.Settings.MaximumExpansionDepth, configuration.Settings.MaximumExpansionCount).Validate(prunedTree);

            return(prunedTree);
        }
Esempio n. 2
0
        public void AllSelectedIsSetIfSelectIsEmpty()
        {
            var expandTree  = new SelectExpandClause(new Collection <SelectItem>(), false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>());

            binder.Bind(selectToken).AllSelected.Should().BeTrue();
        }
Esempio n. 3
0
        public void NonSystemTokenTranslatedToSelectionItem()
        {
            var expandTree  = new SelectExpandClause(new Collection <SelectItem>(), false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("Shoe", null, null)
            });

            binder.Bind(selectToken).SelectedItems.Single().ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetPersonShoeProp())));
        }
Esempio n. 4
0
        public void AllSelectedIsNotSetIfSelectedIsNotEmpty()
        {
            var expandTree  = new SelectExpandClause(new Collection <SelectItem>(), true);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("Name", null, null)
            });

            binder.Bind(selectToken).AllSelected.Should().BeFalse();
        }
Esempio n. 5
0
        public void MustFindNonTypeSegmentBeforeTheEndOfTheChain()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>(), false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("Fully.Qualified.Namespace.Employee", null, null)
            });
            var selectExpand = binder.Bind(selectToken);

            selectExpand.SelectedItems.Count().Should().Be(1);
        }
Esempio n. 6
0
        public void NavPropEndPathResultsInNavPropLinkSelectionItem()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>(), false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("MyDog", null, null)
            });
            var result = binder.Bind(selectToken);

            result.SelectedItems.Single().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)));
        }
Esempio n. 7
0
        public void ExistingWildcardPreemptsAnyNewPropertiesAdded()
        {
            var expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new WildcardSelectItem()
            }, false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("Name", null, null)
            });

            binder.Bind(selectToken).SelectedItems.Single().ShouldBeWildcardSelectionItem();
        }
Esempio n. 8
0
        public void WildcardSelectionItemPreemptsStructuralProperties()
        {
            var expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new PathSelectItem(new ODataSelectPath(new PropertySegment(HardCodedTestModel.GetPersonNameProp()))),
            }, false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("*", null, null)
            });

            binder.Bind(selectToken).SelectedItems.Single().ShouldBeWildcardSelectionItem();
        }
Esempio n. 9
0
        public void ExpandWithNoSelectionIsUnchanged()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new ExpandedNavigationSelectItem(
                    new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)),
                    HardCodedTestModel.GetPeopleSet(),
                    new SelectExpandClause(new Collection <SelectItem>(), true))
            }, true);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>());
            var result      = binder.Bind(selectToken);

            result.AllSelected.Should().BeTrue();
            result.SelectedItems.Single().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp())
            .SelectAndExpand.AllSelected.Should().BeTrue();
        }
Esempio n. 10
0
        public void CustomFunctionsThrow()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new ExpandedNavigationSelectItem(
                    new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)),
                    HardCodedTestModel.GetPeopleSet(),
                    new SelectExpandClause(null, false))
            }, true);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("GetCoolPeople", null, null)
            });
            Action bindWithFunctionInSelect = () => binder.Bind(selectToken);

            bindWithFunctionInSelect.ShouldThrow <ODataException>().WithMessage(Strings.MetadataBinder_PropertyNotDeclared(HardCodedTestModel.GetPersonType(), "GetCoolPeople"));
        }
Esempio n. 11
0
        public void MultiLevelPathThrows()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new ExpandedNavigationSelectItem(
                    new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)),
                    HardCodedTestModel.GetPeopleSet(),
                    new SelectExpandClause(new Collection <SelectItem>(), true))
            }, true);
            SelectBinder binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            SelectToken  selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("MyDog", null, new NonSystemToken("Color", null, null))
            });

            Action bindWithMultiLevelPath = () => binder.Bind(selectToken);

            bindWithMultiLevelPath.ShouldThrow <ODataException>().WithMessage(Strings.SelectBinder_MultiLevelPathInSelect);
        }
Esempio n. 12
0
        public void SelectAndExpandTheSameNavPropResolvesToBothTheSelectionAndExpandionAndAllSelectedIsFalse()
        {
            SelectExpandClause expandTree = new SelectExpandClause(
                new Collection <SelectItem>()
            {
                new ExpandedNavigationSelectItem(
                    new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)),
                    HardCodedTestModel.GetPeopleSet(),
                    new SelectExpandClause(new Collection <SelectItem>(), false))
            }, false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("MyDog", null, null)
            });
            var result = binder.Bind(selectToken);

            result.SelectedItems.Single(x => x is ExpandedNavigationSelectItem).ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).SelectAndExpand.AllSelected.Should().BeFalse();
            result.SelectedItems.Single(x => x is PathSelectItem).ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet())));
        }
Esempio n. 13
0
        public void SelectionInStartingExpandIsOverriddenWhereNecessary()
        {
            SelectExpandClause expandTree = new SelectExpandClause(new Collection <SelectItem>()
            {
                new ExpandedNavigationSelectItem(
                    new ODataExpandPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), null)),
                    HardCodedTestModel.GetPeopleSet(),
                    new SelectExpandClause(new Collection <SelectItem>(), false))
            }, false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPersonType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("Name", null, null)
            });
            var result = binder.Bind(selectToken);

            result.SelectedItems.Last().ShouldBePathSelectionItem(new ODataSelectPath(new PropertySegment(HardCodedTestModel.GetPersonNameProp())));
            result.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp())
            .SelectAndExpand.SelectedItems.Should().BeEmpty();
        }
Esempio n. 14
0
        public void WildcardDoesNotPreemptOtherSelectionItems()
        {
            ODataSelectPath coolPeoplePath = new ODataSelectPath(new OperationSegment(new[] { HardCodedTestModel.GetChangeStateAction() }, null));
            ODataSelectPath stuffPath      = new ODataSelectPath(new DynamicPathSegment("stuff"));
            var             expandTree     = new SelectExpandClause(new Collection <SelectItem>()
            {
                new PathSelectItem(coolPeoplePath),
                new PathSelectItem(new ODataSelectPath(new NavigationPropertySegment(HardCodedTestModel.GetPaintingOwnerNavProp(), null))),
                new PathSelectItem(stuffPath),
                new PathSelectItem(new ODataSelectPath(new PropertySegment(HardCodedTestModel.GetPaintingColorsProperty())))
            }, false);
            var binder      = new SelectBinder(HardCodedTestModel.TestModel, HardCodedTestModel.GetPaintingType(), 800, expandTree, DefaultUriResolver, null);
            var selectToken = new SelectToken(new List <PathSegmentToken>()
            {
                new NonSystemToken("*", null, null)
            });
            var item = binder.Bind(selectToken);

            item.SelectedItems.Should().HaveCount(4)
            .And.Contain(x => x is PathSelectItem && x.As <PathSelectItem>().SelectedPath == coolPeoplePath)
            .And.Contain(x => x is PathSelectItem && x.As <PathSelectItem>().SelectedPath == stuffPath)
            .And.Contain(x => x is PathSelectItem && x.As <PathSelectItem>().SelectedPath.LastSegment is NavigationPropertySegment && x.As <PathSelectItem>().SelectedPath.LastSegment.As <NavigationPropertySegment>().NavigationProperty.Name == HardCodedTestModel.GetPaintingOwnerNavProp().Name)
            .And.Contain(x => x is WildcardSelectItem);
        }