Exemplo n.º 1
0
        /// <summary>
        /// Tries to evaluate the current expression and add it as a projection
        /// </summary>
        private Expression AddProjection(Expression node, PocoColumn column = null)
        {
            var value = Expression.Lambda(node).Compile().DynamicInvoke();

            if (column == null)
            {
                column = _pocoData.GetColumnByMemberName(_currentBindingName.Get());
                if (column == null)
                {
                    throw new CqlLinqNotSupportedException(node, _parsePhase.Get());
                }
            }
            _projections.Add(Tuple.Create(column, value, ExpressionType.Assign));
            return(node);
        }
Exemplo n.º 2
0
        protected override Expression VisitMemberInit(MemberInitExpression node)
        {
            if (_parsePhase.Get() != ParsePhase.SelectBinding)
            {
                throw new CqlLinqNotSupportedException(node, _parsePhase.Get());
            }

            // Visit new instance creation (constructor and parameters)
            VisitNew(node.NewExpression);

            foreach (var binding in node.Bindings)
            {
                if (!(binding is MemberAssignment))
                {
                    continue;
                }
                using (_currentBindingName.Set(binding.Member.Name))
                {
                    Visit((binding as MemberAssignment).Expression);
                }
            }
            return(node);
        }
        private bool EvaluateMethod(string name, MethodCallExpression node)
        {
            var clause     = _currentCondition.Get().Item1;
            var parameters = _currentCondition.Get().Item2;

            switch (name)
            {
            case "Contains":
            {
                Expression what;
                Expression inp;
                if (node.Object == null)
                {
                    what = node.Arguments[1];
                    inp  = node.Arguments[0];
                }
                else
                {
                    what = node.Arguments[0];
                    inp  = node.Object;
                }
                Visit(what);
                var values       = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke();
                var placeHolders = new StringBuilder();
                foreach (var v in values)
                {
                    placeHolders.Append(placeHolders.Length == 0 ? "?" : ", ?");
                    parameters.Add(v);
                }

                clause
                .Append(" IN (")
                .Append(placeHolders)
                .Append(")");
                return(true);
            }

            case "StartsWith":
                Visit(node.Object);
                var startsWithArgument = node.Arguments[0];
                var startString        = (string)Expression.Lambda(startsWithArgument).Compile().DynamicInvoke();
                var endString          = startString + _utf8MaxValue;

                parameters.Add(startString);
                parameters.Add(endString);

                clause
                .Append(" ")
                .Append(CqlTags[ExpressionType.GreaterThanOrEqual])
                .Append(" ? ")
                .Append(CqlTags[ExpressionType.And])
                .Append(" ");

                Visit(node.Object);

                clause
                .Append(" ")
                .Append(CqlTags[ExpressionType.LessThan])
                .Append(" ?");

                return(true);

            case "CompareTo":
                Visit(node.Object);
                clause
                .Append(" ")
                .Append(_binaryExpressionTag.Get())
                .Append(" ");
                Visit(node.Arguments[0]);
                return(true);

            case "Equals":
                Visit(node.Object);
                clause.Append(" = ");
                Visit(node.Arguments[0]);
                return(true);

            case "CqlToken":
            case "Token":
                clause.Append("token(");
                var tokenArgs = node.Arguments;
                for (var i = 0; i < tokenArgs.Count; i++)
                {
                    var arg = tokenArgs[i];
                    if (i > 0)
                    {
                        clause.Append(", ");
                    }
                    Visit(arg);
                }
                clause.Append(")");
                return(true);

            case "MaxTimeUuid":
            case "MinTimeUuid":
                clause.Append(name.ToLowerInvariant()).Append("(");
                Visit(node.Arguments[0]);
                clause.Append(")");
                return(true);
            }
            return(false);
        }
        private Expression EvaluateConditionFunction(MethodCallExpression node)
        {
            var methodName = node.Method.Name;

            if (node.Method.DeclaringType != null)
            {
                if (node.Method.DeclaringType == typeof(CqlToken))
                {
                    methodName = "CqlToken";
                }
            }
            if (EvaluateMethod(methodName, node))
            {
                //It was evaluated as one of the methods
                return(node);
            }
            //Try to invoke to obtain the value
            var val = Expression.Lambda(node).Compile().DynamicInvoke();

            _currentCondition.Get().Item2.Add(val);
            _currentCondition.Get().Item1.Append("?");
            return(node);
        }
        private bool EvaluateMethod(string name, MethodCallExpression node)
        {
            var clause     = _currentCondition.Get().Item1;
            var parameters = _currentCondition.Get().Item2;

            switch (name)
            {
            case "Contains":
            {
                EvaluateContainsMethod(node, clause, parameters);
                return(true);
            }

            case "StartsWith":
                Visit(node.Object);
                var startsWithArgument = node.Arguments[0];
                var startString        = (string)Expression.Lambda(startsWithArgument).Compile().DynamicInvoke();
                var endString          = startString + _utf8MaxValue;

                parameters.Add(startString);
                parameters.Add(endString);

                clause
                .Append(" ")
                .Append(CqlTags[ExpressionType.GreaterThanOrEqual])
                .Append(" ? ")
                .Append(CqlTags[ExpressionType.And])
                .Append(" ");

                Visit(node.Object);

                clause
                .Append(" ")
                .Append(CqlTags[ExpressionType.LessThan])
                .Append(" ?");

                return(true);

            case "CompareTo":
                Visit(node.Object);
                clause
                .Append(" ")
                .Append(_binaryExpressionTag.Get())
                .Append(" ");
                Visit(node.Arguments[0]);
                return(true);

            case "Equals":
                Visit(node.Object);
                clause.Append(" = ");
                Visit(node.Arguments[0]);
                return(true);

            case "CqlToken":
            case "Token":
                clause.Append("token(");
                var tokenArgs = node.Arguments;
                for (var i = 0; i < tokenArgs.Count; i++)
                {
                    var arg = tokenArgs[i];
                    if (i > 0)
                    {
                        clause.Append(", ");
                    }
                    Visit(arg);
                }
                clause.Append(")");
                return(true);

            case "MaxTimeUuid":
            case "MinTimeUuid":
                clause.Append(name.ToLowerInvariant()).Append("(");
                Visit(node.Arguments[0]);
                clause.Append(")");
                return(true);
            }
            return(false);
        }