/// <summary> /// Invert the all of the paths in an expandToken, such that they are now in the same order as they are present in the /// base url /// </summary> /// <param name="treeToInvert">the tree to invert paths on</param> /// <returns>a new tree with all of its paths inverted</returns> public ExpandToken NormalizePaths(ExpandToken treeToInvert) { // iterate through each expand term token, and reverse the tree in its path property List<ExpandTermToken> updatedTerms = new List<ExpandTermToken>(); foreach (ExpandTermToken term in treeToInvert.ExpandTerms) { PathReverser pathReverser = new PathReverser(); PathSegmentToken reversedPath = term.PathToNavProp.Accept(pathReverser); // we also need to call the select token normalizer for this level to reverse the select paths SelectToken newSelectToken = term.SelectOption; if (term.SelectOption != null) { SelectTreeNormalizer selectTreeNormalizer = new SelectTreeNormalizer(); newSelectToken = selectTreeNormalizer.NormalizeSelectTree(term.SelectOption); } ExpandToken subExpandTree; if (term.ExpandOption != null) { subExpandTree = this.NormalizePaths(term.ExpandOption); } else { subExpandTree = null; } ExpandTermToken newTerm = new ExpandTermToken(reversedPath, term.FilterOption, term.OrderByOptions, term.TopOption, term.SkipOption, term.CountQueryOption, term.LevelsOption, term.SearchOption, newSelectToken, subExpandTree); updatedTerms.Add(newTerm); } return new ExpandToken(updatedTerms); }
public void SingleLevelExpandTermTokenWorks() { ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {expandTermToken}); var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And.SelectAndExpand.AllSelected.Should().BeTrue(); }
public void PropertySetCorrectly() { ExpandTermToken expandTerm1 = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*selectOption*/, null /*expandOption*/); expandTerm1.PathToNavProp.ShouldBeNonSystemToken("stuff"); ExpandTermToken expandTerm2 = new ExpandTermToken(new NonSystemToken("stuff", null, null)); expandTerm2.PathToNavProp.ShouldBeNonSystemToken("stuff"); }
public void BindingOnTreeWithWithMultipleNavPropPathsThrows() { NonSystemToken topLevelSegment = new NonSystemToken("MyDog", null, null); NonSystemToken navProp = new NonSystemToken("MyPeople", null, topLevelSegment); ExpandTermToken expandTerm = new ExpandTermToken(navProp); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {expandTerm}); Action bindTreeWithMultipleNavPropPaths = () => this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); bindTreeWithMultipleNavPropPaths.ShouldThrow<ODataException>() .WithMessage(ODataErrorStrings.ExpandItemBinder_TraversingMultipleNavPropsInTheSamePath); }
public void FilterSetCorrectly() { QueryToken filter = new LiteralToken(1); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), filter, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.FilterOption.ShouldBeLiteralQueryToken(1); }
public void FilterSetCorrectly() { QueryToken filter = new LiteralToken(1); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), filter, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.FilterOption.ShouldBeLiteralQueryToken(1); }
public void EntitySetCorrectlyPopulatedAtEachLevel() { ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null, new ExpandToken(new ExpandTermToken[] { innerExpandTerm })); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm }); var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); var myDogExpandItem = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And; myDogExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetDogsSet()); var myPeopleExpandItem = myDogExpandItem.SelectAndExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()).And; myPeopleExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetPeopleSet()); myPeopleExpandItem.SelectAndExpand.SelectedItems.Should().BeEmpty(); }
public void InnerExpandSetCorrectly() { // Arrange & Act ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("abc", null, null), null, null); ExpandToken expand = new ExpandToken(new[] { innerExpandTerm }); SelectTermToken selectTerm = new SelectTermToken(new NonSystemToken("stuff", null, null), null, expand); // Assert Assert.NotNull(selectTerm.ExpandOption); ExpandTermToken token = Assert.Single(selectTerm.ExpandOption.ExpandTerms); ReferenceEquals(token.PathToNavigationProp, token.PathToProperty); Assert.Equal("abc", token.PathToProperty.Identifier); }
public void SkipSetCorrectly() { long skip = 1; ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, skip, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.SkipOption.Should().Be(1); }
public void NestedAggregateTransformationInExpandIsAllowed() { // Arrange & Act ExpandTermToken expandTerm = this.ParseExpandOptions("($apply=aggregate(Amount with sum as Total))"); // Assert Assert.NotNull(expandTerm); Assert.NotNull(expandTerm.ApplyOptions); QueryToken token = Assert.Single(expandTerm.ApplyOptions); AggregateToken aggregate = Assert.IsType <AggregateToken>(token); AggregateExpressionToken aggregateExpressionToken = Assert.Single(aggregate.Expressions); Assert.Equal("Total", aggregateExpressionToken.Alias); Assert.Equal(AggregationMethod.Sum, aggregateExpressionToken.Method); aggregateExpressionToken.Expression.ShouldBeEndPathToken("Amount"); }
public void ComputeSetCorrectly() { ComputeToken compute = new ComputeToken(new ComputeExpressionToken[] { }); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/, compute); expandTerm.ComputeOption.Should().BeSameAs(compute); }
public void DeepNestedExpandsAreAllowed(string optionText) { // Arrange & Act ExpandTermToken expandTerm = this.ParseExpandOptions(optionText); // Assert Assert.NotNull(expandTerm); Assert.NotNull(expandTerm.ExpandOption); ExpandTermToken two = Assert.Single(expandTerm.ExpandOption.ExpandTerms); two.PathToNavigationProp.ShouldBeNonSystemToken("two"); ExpandTermToken three = Assert.Single(two.ExpandOption.ExpandTerms); three.PathToNavigationProp.ShouldBeNonSystemToken("three"); }
/// <summary> /// Combine together the select clauses of two ExpandTermTokens /// </summary> /// <param name="existingToken">the already existing expand term token</param> /// <param name="newToken">the new expand term token to be added</param> /// <returns>A new select term containing each of the selected entries.</returns> private SelectToken CombineSelects(ExpandTermToken existingToken, ExpandTermToken newToken) { if (existingToken.SelectOption == null) { return(newToken.SelectOption); } if (newToken.SelectOption == null) { return(existingToken.SelectOption); } List <PathSegmentToken> newSelects = existingToken.SelectOption.Properties.ToList(); newSelects.AddRange(newToken.SelectOption.Properties); return(new SelectToken(newSelects.Distinct(new PathSegmentTokenEqualityComparer()))); }
public void SelectSetCorrectly() { SelectToken select = new SelectToken(new PathSegmentToken[] { new NonSystemToken("1", null, null) }); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, select, null /*expandOption*/); expandTerm.SelectOption.Properties.Count().Should().Be(1); expandTerm.SelectOption.Properties.ElementAt(0).ShouldBeNonSystemToken("1"); }
public void OrderBySetCorrectly() { OrderByToken orderBy = new OrderByToken(new LiteralToken(1), OrderByDirection.Descending); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, new OrderByToken[] { orderBy }, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.OrderByOptions.Single().Kind.Should().Be(QueryTokenKind.OrderBy); expandTerm.OrderByOptions.Single().Expression.ShouldBeLiteralQueryToken(1); }
public void LowerLevelEmptySelectedItemsListDoesNotThrow() { // Arrange ExpandToken lowerLevelExpand = new ExpandToken(new List <ExpandTermToken>()); ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", /*namedValues*/ null, /*nextToken*/ null), null, lowerLevelExpand); ExpandToken topLevelExpand = new ExpandToken(new List <ExpandTermToken>() { topLevelExpandTermToken }); // Act Action bindWithEmptySelectedItemsList = () => BinderForPerson.Bind(topLevelExpand, null); // Assert var ex = Record.Exception(bindWithEmptySelectedItemsList); Assert.Null(ex); }
public void ParseApplyWithFilteredExpandShouldParseSuccessfully() { string apply = "expand(Sales, filter(Amount gt 3))"; IEnumerable <QueryToken> actual = this.testSubject.ParseApply(apply); Assert.NotNull(actual); Assert.Single(actual); ExpandToken expand = (ExpandToken)actual.First(); Assert.Single(expand.ExpandTerms); ExpandTermToken expandTerm = expand.ExpandTerms.First(); Assert.Equal(QueryTokenKind.ExpandTerm, expandTerm.Kind); Assert.Equal("Sales", expandTerm.PathToNavigationProp.Identifier); Assert.NotNull(expandTerm.FilterOption); }
public void ApplySetCorrectly() { IEnumerable <QueryToken> applyOptions = new QueryToken[] { }; ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/, null /*computeOption*/, applyOptions /*applyOptions*/); Assert.Same(expandTerm.ApplyOptions, applyOptions); }
public void AllNestedOptionsAreNullIfNotPresentInExpand() { // Arrange & Act ExpandTermToken expandTerm = this.ParseExpandOptions(""); // Assert Assert.NotNull(expandTerm); Assert.Null(expandTerm.FilterOption); Assert.Null(expandTerm.TopOption); Assert.Null(expandTerm.SkipOption); Assert.Null(expandTerm.OrderByOptions); Assert.Null(expandTerm.SelectOption); Assert.Null(expandTerm.ExpandOption); Assert.Null(expandTerm.LevelsOption); Assert.Null(expandTerm.SearchOption); Assert.Null(expandTerm.ComputeOption); Assert.Null(expandTerm.ApplyOptions); }
public void NestedComputeInExpandIsAllowed(string optionsText) { // Arrange & Act ExpandTermToken expandTerm = this.ParseExpandOptions(optionsText); // Assert Assert.NotNull(expandTerm); Assert.NotNull(expandTerm.ComputeOption); Assert.NotNull(expandTerm.ComputeOption.Expressions); ComputeExpressionToken computeExpressionToken = Assert.Single(expandTerm.ComputeOption.Expressions); Assert.Equal("TotalPrice", computeExpressionToken.Alias); BinaryOperatorToken binaryOperatorToken = computeExpressionToken.Expression.ShouldBeBinaryOperatorQueryToken(BinaryOperatorKind.Multiply); binaryOperatorToken.Left.ShouldBeEndPathToken("Price"); binaryOperatorToken.Right.ShouldBeEndPathToken("Qty"); }
public void SingleLevelExpandTermTokenWorks() { // Arrange ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { expandTermToken }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, null); // Arrange Assert.NotNull(clause); SelectItem selectItem = Assert.Single(clause.SelectedItems); ExpandedNavigationSelectItem expandedItem = selectItem.ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); Assert.NotNull(expandedItem); Assert.NotNull(expandedItem.SelectAndExpand); }
public void ParseApplyWithFilteredExpandShouldParseSuccessfully() { string apply = "expand(Sales, filter(Amount gt 3))"; IEnumerable <QueryToken> actual = this.testSubject.ParseApply(apply); actual.Should().NotBeNull(); actual.Should().HaveCount(1); ExpandToken expand = (ExpandToken)actual.First(); expand.ExpandTerms.Should().HaveCount(1); ExpandTermToken expandTerm = expand.ExpandTerms.First(); expandTerm.Kind.ShouldBeEquivalentTo(QueryTokenKind.ExpandTerm); expandTerm.PathToNavigationProp.Identifier.ShouldBeEquivalentTo("Sales"); expandTerm.FilterOption.Should().NotBeNull(); }
public void SearchSetCorrectly() { // Arrange & Act ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, new StringLiteralToken("searchMe") /*searchOption*/, null /*selectOption*/, null /*expandOption*/); // Assert Assert.NotNull(expandTerm.SearchOption); expandTerm.SearchOption.ShouldBeStringLiteralToken("searchMe"); }
public void InvertPathsActuallyInvertsPaths() { // Arrange: $expand=1/2 ExpandToken expand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, new NonSystemToken("1", null, null))) }); // Act ExpandToken invertedPaths = ExpandTreeNormalizer.NormalizePaths(expand); // Assert Assert.NotNull(invertedPaths); ExpandTermToken term = Assert.Single(invertedPaths.ExpandTerms).ShouldBeExpandTermToken("1", false); Assert.NotNull(term.PathToNavigationProp.NextToken); term.PathToNavigationProp.NextToken.ShouldBeNonSystemToken("2"); }
public void CombineChildNodesWorksForTwoPopulatedNodes() { // $expand=1($expand=2), 1($expand=3) ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null)); ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 }); ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand1); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null)); ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 }); ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand2); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); IEnumerable <ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2); combinedChildren.Should().Contain(innerExpandTerm1).And.Contain(innerExpandTerm2); }
public void AddTermsWorksForOneLevelBelow() { // $expand=1($expand=2;), 1($expand=3;) ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null)); ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 }); ExpandTermToken outerToken1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand1); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null)); ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 }); ExpandTermToken outerToken2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand2); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); var addedToken = expandTreeNormalizer.CombineTerms(outerToken1, outerToken2); addedToken.ShouldBeExpandTermToken("1", true).ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2).And.Contain(innerExpandTerm1); }
public void LevelsSetCorrectly() { // Arrange & Act ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, 3 /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); // Assert Assert.NotNull(expandTerm.LevelsOption); Assert.Equal(3, expandTerm.LevelsOption); }
public void AllNestedQueryOptionsInSelectAreAllowed() { // Arrange & Act SelectTermToken selectTerm = this.ParseSelectOptions("($select=one($select=subone);$filter=true;$count=true;$top=1;$skip=2;$expand=two($expand=three))"); // Assert Assert.NotNull(selectTerm); // $select Assert.NotNull(selectTerm.SelectOption); SelectTermToken innerSelectTerms = Assert.Single(selectTerm.SelectOption.SelectTerms); innerSelectTerms.PathToProperty.ShouldBeNonSystemToken("one"); SelectTermToken innerInnerSelectTerms = Assert.Single(innerSelectTerms.SelectOption.SelectTerms); innerInnerSelectTerms.PathToProperty.ShouldBeNonSystemToken("subone"); // $filter Assert.NotNull(selectTerm.FilterOption); selectTerm.FilterOption.ShouldBeLiteralQueryToken(true); // $count Assert.NotNull(selectTerm.CountQueryOption); Assert.True(selectTerm.CountQueryOption); // $top Assert.NotNull(selectTerm.TopOption); Assert.Equal(1, selectTerm.TopOption); // $skip Assert.NotNull(selectTerm.SkipOption); Assert.Equal(2, selectTerm.SkipOption); // $expand Assert.NotNull(selectTerm.ExpandOption); ExpandTermToken two = Assert.Single(selectTerm.ExpandOption.ExpandTerms); two.PathToNavigationProp.ShouldBeNonSystemToken("two"); ExpandTermToken three = Assert.Single(two.ExpandOption.ExpandTerms); three.PathToNavigationProp.ShouldBeNonSystemToken("three"); }
public void ComputeSetCorrectly() { // Arrange & Act ComputeToken compute = new ComputeToken(new ComputeExpressionToken[] { }); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/, compute); // Assert Assert.Same(expandTerm.ComputeOption, compute); }
/// <summary> /// add a new expandTermToken into an exisiting token, adding any additional levels and trees along the way. /// </summary> /// <param name="existingToken">the exisiting (already expanded) token</param> /// <param name="newToken">the new (already expanded) token</param> /// <returns>the combined token, or, if the two are mutually exclusive, the same tokens</returns> public ExpandTermToken CombineTerms(ExpandTermToken existingToken, ExpandTermToken newToken) { Debug.Assert(new PathSegmentTokenEqualityComparer().Equals(existingToken.PathToNavProp, newToken.PathToNavProp), "Paths should be equal."); List <ExpandTermToken> childNodes = CombineChildNodes(existingToken, newToken).ToList(); SelectToken combinedSelects = this.CombineSelects(existingToken, newToken); return(new ExpandTermToken( existingToken.PathToNavProp, existingToken.FilterOption, existingToken.OrderByOptions, existingToken.TopOption, existingToken.SkipOption, existingToken.CountQueryOption, existingToken.LevelsOption, existingToken.SearchOption, combinedSelects, new ExpandToken(childNodes))); }
public void AddTermsDoesNothingForIdenticalTrees() { // Arrange: $expand=1($expand=2;) ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, null)) }); ExpandTermToken outerExpandToken = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand); // Act ExpandTermToken addedToken = ExpandTreeNormalizer.CombineTerms(outerExpandToken, outerExpandToken); // Assert Assert.NotNull(addedToken); addedToken.ShouldBeExpandTermToken("1", true); Assert.Single(addedToken.ExpandOption.ExpandTerms).ShouldBeExpandTermToken("2", true); }
public void SelectedAndExpandedNavPropProduceExpandedNavPropSelectionItemAndPathSelectionItem() { // Arrange: $select=MyDog&$expand=MyDog ExpandTermToken innerExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { innerExpandTermToken }); SelectTermToken innerSelectTermToken = new SelectTermToken(new NonSystemToken("MyDog", null, null)); SelectToken selectToken = new SelectToken(new SelectTermToken[] { innerSelectTermToken }); // Act SelectExpandClause clause = BinderForPerson.Bind(expandToken, selectToken); // Assert Assert.NotNull(clause); Assert.False(clause.AllSelected); Assert.Equal(2, clause.SelectedItems.Count()); clause.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); clause.SelectedItems.Last().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet()))); }
public void NestedStarExpand() { // Arrange & Act ExpandToken expandToken = this.StarExpandTesting("Friend($expand=*)", "Persons"); // Assert Assert.NotNull(expandToken); ExpandTermToken expandTermToken = Assert.Single(expandToken.ExpandTerms); // Depth 0 expandTermToken.PathToNavigationProp.ShouldBeNonSystemToken("Friend"); Assert.Null(expandTermToken.PathToNavigationProp.NextToken); // Depth 1 Assert.NotNull(expandTermToken.ExpandOption); ExpandTermToken nestedExpandTermToken = Assert.Single(expandTermToken.ExpandOption.ExpandTerms); nestedExpandTermToken.PathToNavigationProp.ShouldBeNonSystemToken("Friend"); Assert.Null(nestedExpandTermToken.PathToNavigationProp.NextToken); }
public void NormalizeTreeWorksWhenPathsHaveArguments() { // Arrange: $expand=1(name=value) ExpandToken expand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("1", new NamedValue[] { new NamedValue("name", new LiteralToken("value")) }, null)) }); // Act ExpandToken normalizedExpand = ExpandTreeNormalizer.NormalizeExpandTree(expand); // Assert Assert.NotNull(normalizedExpand); ExpandTermToken term = Assert.Single(normalizedExpand.ExpandTerms).ShouldBeExpandTermToken("1", true); NonSystemToken token = Assert.IsType <NonSystemToken>(term.PathToNavigationProp); Assert.Single(token.NamedValues).ShouldBeNamedValue("name", "value"); Assert.Null(term.ExpandOption); }
/// <summary> /// Combine the child nodes of twoExpandTermTokens into one list of tokens /// </summary> /// <param name="existingToken">the existing token to to</param> /// <param name="newToken">the new token containing terms to add</param> /// <returns>a combined list of the all child nodes of the two tokens.</returns> public IEnumerable <ExpandTermToken> CombineChildNodes(ExpandTermToken existingToken, ExpandTermToken newToken) { if (existingToken.ExpandOption == null && newToken.ExpandOption == null) { return(new List <ExpandTermToken>()); } var childNodes = new Dictionary <PathSegmentToken, ExpandTermToken>(new PathSegmentTokenEqualityComparer()); if (existingToken.ExpandOption != null) { AddChildOptionsToDictionary(existingToken, childNodes); } if (newToken.ExpandOption != null) { AddChildOptionsToDictionary(newToken, childNodes); } return(childNodes.Values); }
public void ExpansionsCanBeNull() { ExpandTermToken expandTermToken = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTermToken.FilterOption.Should().BeNull(); expandTermToken.OrderByOptions.Should().BeNull(); expandTermToken.TopOption.Should().Be(null); expandTermToken.SkipOption.Should().Be(null); expandTermToken.CountQueryOption.Should().Be(null); expandTermToken.LevelsOption.Should().Be(null); expandTermToken.SearchOption.Should().Be(null); expandTermToken.SelectOption.Should().BeNull(); expandTermToken.ExpandOption.Should().BeNull(); }
public void SearchSetCorrectly() { ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, new StringLiteralToken("searchMe") /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.SearchOption.ShouldBeStringLiteralToken("searchMe"); }
public void MultiLevelExpandTermTokenWorks() { ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null, new ExpandToken(new ExpandTermToken[] {innerExpandTerm})); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {outerExpandTerm}); var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); var subSelectExpand = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And.SelectAndExpand; subSelectExpand.AllSelected.Should().BeTrue(); subSelectExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()) .And.SelectAndExpand.AllSelected.Should().BeTrue(); }
public void CombineChildNodesWorksForTwoPopulatedNodes() { // $expand=1($expand=2), 1($expand=3) ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null)); ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 }); ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand1); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null)); ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 }); ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand2); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2); combinedChildren.Should().Contain(innerExpandTerm1).And.Contain(innerExpandTerm2); }
public void CombineChildNodesWorksForTwoEmptyNodes() { // $expand=1 ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("1", null, null)); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(expandTerm, expandTerm); combinedChildren.Count().Should().Be(0); }
public void AddTermsWorksAtDeepLevel() { // $expand=1($expand=2($expand=3;);), 1($expand=2($expand=0;);) ExpandTermToken innerInnerExpandTerm1 = new ExpandTermToken(new NonSystemToken("3", null, null)); ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerInnerExpandTerm1 })); ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 })); ExpandTermToken innerInnerExpandTerm2 = new ExpandTermToken(new NonSystemToken("0", null, null)); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("2", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerInnerExpandTerm2 })); ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 })); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); var addedToken = expandTreeNormalizer.CombineTerms(outerExpandTerm1, outerExpandTerm2); addedToken.ShouldBeExpandTermToken("1", true) .And.ExpandOption.ExpandTerms.Single().ShouldBeExpandTermToken("2", true) .And.ExpandOption.ExpandTerms.Should().Contain(innerInnerExpandTerm1) .And.Contain(innerInnerExpandTerm2); }
public void AddTermsDoesNothingForIdenticalTrees() { // $expand=1($expand=2;) ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, null)) }); ExpandTermToken outerExpandToken = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); var addedToken = expandTreeNormalizer.CombineTerms(outerExpandToken, outerExpandToken); addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Single().ShouldBeExpandTermToken("2", true); }
public void SelectSetCorrectly() { SelectToken select = new SelectToken(new PathSegmentToken[] { new NonSystemToken("1", null, null) }); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, select, null /*expandOption*/); expandTerm.SelectOption.Properties.Count().Should().Be(1); expandTerm.SelectOption.Properties.ElementAt(0).ShouldBeNonSystemToken("1"); }
public void CanSelectPropertyOnNonEntityType() { ExpandTermToken expandTermToken = new ExpandTermToken(new SystemToken(ExpressionConstants.It, null), new SelectToken(new List<PathSegmentToken>(){new NonSystemToken("City", null, null)}), null ); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { expandTermToken }); var item = this.binderForAddress.Bind(expandToken); item.SelectedItems.Single().ShouldBePathSelectionItem(new ODataPath(new PropertySegment(HardCodedTestModel.GetAddressCityProperty()))); }
public void LowerLevelEmptySelectedItemsListDoesNotThrow() { ExpandToken lowerLevelExpand = new ExpandToken(new List<ExpandTermToken>()); ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", /*namedValues*/null, /*nextToken*/null), null, lowerLevelExpand); ExpandToken topLevelExpand = new ExpandToken(new List<ExpandTermToken>(){topLevelExpandTermToken}); Action bindWithEmptySelectedItemsList = () => this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(topLevelExpand)); bindWithEmptySelectedItemsList.ShouldNotThrow(); }
/// <summary> /// Collapse all redundant terms in an expand tree /// </summary> /// <param name="treeToCollapse">the tree to collapse</param> /// <returns>A new tree with all redundant terms collapsed.</returns> public ExpandToken CombineTerms(ExpandToken treeToCollapse) { var combinedTerms = new Dictionary<PathSegmentToken, ExpandTermToken>(new PathSegmentTokenEqualityComparer()); foreach (ExpandTermToken termToken in treeToCollapse.ExpandTerms) { ExpandTermToken finalTermToken = termToken; if (termToken.ExpandOption != null) { ExpandToken newSubExpand = CombineTerms(termToken.ExpandOption); finalTermToken = new ExpandTermToken( termToken.PathToNavProp, termToken.FilterOption, termToken.OrderByOptions, termToken.TopOption, termToken.SkipOption, termToken.CountQueryOption, termToken.LevelsOption, termToken.SearchOption, RemoveDuplicateSelect(termToken.SelectOption), newSubExpand); } AddOrCombine(combinedTerms, finalTermToken); } return new ExpandToken(combinedTerms.Values); }
public void ExpandSetCorrectly() { ExpandToken expand = new ExpandToken(new ExpandTermToken[]{new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*selectOption*/, null /*expandOption*/ )}); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*selectOption*/, expand); expandTerm.ExpandOption.Should().NotBeNull(); }
/// <summary> /// Combine together the select clauses of two ExpandTermTokens /// </summary> /// <param name="existingToken">the already existing expand term token</param> /// <param name="newToken">the new expand term token to be added</param> /// <returns>A new select term containing each of the selected entries.</returns> private static SelectToken CombineSelects(ExpandTermToken existingToken, ExpandTermToken newToken) { if (existingToken.SelectOption == null) { return newToken.SelectOption; } if (newToken.SelectOption == null) { return existingToken.SelectOption; } List<PathSegmentToken> newSelects = existingToken.SelectOption.Properties.ToList(); newSelects.AddRange(newToken.SelectOption.Properties); return new SelectToken(newSelects.Distinct(new PathSegmentTokenEqualityComparer())); }
/// <summary> /// Add child options to a new dictionary /// </summary> /// <param name="newToken">the token with child nodes to add to the dictionary</param> /// <param name="combinedTerms">dictionary to add child nodes to</param> private void AddChildOptionsToDictionary(ExpandTermToken newToken, Dictionary<PathSegmentToken, ExpandTermToken> combinedTerms) { foreach (ExpandTermToken expandedTerm in newToken.ExpandOption.ExpandTerms) { AddOrCombine(combinedTerms, expandedTerm); } }
/// <summary> /// Adds the expand token to the dictionary or combines it with an existing or combines it with another existing token with an equivalent path. /// </summary> /// <param name="combinedTerms">The combined terms dictionary.</param> /// <param name="expandedTerm">The expanded term to add or combine.</param> private void AddOrCombine(IDictionary<PathSegmentToken, ExpandTermToken> combinedTerms, ExpandTermToken expandedTerm) { ExpandTermToken existingTerm; if (combinedTerms.TryGetValue(expandedTerm.PathToNavProp, out existingTerm)) { combinedTerms[expandedTerm.PathToNavProp] = CombineTerms(expandedTerm, existingTerm); } else { combinedTerms.Add(expandedTerm.PathToNavProp, expandedTerm); } }
public void OrderBySetCorrectly() { OrderByToken orderBy = new OrderByToken(new LiteralToken(1), OrderByDirection.Descending); ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, new OrderByToken[] { orderBy }, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.OrderByOptions.Single().Kind.Should().Be(QueryTokenKind.OrderBy); expandTerm.OrderByOptions.Single().Expression.ShouldBeLiteralQueryToken(1); }
public void SelectedAndExpandedNavPropProduceExpandedNavPropSelectionItemAndPathSelectionItem() { ExpandTermToken innerExpandTermToken = new ExpandTermToken(new NonSystemToken("MyDog", null, null)); ExpandToken innerExpandToken = new ExpandToken(new ExpandTermToken[] { innerExpandTermToken }); ExpandTermToken topLevelExpandTermToken = new ExpandTermToken(new SystemToken(ExpressionConstants.It, /*nextToken*/null), new SelectToken(new List<PathSegmentToken>(){new NonSystemToken("MyDog", /*namedValues*/null, /*nextToken*/null)}), innerExpandToken); ExpandToken topLevelExpandToken = new ExpandToken(new ExpandTermToken[]{topLevelExpandTermToken}); var item = this.binderForPerson.Bind(topLevelExpandToken); item.SelectedItems.Should().HaveCount(2); item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()); item.SelectedItems.Last().ShouldBePathSelectionItem(new ODataPath(new NavigationPropertySegment(HardCodedTestModel.GetPersonMyDogNavProp(), HardCodedTestModel.GetPeopleSet()))); }
public void AddTermsWorksForOneLevelBelow() { // $expand=1($expand=2;), 1($expand=3;) ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null)); ExpandToken innerExpand1 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm1 }); ExpandTermToken outerToken1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand1); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("3", null, null)); ExpandToken innerExpand2 = new ExpandToken(new ExpandTermToken[] { innerExpandTerm2 }); ExpandTermToken outerToken2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand2); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); var addedToken = expandTreeNormalizer.CombineTerms(outerToken1, outerToken2); addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2).And.Contain(innerExpandTerm1); }
public void EntitySetCorrectlyPopulatedAtEachLevel() { ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), null, new ExpandToken(new ExpandTermToken[] { innerExpandTerm })); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] { outerExpandTerm }); var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); var myDogExpandItem = item.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()).And; myDogExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetDogsSet()); var myPeopleExpandItem = myDogExpandItem.SelectAndExpand.SelectedItems.First().ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()).And; myPeopleExpandItem.NavigationSource.Should().Be(HardCodedTestModel.GetPeopleSet()); myPeopleExpandItem.SelectAndExpand.SelectedItems.Should().BeEmpty(); }
public void AddTermsWorksForNestedMultipleTerms() { // $expand=1($expand=2($expand=5;),4;), 1($expand=2($expand=0;);) ExpandTermToken innerExpandTerm1 = new ExpandTermToken(new NonSystemToken("2", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("5", null, null)) })); ExpandTermToken innerExpandTerm2 = new ExpandTermToken(new NonSystemToken("4", null, null)); ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerExpandTerm1, innerExpandTerm2 })); ExpandTermToken innerExpandTerm3 = new ExpandTermToken(new NonSystemToken("2", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("0", null, null)) })); ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, new ExpandToken(new ExpandTermToken[] { innerExpandTerm3 })); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); var addedToken = expandTreeNormalizer.CombineTerms(outerExpandTerm1, outerExpandTerm2); addedToken.ShouldBeExpandTermToken("1", true).And.ExpandOption.ExpandTerms.Should().Contain(innerExpandTerm2); ExpandTermToken twoToken = addedToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "2"); twoToken.ShouldBeExpandTermToken("2", true); ExpandTermToken fiveToken = twoToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "5"); ExpandTermToken zeroToken = twoToken.ExpandOption.ExpandTerms.FirstOrDefault(x => x.PathToNavProp.Identifier == "0"); fiveToken.ShouldBeExpandTermToken("5", true); zeroToken.ShouldBeExpandTermToken("0", true); }
public void SkipSetCorrectly() { long skip = 1; ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, skip, null /*countQueryOption*/, null /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.SkipOption.Should().Be(1); }
public void CombineChildNodesWorksForSingleEmptyNode() { // $expand=1($expand=2;), 1 ExpandToken innerExpand = new ExpandToken(new ExpandTermToken[] { new ExpandTermToken(new NonSystemToken("2", null, null)) }); ExpandTermToken outerExpandTerm1 = new ExpandTermToken(new NonSystemToken("1", null, null), null /*selectOption*/, innerExpand); ExpandTermToken outerExpandTerm2 = new ExpandTermToken(new NonSystemToken("1", null, null)); ExpandTreeNormalizer expandTreeNormalizer = new ExpandTreeNormalizer(); IEnumerable<ExpandTermToken> combinedChildren = expandTreeNormalizer.CombineChildNodes(outerExpandTerm1, outerExpandTerm2); combinedChildren.Single().ShouldBeExpandTermToken("2", false); }
public void LevelsSetCorrectly() { ExpandTermToken expandTerm = new ExpandTermToken(new NonSystemToken("stuff", null, null), null /*filterOption*/, null /*orderByOption*/, null /*topOption*/, null /*skipOption*/, null /*countQueryOption*/, 3 /*levelsOption*/, null /*searchOption*/, null /*selectOption*/, null /*expandOption*/); expandTerm.LevelsOption.Should().Be(3); }
public void SelectIsBasedOnTheCurrentLevel() { ExpandTermToken innerExpandTerm = new ExpandTermToken(new NonSystemToken("MyPeople", null, null)); ExpandTermToken outerExpandTerm = new ExpandTermToken(new NonSystemToken("MyDog", null, null), new SelectToken(new List<PathSegmentToken>() { new NonSystemToken("Color", null, null) }), new ExpandToken(new ExpandTermToken[] {innerExpandTerm})); ExpandToken expandToken = new ExpandToken(new ExpandTermToken[] {outerExpandTerm}); var item = this.binderForPerson.Bind(BuildUnifiedSelectExpandToken(expandToken)); var subExpand = item.SelectedItems.First() .ShouldBeExpansionFor(HardCodedTestModel.GetPersonMyDogNavProp()) .And.SelectAndExpand; subExpand.AllSelected.Should().BeFalse(); subExpand.SelectedItems.Single(x => x is ExpandedNavigationSelectItem).ShouldBeExpansionFor(HardCodedTestModel.GetDogMyPeopleNavProp()) .And.SelectAndExpand.AllSelected.Should().BeTrue(); subExpand.SelectedItems.Last(x => x is PathSelectItem).ShouldBePathSelectionItem(new ODataPath( new PropertySegment(HardCodedTestModel.GetDogColorProp()))); }
/// <summary> /// Combine a top level select and expand token /// </summary> /// <param name="expand">the original expand token</param> /// <param name="select">the original select token</param> /// <returns>A new ExpandToken with the original select token embedded within a new top level expand token.</returns> public static ExpandToken Combine(ExpandToken expand, SelectToken select) { // build a new top level expand token embedding the top level select token. ExpandTermToken newTopLevelExpandTerm = new ExpandTermToken(new SystemToken(ExpressionConstants.It, null), select, expand); return new ExpandToken(new List<ExpandTermToken>() { newTopLevelExpandTerm }); }