Ejemplo n.º 1
0
        public static Expression GetMergeExpression(string query, Type itemType, Type targetType)
        {
            EvoQLBuilder builder = new EvoQLBuilder(query);

            ParameterExpression parameterExpression;
            EvoQLExpression     parse;

            var filterexpr = builder.CreateFilterExpression(out parse, out parameterExpression, itemType);

            var get = parse.Tree as GetExpression;

            //var selects = get._selects.Select(x => new SelectDescriptor { SourcePath = x.Source, Function = x.Function, TargetPath = x.Target } ).ToArray();

            Type resultType = targetType;

            if (resultType == null)
            {
                if (itemType == null)
                {
                    throw new Exception("Neither Target or Source Item Type specified");
                }
                var mapreduceexpr = GetReduceExpression(query, itemType);
                //var mapreduceexpr = res.Expression;
                var enumType = mapreduceexpr.GetType().GetProperty("ReturnType").GetValue(mapreduceexpr, null) as Type;
                resultType = ReduceExpressionGeneration.GetTypeOfEnumerable(enumType);
            }

            //var resultElementType = ReduceExpressionGeneration.GetTypeOfEnumerable(resultType);
            //Expression mergeExpr = ReduceExpressionGeneration.GetMergeExpression(select, resultElementType);

            var mergeexpr = ReduceExpressionGeneration.GetMergeInvocationExpression(get._selects.ToArray(), get._dimensions.ToArray(), resultType);

            return(mergeexpr);
            //return new ExpressionResult { Expression = mergeexpr, Collections = GetCollections(parse) };
        }
Ejemplo n.º 2
0
        //private RootExpression _root;
        //private Expression _expression;
        //private EvoQLExpression _parse;
        //private Expression<Func<Mention, bool>> _lambda;

        public static Expression GetPagingExpression(string query, Type itemType)
        {
            EvoQLBuilder builder = new EvoQLBuilder(query);

            var filterexpr = builder.GetPagingExpression(itemType);

            return(filterexpr);
        }
Ejemplo n.º 3
0
        /*
         * public IEnumerable<Mention> Filter(IEnumerable<Mention> mentions)
         * {
         *  ParameterExpression parameterExpression;
         *  EvoQLExpression parse;
         *
         *  var whereLambdaExpr = GetFilterLambda(out parse, out parameterExpression);
         *  var whereLambda = whereLambdaExpr.GetType().GetMethod("Compile").Invoke(whereLambdaExpr, new object[0]);
         *
         *  IEnumerable<Mention> result = mentions.Where(whereLambda);
         *
         *  if (parse.Tree is GetExpression)
         *  {
         *      GetExpression get = (GetExpression)parse.Tree;
         *
         *      if (get.Ordering != null)
         *      {
         *          string[] properties = get.Ordering.Split('.');
         *
         *          string methodName = get.OrderDescending ? "OrderByDescending" : "OrderBy";
         *
         *          Type type = typeof(Mention);
         *          ParameterExpression parameter = parameterExpression;
         *          Expression currentExpression = parameter;
         *
         *          foreach (string current in properties)
         *          {
         *              PropertyInfo property = type.GetProperties().First(x => x.Name.Equals(current, StringComparison.InvariantCultureIgnoreCase));
         *              currentExpression = Expression.Property(currentExpression, property);
         *              type = property.PropertyType;
         *          }
         *
         *          Type delegateType = typeof(Func<,>).MakeGenericType(typeof(Mention), type);
         *          LambdaExpression lambda = Expression.Lambda(delegateType, currentExpression, parameter);
         *
         *          result = (IEnumerable<Mention>)typeof(Enumerable).GetMethods().Single(method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2).MakeGenericMethod(typeof(Mention), type).Invoke(null, new object[] { result, lambda });
         *      }
         *      if (get.Skip != null)
         *      {
         *          int skip = get.Skip.Value;
         *
         *          if (skip < 0)
         *          {
         *              throw new ArgumentException();
         *          }
         *
         *          result = AttachMethod(result, "Skip", skip, parameterExpression);
         *      }
         *      if (get.Take != null)
         *      {
         *          int take = get.Take.Value;
         *
         *          if (take < 0)
         *          {
         *              throw new ArgumentException();
         *          }
         *
         *          result = AttachMethod(result, "Take", take, parameterExpression);
         *      }
         *
         *  }
         *
         *  return result;
         * }*/

        /*
         * private IEnumerable<Mention> AttachMethod(IEnumerable<Mention> source, string methodName, object parameter, ParameterExpression parameterExpression)
         * {
         *  Type elementType = typeof(Mention);
         *
         *  source = (IEnumerable<Mention>)typeof(Enumerable).GetMethods().Single(method => method.Name == methodName && method.GetParameters().Length == 2 && method.GetParameters().Skip(1).Single().ParameterType == parameter.GetType()).MakeGenericMethod(elementType).Invoke(null, new object[] { source, parameter });
         *
         *  return source;
         * }*/


        //private IEnumerable<Mention> _mentions = new Mention[]{};
        //private Expression<Func<Mention, bool>> _lambda;

        //public IEnumerable<Mention> BuildExpression(out EvoQLExpression expression, out ParameterExpression parameter)
        //{
        //    expression = new EvoQLExpression(_query);

        //    if (expression.HadErrors)
        //    {
        //        string errorString = "EvoQL Error:\n";
        //        foreach (string error in expression.Errors)
        //        {
        //            errorString += error + "\n";
        //        }
        //        throw new EvoQLException(errorString);
        //    }

        //    expression.Tree.Init();

        //    _root = expression.Tree;

        //    if (expression.Tree is GetExpression)
        //    {
        //        GetExpression get = (GetExpression)expression.Tree;

        //        _expression = get.CreateExpression(null);

        //        var lambda = BuildLambda<Mention>(out parameter);
        //        var func = lambda.Compile();


        //    }
        //    parameter = null;

        //    return null;
        //}

        public static CollectionExpression[] GetCollections(string query, string mapreduce, string merge, string paging)
        {
            EvoQLBuilder builder  = new EvoQLBuilder(query);
            EvoQLBuilder builder2 = new EvoQLBuilder(mapreduce);
            EvoQLBuilder builder3 = new EvoQLBuilder(merge);
            EvoQLBuilder builder4 = new EvoQLBuilder(paging);

            return(builder.GetCollections().Union(builder2.GetCollections()).Union(builder3.GetCollections()).Union(builder4.GetCollections()).Distinct().ToArray());
        }
