Example #1
0
 private Term CustomUnaryExpressionConverter(
     UnaryExpression expr, DefaultExpressionConverterFactory.RecursiveMapDelegate recursiveMap,
     IDatumConverterFactory datumConverterFactory, IExpressionConverterFactory expressionConverterFactory)
 {
     return(new Term()
     {
         type = Term.TermType.DATUM,
         datum = new Datum()
         {
             type = Datum.DatumType.R_STR,
             r_str = "Woot woot!",
         }
     });
 }
Example #2
0
        public static Term ConvertAppendToTerm(MethodCallExpression methodCall, DefaultExpressionConverterFactory.RecursiveMapDelegate recursiveMap, IDatumConverterFactory datumConverterFactory, IExpressionConverterFactory expressionConverterFactory)
        {
            var target = methodCall.Arguments[0];

            var appendArray = methodCall.Arguments[1];

            IEnumerable <Expression> appendExpressions;

            if (appendArray.NodeType == ExpressionType.NewArrayInit)
            {
                appendExpressions = ((NewArrayExpression)appendArray).Expressions;
            }
            else if (appendArray.NodeType == ExpressionType.MemberAccess)
            {
                var memberExpression = (MemberExpression)appendArray;
                if (!memberExpression.Type.IsArray)
                {
                    throw new NotSupportedException(String.Format("Expected second arg to ReQLExpression.Append to be an array, but was: {0}", memberExpression.Type));
                }

                var array = (IEnumerable)Expression.Lambda(memberExpression).Compile().DynamicInvoke();
                var items = array as object[] ?? array.Cast <object>().ToArray();

                appendExpressions = items.Select(item => Expression.Constant(item));
            }
            else
            {
                throw new NotSupportedException(String.Format("Expected second arg to ReQLExpression.Append to be NewArrayInit or MemberAccess, but was: {0}", appendArray.NodeType));
            }

            var term = recursiveMap(target);

            foreach (var datumExpression in appendExpressions)
            {
                var newTerm = new Term()
                {
                    type = Term.TermType.APPEND
                };
                newTerm.args.Add(term);
                newTerm.args.Add(recursiveMap(datumExpression));

                term = newTerm;
            }

            return(term);
        }
        public static Term ConvertAppendToTerm(MethodCallExpression methodCall, DefaultExpressionConverterFactory.RecursiveMapDelegate recursiveMap, IDatumConverterFactory datumConverterFactory, IExpressionConverterFactory expressionConverterFactory)
        {
            var target = methodCall.Arguments[0];

            var appendArray = methodCall.Arguments[1];

            if (appendArray.NodeType != ExpressionType.NewArrayInit)
            {
                throw new NotSupportedException(String.Format("Expected second arg to ReQLExpression.Append to be NewArrayInit, but was: {0}", appendArray.NodeType));
            }

            var newArrayExpression = (NewArrayExpression)appendArray;
            var term = recursiveMap(target);

            foreach (var datumExpression in newArrayExpression.Expressions)
            {
                var newTerm = new Term()
                {
                    type = Term.TermType.APPEND
                };
                newTerm.args.Add(term);

                if (datumExpression.NodeType == ExpressionType.MemberInit)
                {
                    var memberInit = (MemberInitExpression)datumExpression;
                    newTerm.args.Add(recursiveMap(memberInit));
                }
                else
                {
                    throw new NotSupportedException(String.Format("Expected ReQLExpression.Append to contain MemberInit additions, but was: {0}", datumExpression.NodeType));
                }

                term = newTerm;
            }

            return(term);
        }
        public static Term ConvertEnumerableAnyToTerm(MethodCallExpression methodCall, DefaultExpressionConverterFactory.RecursiveMapDelegate recursiveMap, IDatumConverterFactory datumConverterFactory, IExpressionConverterFactory expressionConverterFactory)
        {
            var target    = methodCall.Arguments[0];
            var predicate = methodCall.Arguments[1];

            var filterTerm = new Term()
            {
                type = Term.TermType.CONTAINS
            };

            filterTerm.args.Add(recursiveMap(target));

            var enumerableElementType    = methodCall.Method.GetGenericArguments()[0];
            var createFunctionTermMethod = typeof(ExpressionUtils)
                                           .GetMethods(BindingFlags.Public | BindingFlags.Static)
                                           .Single(m => m.Name == "CreateFunctionTerm" && m.GetGenericArguments().Length == 2);

            createFunctionTermMethod = createFunctionTermMethod.MakeGenericMethod(enumerableElementType, typeof(bool));

            var functionTerm = (Term)createFunctionTermMethod.Invoke(null, new object[] { new QueryConverter(datumConverterFactory, expressionConverterFactory), predicate });

            filterTerm.args.Add(functionTerm);

            return(filterTerm);
        }