public void BindApplyWitMultipleTokensShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply( "groupby((ID, SSN, LifeTime))/aggregate(LifeTime with sum as TotalLife)/groupby((TotalLife))/aggregate(TotalLife with sum as TotalTotalLife)"); BindingState state = new BindingState(_configuration); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(4); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode firstGroupBy = transformations[0] as GroupByTransformationNode; firstGroupBy.Should().NotBeNull(); TransformationNode firstAggregate = transformations[1] as AggregateTransformationNode; firstAggregate.Should().NotBeNull(); TransformationNode scecondGroupBy = transformations[2] as GroupByTransformationNode; scecondGroupBy.Should().NotBeNull(); AggregateTransformationNode scecondAggregate = transformations[3] as AggregateTransformationNode; scecondAggregate.Should().NotBeNull(); }
public void BindApplyWithEntitySetAggregationReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply( "groupby((LifeTime),aggregate(MyPaintings($count as Count)))"); BindingState state = new BindingState(_configuration); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); GroupByTransformationNode groupBy = actual.Transformations.First() as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); AggregateTransformationNode aggregate = groupBy.ChildTransformations as AggregateTransformationNode; aggregate.Should().NotBeNull(); aggregate.AggregateExpressions.Should().HaveCount(1); EntitySetAggregateExpression entitySetAggregate = aggregate.AggregateExpressions.First() as EntitySetAggregateExpression; entitySetAggregate.Should().NotBeNull(); }
public void BindApplyWitGroupByShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((UnitPrice, SalePrice))"); ApplyBinder binder = new ApplyBinder(FakeBindMethods.BindSingleComplexProperty, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(2); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); VerifyIsFakeSingleValueNode(groupingProperties[0].Expression); VerifyIsFakeSingleValueNode(groupingProperties[1].Expression); groupBy.ChildTransformations.Should().BeNull(); }
public void BindApplyWitGroupByWithNavigationShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((MyDog/City))"); ApplyBinder binder = new ApplyBinder(FakeBindMethods.BindMethodReturnsPersonDogNameNavigation, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); GroupByPropertyNode dogNode = groupingProperties[0]; dogNode.Expression.Should().BeNull(); dogNode.Name.Should().Be("MyDog"); dogNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode nameNode = dogNode.ChildTransformations[0]; dogNode.Name.Should().Be("MyDog"); nameNode.Expression.Should().BeSameAs(FakeBindMethods.FakePersonDogNameNode); groupBy.ChildTransformations.Should().BeNull(); }
public void BindApplyWitGroupByWithComplexShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((MyAddress/City))"); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); Assert.NotNull(actual); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); groupBy.ChildTransformations.Should().BeNull(); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); GroupByPropertyNode addressNode = groupingProperties[0]; addressNode.Name.Should().Be("MyAddress"); addressNode.Expression.Should().BeNull(); addressNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode cityNode = addressNode.ChildTransformations[0]; cityNode.Name.Should().Be("City"); cityNode.Expression.Should().NotBeNull(); cityNode.ChildTransformations.Should().BeEmpty(); }
public void BindApplyWitGroupByWithNavigationAndDeepComplexAndNavigationShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((MyFavoritePainting/ArtistAddress/NextHome/PostBoxPainting/Artist))"); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); groupBy.ChildTransformations.Should().BeNull(); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); GroupByPropertyNode favoritePaintingNode = groupingProperties[0]; favoritePaintingNode.Name.Should().Be("MyFavoritePainting"); favoritePaintingNode.Expression.Should().BeNull(); favoritePaintingNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode artistAddressNode = favoritePaintingNode.ChildTransformations[0]; artistAddressNode.Name.Should().Be("ArtistAddress"); artistAddressNode.Expression.Should().BeNull(); artistAddressNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode nextHomeNode = artistAddressNode.ChildTransformations[0]; nextHomeNode.Name.Should().Be("NextHome"); nextHomeNode.Expression.Should().BeNull(); nextHomeNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode postBoxPaintingNode = nextHomeNode.ChildTransformations[0]; postBoxPaintingNode.Name.Should().Be("PostBoxPainting"); postBoxPaintingNode.Expression.Should().BeNull(); postBoxPaintingNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode artistNode = postBoxPaintingNode.ChildTransformations[0]; artistNode.Name.Should().Be("Artist"); artistNode.Expression.Should().NotBeNull(); artistNode.ChildTransformations.Should().BeEmpty(); }
public void BindApplyWitGroupByWithDeepNavigationAndComplexShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((MyDog/LionWhoAteMe/LionHeartbeat/Frequency))"); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); groupBy.ChildTransformations.Should().BeNull(); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); GroupByPropertyNode dogNode = groupingProperties[0]; dogNode.Name.Should().Be("MyDog"); dogNode.Expression.Should().BeNull(); dogNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode lionNode = dogNode.ChildTransformations[0]; lionNode.Name.Should().Be("LionWhoAteMe"); lionNode.Expression.Should().BeNull(); lionNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode heartBeatNode = lionNode.ChildTransformations[0]; heartBeatNode.Name.Should().Be("LionHeartbeat"); heartBeatNode.Expression.Should().BeNull(); heartBeatNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode frequencyNode = heartBeatNode.ChildTransformations[0]; frequencyNode.Name.Should().Be("Frequency"); frequencyNode.Expression.Should().NotBeNull(); frequencyNode.ChildTransformations.Should().BeEmpty(); }
public void BindApplyWithExpandReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply( "expand(MyPaintings, filter(FrameColor eq 'Red'))/groupby((LifeTime),aggregate(MyPaintings($count as Count)))"); BindingState state = new BindingState(_configuration); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState, V4configuration, new ODataPathInfo(HardCodedTestModel.GetPersonType(), HardCodedTestModel.GetPeopleSet())); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(2); ExpandTransformationNode expand = actual.Transformations.First() as ExpandTransformationNode; expand.Should().NotBeNull(); expand.ExpandClause.Should().NotBeNull(); expand.ExpandClause.SelectedItems.Should().HaveCount(1); ExpandedNavigationSelectItem expandItem = expand.ExpandClause.SelectedItems.First() as ExpandedNavigationSelectItem; expandItem.Should().NotBeNull(); expandItem.NavigationSource.Name.ShouldBeEquivalentTo("Paintings"); expandItem.FilterOption.Should().NotBeNull(); GroupByTransformationNode groupBy = actual.Transformations.Last() as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); AggregateTransformationNode aggregate = groupBy.ChildTransformations as AggregateTransformationNode; aggregate.Should().NotBeNull(); aggregate.AggregateExpressions.Should().HaveCount(1); EntitySetAggregateExpression entitySetAggregate = aggregate.AggregateExpressions.First() as EntitySetAggregateExpression; entitySetAggregate.Should().NotBeNull(); }
public void BindApplyWitGroupByWithDeepNavigationShouldReturnApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply("groupby((MyDog/FastestOwner/FirstName))"); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(1); List <TransformationNode> transformations = actual.Transformations.ToList(); GroupByTransformationNode groupBy = transformations[0] as GroupByTransformationNode; groupBy.Should().NotBeNull(); groupBy.Kind.Should().Be(TransformationNodeKind.GroupBy); groupBy.GroupingProperties.Should().NotBeNull(); groupBy.GroupingProperties.Should().HaveCount(1); groupBy.ChildTransformations.Should().BeNull(); List <GroupByPropertyNode> groupingProperties = groupBy.GroupingProperties.ToList(); GroupByPropertyNode dogNode = groupingProperties[0]; dogNode.Name.Should().Be("MyDog"); dogNode.Expression.Should().BeNull(); dogNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode ownerNode = dogNode.ChildTransformations[0]; ownerNode.Name.Should().Be("FastestOwner"); ownerNode.Expression.Should().BeNull(); ownerNode.ChildTransformations.Should().HaveCount(1); GroupByPropertyNode nameNode = ownerNode.ChildTransformations[0]; nameNode.Name.Should().Be("FirstName"); nameNode.Expression.Should().NotBeNull(); nameNode.ChildTransformations.Should().BeEmpty(); }
public void BindVirtualPropertiesAfterCollapseReturnsApplyClause() { IEnumerable <QueryToken> tokens = _parser.ParseApply( "groupby((ID))/aggregate($count as Count)"); BindingState state = new BindingState(_configuration); MetadataBinder metadataBiner = new MetadataBinder(_bindingState); ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState); ApplyClause actual = binder.BindApply(tokens); actual.Should().NotBeNull(); actual.Transformations.Should().HaveCount(2); GroupByTransformationNode groupby = actual.Transformations.First() as GroupByTransformationNode; groupby.Should().NotBeNull(); AggregateTransformationNode aggregate = actual.Transformations.Last() as AggregateTransformationNode; aggregate.Should().NotBeNull(); aggregate.AggregateExpressions.Should().HaveCount(1); aggregate.AggregateExpressions.Single().As <AggregateExpression>().Method.ShouldBeEquivalentTo(AggregationMethod.VirtualPropertyCount); }