public void RewriteObjectTest()
        {
            var instance = new SampleClassWithProperties
            {
                DefaultProperty = new List <int> {
                    100, 101
                },
                AlternativeProperty = new List <int> {
                    200, 201
                }
            };

            IndexExpression  expr        = instance.DefaultIndexExpression;
            MemberExpression newProperty = Expression.Property(Expression.Constant(instance),
                                                               typeof(SampleClassWithProperties).GetProperty(nameof(instance.AlternativeProperty)));

            var             visitor  = new IndexVisitor(expr, newProperty, expr.Arguments.ToArray());
            IndexExpression actual   = (IndexExpression)visitor.Visit(expr);
            IndexExpression expected = Expression.MakeIndex(newProperty, expr.Indexer, expr.Arguments);

            // Object of ExpressionIndex replaced via Rewrite method call.
            IndexExpressionHelpers.AssertEqual(expected, actual);

            // Invoke to check expression.
            IndexExpressionHelpers.AssertInvokeCorrect(100, expr);
            IndexExpressionHelpers.AssertInvokeCorrect(200, actual);
        }
Exemple #2
0
        public void index_visitor_can_access_nodes_at_given_index()
        {
            var analyzer     = new NodeAnalyzer();
            var tree         = analyzer.Parse("x + y");
            var lookupIndex  = 0;
            var indexVisitor = new IndexVisitor(() => lookupIndex);

            lookupIndex = -1;
            indexVisitor
            .Invoking(sut => sut.VisitNode(tree))
            .Should()
            .Throw <ArgumentException>();

            lookupIndex = 10;
            indexVisitor
            .Invoking(sut => sut.VisitNode(tree))
            .Should()
            .Throw <ArgumentException>();

            lookupIndex = 3;
            indexVisitor.VisitNode(tree);
            var expected = indexVisitor.NodeAtIndex as IdentifierNode;

            expected.Should().NotBeNull();
            expected?.Identifier.Should().Be("y");
        }
 public GeneticMutator(Random random)
 {
     _random           = random;
     _indexVisitor     = new IndexVisitor(() => _otherIndexLookup);
     _generator        = new RandomNodeGenerator(_random);
     _optimizer        = new OptimizationMutator();
     _otherIndexLookup = -1;
 }
        public void RewriteArgumentsTest()
        {
            var instance = new SampleClassWithProperties {DefaultProperty = new List<int> {100, 101}};

            IndexExpression expr = instance.DefaultIndexExpression;
            Expression[] newArguments = {Expression.Constant(1)};

            var visitor = new IndexVisitor(expr, expr.Object, newArguments);
            IndexExpression expected = Expression.MakeIndex(expr.Object, expr.Indexer, newArguments);
            var actual = (IndexExpression) visitor.Visit(expr);

            IndexExpressionHelpers.AssertEqual(expected, actual);

            // Invoke to check expression.
            IndexExpressionHelpers.AssertInvokeCorrect(100, expr);
            IndexExpressionHelpers.AssertInvokeCorrect(101, actual);
        }
