Beispiel #1
0
        private bool CompareComputeExpression(ComputeExpression expression1, ComputeExpression expression2)
        {
            if (expression1.Alias != expression2.Alias)
            {
                return(false);
            }

            return(expression1.TypeReference.IsEqual(expression2.TypeReference) &&
                   _queryNodeComparer.Compare(expression1.Expression, expression2.Expression));
        }
Beispiel #2
0
        public void BindApplyWithComputeShouldReturnApplyClause()
        {
            var tokens = _parser.ParseApply("compute(UnitPrice mul 5 as BigPrice)");

            var binder = new ApplyBinder(FakeBindMethods.BindSingleComplexProperty, _bindingState);
            var actual = binder.BindApply(tokens);

            Assert.NotNull(actual);
            ComputeTransformationNode compute = Assert.IsType <ComputeTransformationNode>(Assert.Single(actual.Transformations));

            Assert.Equal(TransformationNodeKind.Compute, compute.Kind);
            Assert.NotNull(compute.Expressions);
            ComputeExpression statement = Assert.Single(compute.Expressions);

            VerifyIsFakeSingleValueNode(statement.Expression);
            Assert.Equal("BigPrice", statement.Alias);
        }
Beispiel #3
0
        public void BindApplyWithComputeAfterGroupByShouldReturnApplyClause()
        {
            var tokens = _parser.ParseApply("groupby((ID, SSN), aggregate(LifeTime with sum as TotalLife))/compute(TotalLife as TotalLife2)");

            BindingState   state         = new BindingState(_configuration);
            MetadataBinder metadataBiner = new MetadataBinder(_bindingState);

            ApplyBinder binder = new ApplyBinder(metadataBiner.Bind, _bindingState);
            var         actual = binder.BindApply(tokens);

            Assert.NotNull(actual);
            Assert.Equal(2, actual.Transformations.Count());

            ComputeTransformationNode compute = Assert.IsType <ComputeTransformationNode>(actual.Transformations.Last());

            Assert.Equal(TransformationNodeKind.Compute, compute.Kind);
            ComputeExpression statement = Assert.Single(compute.Expressions);

            Assert.Equal("TotalLife2", statement.Alias);
        }
Beispiel #4
0
        public void NestedComputeWithValidExpression()
        {
            // Arrange
            SelectToken select = ParseSelectToken("PreviousAddresses($compute=tolower(Street) as lowStreet;$select=lowStreet)");

            // Act
            SelectExpandClause clause = BinderForPerson.Bind(expandToken: null, selectToken: select);

            // Assert
            Assert.NotNull(clause);
            Assert.NotNull(clause.SelectedItems);

            // FavoriteColors
            var            selectItem    = Assert.Single(clause.SelectedItems);
            PathSelectItem subPathSelect = Assert.IsType <PathSelectItem>(selectItem);

            Assert.NotNull(subPathSelect.ComputeOption);

            ComputeExpression computeExpr = Assert.Single(subPathSelect.ComputeOption.ComputedItems);

            Assert.Equal("lowStreet", computeExpr.Alias);
            var functionCall = Assert.IsType <SingleValueFunctionCallNode>(computeExpr.Expression);

            Assert.Equal("tolower", functionCall.Name);
            Assert.Empty(functionCall.Functions);

            Assert.NotNull(subPathSelect.SelectAndExpand);

            selectItem = Assert.Single(subPathSelect.SelectAndExpand.SelectedItems);

            // it should be "lowStreet
            PathSelectItem pathSelect = Assert.IsType <PathSelectItem>(selectItem);

            ODataPathSegment   segment = Assert.Single(pathSelect.SelectedPath);
            DynamicPathSegment dynamic = Assert.IsType <DynamicPathSegment>(segment);

            Assert.Equal("lowStreet", dynamic.Identifier);
        }
Beispiel #5
0
        public void ParseComputeAsQueryOption()
        {
            // Create model
            EdmModel         model         = new EdmModel();
            EdmEntityType    elementType   = model.AddEntityType("DevHarness", "Entity");
            EdmTypeReference typeReference = new EdmStringTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.String), false);

            elementType.AddProperty(new EdmStructuralProperty(elementType, "Prop1", typeReference));

            EdmEntityContainer container = model.AddEntityContainer("Default", "Container");

            container.AddEntitySet("Entities", elementType);

            // Define queries and new up parser.
            Uri            root   = new Uri("http://host");
            Uri            url    = new Uri("http://host/Entities?$compute=cast(Prop1, 'Edm.String') as Property1AsString, tolower(Prop1) as Property1Lower");
            ODataUriParser parser = new ODataUriParser(model, root, url);

            // parse and validate
            ComputeClause            clause = parser.ParseCompute();
            List <ComputeExpression> items  = clause.ComputedItems.ToList();

            items.Count().Should().Be(2);
            items[0].Alias.ShouldBeEquivalentTo("Property1AsString");
            items[0].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[0].Expression.TypeReference.ShouldBeEquivalentTo(typeReference);
            items[1].Alias.ShouldBeEquivalentTo("Property1Lower");
            items[1].Expression.ShouldBeSingleValueFunctionCallQueryNode();
            items[1].Expression.TypeReference.FullName().ShouldBeEquivalentTo("Edm.String");
            items[1].Expression.TypeReference.IsNullable.ShouldBeEquivalentTo(true); // tolower is built in function that allows nulls.

            ComputeExpression copy = new ComputeExpression(items[0].Expression, items[0].Alias, null);

            copy.Expression.Should().NotBeNull();
            copy.TypeReference.Should().BeNull();
            ComputeClause varied = new ComputeClause(null);
        }
Beispiel #6
0
        private Expression CreateComputeExpression(ComputeExpression expression)
        {
            Expression body = BindAccessor(expression.Expression);

            return(WrapConvert(body));
        }