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); }
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); }
/// <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); }
/// <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"); }