Beispiel #1
0
        internal ComputeBinder(ODataQuerySettings settings, IAssembliesResolver assembliesResolver, Type elementType,
                               IEdmModel model, ComputeTransformationNode transformation)
            : base(settings, assembliesResolver, elementType, model)
        {
            Contract.Assert(transformation != null);

            _transformation = transformation;

            this.ResultClrType = typeof(ComputeWrapper <>).MakeGenericType(this._elementType);
        }
Beispiel #2
0
        private bool CompareComputeTransformation(ComputeTransformationNode node1, ComputeTransformationNode node2)
        {
            if (node1 == node2)
            {
                return(true);
            }
            if (node1 == null || node2 == null)
            {
                return(false);
            }

            return(EnumerableComparer.Compare(node1.Expressions, node2.Expressions, CompareComputeExpression));
        }
        private void Translate(ComputeTransformationNode transformation)
        {
            bool appendComma = false;

            foreach (ComputeExpression computeExpression in transformation.Expressions)
            {
                appendComma = AppendComma(appendComma);

                AppendExpression(computeExpression.Expression);
                query.Append(ExpressionConstants.SymbolEscapedSpace);
                AppendWord(ExpressionConstants.KeywordAs);
                query.Append(computeExpression.Alias);
            }
        }
Beispiel #4
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 #5
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 #6
0
        private MethodCallExpression ApplyCompute(Expression source, ComputeTransformationNode transformation)
        {
            var expressions = new List <Expression>();

            Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type);
            ParameterExpression sourceParameter = Expression.Parameter(sourceType);

            if (_aggProperties.Count > 0)
            {
                var callExpression = (MethodCallExpression)source;
                source = callExpression.Arguments[0];
                var aggLambda = (LambdaExpression)callExpression.Arguments[1];
                expressions.AddRange(((NewExpression)aggLambda.Body).Arguments);

                sourceType      = OeExpressionHelper.GetCollectionItemType(source.Type);
                sourceParameter = aggLambda.Parameters[0];
            }

            OeQueryNodeVisitor visitor = CreateVisitor(sourceParameter);

            if (_aggProperties.Count > 0)
            {
                visitor.TuplePropertyByAliasName = new ComputeAliasNameResolver(_aggProperties, expressions).GetTuplePropertyByAliasName;
            }

            foreach (ComputeExpression computeExpression in transformation.Expressions)
            {
                Expression expression = visitor.TranslateNode(computeExpression.Expression);
                expressions.Add(expression);

                _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, expression.Type, computeExpression.Alias, false));
            }

            NewExpression    newExpression    = OeExpressionHelper.CreateTupleExpression(expressions);
            MethodInfo       selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(sourceParameter.Type, newExpression.Type);
            LambdaExpression lambda           = Expression.Lambda(newExpression, sourceParameter);

            return(Expression.Call(selectMethodInfo, source, lambda));
        }
Beispiel #7
0
 internal ComputeBinder(ODataQuerySettings settings, IWebApiAssembliesResolver assembliesResolver, Type elementType,
                        IEdmModel model, ComputeTransformationNode transformation)
     : this(settings, assembliesResolver, elementType, model, transformation.Expressions)
 {
 }