private Expression PartialEvaluate(Expression expression)
        {
            Logger.Log($"Partial evaluating expression '{expression}'", Indentation.One);
            var expressionAnalyzer = new LocalExpressionAnalyzer(CanBeEvaluatedLocally);

            Logger.Log("Identifying candidates for partial evaluation", Indentation.Two);
            var candidates = expressionAnalyzer.GetLocalExpressions(expression).ToList();

            Logger.Log($"Identified {candidates.Count} candidates for local evaluation", Indentation.Two, candidates);
            ValidateCandidates(expression, candidates);

            var partialEvaluated = new LocalExpressionEvaluator(candidates).Evaluate(expression);

            Logger.Log($"Reduced expression to '{partialEvaluated}'", Indentation.Two);

            return(partialEvaluated);
        }
Example #2
0
        public IEnumerable <TResult> ExecuteEnumerable <TResult>(Expression expression)
        {
            PrintTree(expression, "Original tree");

            expression = LocalExpressionEvaluator.Evaluate(expression);
            PrintTree(expression, "Locals evaluated");

            if (_client.UseTopOptimization)
            {
                bool change;
                expression = TopOptimizer.Optimize(expression, out change);
                if (change)
                {
                    PrintTree(expression, "TopOptimized");
                }
            }
            Console.WriteLine("^ Final tree ^");
            var query = MakeQuery(expression);

            Console.WriteLine(query);

#if true
            var res = _client.RunAnalytics(query);
#else
            string res;
            if (typeof(TResult) == typeof(Request))
            {
                res = DummyData.DummyJsonResultFull;
            }
            else
            {
                res = DummyData.DummyJsonResult;
            }
#endif

            var tbls = JsonConvert.DeserializeObject <TablesWrapper>(res);
            if (_builder == null)
            {
                _builder = DefaultBuilderFactory.Get <TResult>();
            }
            var items = _builder.Build <TResult>(tbls.Tables[0]);
            return(items);
        }