Exemple #5
0
        /// <summary>
        /// Downloads the index html page specified, and extracts a set of known fields from it.
        /// </summary>
        /// <param name="packageUri">Location of index.html page.</param>
        /// <param name="result">RPackage object to fill in. A new one is created if none is passed in.</param>
        /// <returns>RPackage object populated with the information found in the html page.</returns>
        /// <exception cref="WebException">Page cannot be loaded.</exception>
        /// <remarks>
        /// If an existing RPackage object is passed in, the fields that are already filled in
        /// won't be overwritten by the ones extracted from the html page.
        /// </remarks>
        public static async Task <RPackage> RetrievePackageInfo(Uri packageUri, RPackage result = null)
        {
            string content;

            using (var webClient = new WebClient()) {
                content = await webClient.DownloadStringTaskAsync(packageUri);
            }

            var pkg = result ?? new RPackage();

            var tree = new HtmlTree(new Microsoft.Web.Core.Text.TextStream(content));

            tree.Build();

            var search = new IndexVisitor(pkg);

            tree.Accept(search, null);

            return(pkg);
        }
        public void RewriteArgumentsTest()
        {
            var instance = new SampleClassWithProperties {
                DefaultProperty = new List <int> {
                    100, 101
                }
            };

            IndexExpression expr = instance.DefaultIndexExpression;

            Expression[] newArguments = { Expression.Constant(1) };

            var             visitor  = new IndexVisitor(expr, expr.Object, newArguments);
            IndexExpression expected = Expression.MakeIndex(expr.Object, expr.Indexer, newArguments);
            var             actual   = (IndexExpression)visitor.Visit(expr);

            IndexExpressionHelpers.AssertEqual(expected, actual);

            // Invoke to check expression.
            IndexExpressionHelpers.AssertInvokeCorrect(100, expr);
            IndexExpressionHelpers.AssertInvokeCorrect(101, actual);
        }
        public void RewriteObjectTest()
        {
            var instance = new SampleClassWithProperties
            {
                DefaultProperty = new List<int> { 100, 101 },
                AlternativeProperty = new List<int> { 200, 201 }
            };

            IndexExpression expr = instance.DefaultIndexExpression;
            MemberExpression newProperty = Expression.Property(Expression.Constant(instance),
                typeof(SampleClassWithProperties).GetProperty(nameof(instance.AlternativeProperty)));

            var visitor = new IndexVisitor(expr, newProperty, expr.Arguments.ToArray());
            IndexExpression actual = (IndexExpression)visitor.Visit(expr);
            IndexExpression expected = Expression.MakeIndex(newProperty, expr.Indexer, expr.Arguments);

            // Object of ExpressionIndex replaced via Rewrite method call.
            IndexExpressionHelpers.AssertEqual(expected, actual);

            // Invoke to check expression.
            IndexExpressionHelpers.AssertInvokeCorrect(100, expr);
            IndexExpressionHelpers.AssertInvokeCorrect(200, actual);
        }
Exemple #8
0
        /// <summary>
        /// Updates the query results
        /// </summary>
        public void Update(Action <double> progress, CancellationToken cancellation)
        {
            // stop here if the log is empty
            if (_log.Count == 0)
            {
                _logger.Debug($"Evaluation canceled by empty log");
                _mode = EvaluationMode.Aggregate;
                Reset(0);
                return;
            }

            // start timers for performance measurement
            var sw  = Stopwatch.StartNew();
            var sw2 = Stopwatch.StartNew();

            // generate the raw index
            var indexVisitor = new IndexVisitor(_log);

            _tree.Accept(indexVisitor);

            // create an enumerator for the index
            var index = indexVisitor.Index;

            _mode = indexVisitor.Mode;

            // refine the index by evaluating log items
            IEnumerable <LogItem>     items         = null;
            Dictionary <string, Type> dynamicFields = null;

            if (_mode == EvaluationMode.Evaluate || _mode == EvaluationMode.Aggregate)
            {
                long progressTotal = 0;

                // build a parallel query for reading the log
                var rawItems = index
                               .AsParallel()
                               .AsOrdered()
                               .WithCancellation(cancellation)
                               .GroupBy(i => i.File + i.Member)
                               .SelectMany(f => _log.Read(f, (step, total) => progress?.Invoke((Interlocked.Add(ref progressTotal, step) * 98.0) / total), cancellation));

                // apply the query to the log
                var evaluateVisitor = new EvaluateVisitor(rawItems);
                _tree.Accept(evaluateVisitor);
                items = evaluateVisitor.Items;

                // store dynamic fields
                dynamicFields = evaluateVisitor.Fields;
            }

            // store the result as specified
            if (_mode == EvaluationMode.Aggregate)
            {
                _index = new DirectIndex(Enumerable.Empty <IndexItem>());
                Reset(items);
                _logger.Info($"Evaluation completed in {sw2.ElapsedMilliseconds} ms");
            }
            else if (_mode == EvaluationMode.Evaluate)
            {
                _index = new DirectIndex(items.Select(i => new IndexItem(i.File, i.Member, i.Position, i.Line)));
                Reset(_index.Count);
                _logger.Info($"Evaluation and reindexing completed after {sw2.ElapsedMilliseconds} ms");
            }
            else
            {
                _index = new DirectIndex(index);
                Reset(_index.Count);
                _logger.Info($"Indexing completed after {sw2.ElapsedMilliseconds} ms");
            }

            // generate the dynamic columns
            if (_dynamicColumns != null)
            {
                _dynamicColumns.Clear();
                foreach (var kvp in dynamicFields)
                {
                    _dynamicColumns.Add(kvp.Key, kvp.Value);
                }
            }

            sw.Stop();
            _logger.Info($"Execution completed in {sw.ElapsedMilliseconds} ms");
        }