Ejemplo n.º 4
0
        //public static Expression GetFilterLambda(string query, Type itemType)
        //{
        //    EvoQLBuilder builder = new EvoQLBuilder(query);

        //    ParameterExpression parameterExpression;
        //    EvoQLExpression parse;

        //    return builder.GetFilterLambda(out parse, out parameterExpression);
        //}

        //public static Expression GetFilterLambdaWithParameters(string query, Type itemType)
        //{
        //    EvoQLBuilder builder = new EvoQLBuilder(query);

        //    ParameterExpression parameterExpression;
        //    EvoQLExpression parse;

        //    return builder.GetFilterLambdaWithParameters(out parse, out parameterExpression);
        //}

        public static Expression GetWhereExpression(string query, Type itemType)
        {
            EvoQLBuilder builder = new EvoQLBuilder(query);

            ParameterExpression parameterExpression;
            EvoQLExpression     parse;

            var filterexpr = builder.CreateFilterExpression(out parse, out parameterExpression, itemType);

            var queryexpr = ReduceExpressionGeneration.GetWhereExpression(filterexpr, itemType);

            return(queryexpr);
            //return new ExpressionResult { Expression = queryexpr, Collections = GetCollections(parse) };
        }
Ejemplo n.º 5
0
        public static Expression GetReduceExpression(string query, Type itemType, bool includeFilter = false)
        {
            EvoQLBuilder builder = new EvoQLBuilder(query);

            ParameterExpression parameterExpression;
            EvoQLExpression     parse;

            var filterexpr = builder.CreateFilterExpression(out parse, out parameterExpression, itemType);

            var get = parse.Tree as GetExpression;

            var targetType = itemType;

            var currentGet = get;

            var sourceExpr = includeFilter ? filterexpr : null;

            var lulz = RecursivelyGetSubselects(get, filterexpr, includeFilter, itemType);

            //Expression reduceexpr = ReduceExpressionGeneration.GetMapreduceExpression( sourceExpr, get._selects.ToArray(), get._dimensions.Any() ? get._dimensions.ToArray() : null, targetType, get, null);

            return(lulz);
            //return new ExpressionResult{ Expression = reduceexpr, Collections = GetCollections(parse) };
        }