public async Task <IActionResult> OnGet() { const int PageSize = 25; if (string.IsNullOrEmpty(BuildQuery)) { BuildQuery = new SearchBuildsRequest() { Definition = "runtime" }.GetQueryString(); return(Page()); } if (!SearchBuildsRequest.TryCreate(BuildQuery ?? "", out var buildsRequest, out var errorMessage) || !SearchTimelinesRequest.TryCreate(TimelineQuery ?? "", out var timelinesRequest, out errorMessage)) { ErrorMessage = errorMessage; return(Page()); } try { IQueryable <ModelTimelineIssue> query = TriageContextUtil.Context.ModelTimelineIssues; query = buildsRequest.Filter(query); query = timelinesRequest.Filter(query); var totalCount = await query.CountAsync(); query = query .OrderByDescending(x => x.ModelBuild.BuildNumber) .Skip(PageNumber * PageSize) .Take(PageSize); TimelineIssuesDisplay = await TimelineIssuesDisplay.Create( query, includeBuildColumn : true, includeIssueTypeColumn : timelinesRequest.Type is null, includeAttemptColumn : true); IncludeIssueTypeColumn = timelinesRequest.Type is null; PaginationDisplay = new PaginationDisplay( "/Search/Timelines", new Dictionary <string, string>() { { "bq", BuildQuery ?? "" }, { "tq", TimelineQuery ?? "" } }, PageNumber, totalCount / PageSize); TotalCount = totalCount; return(Page()); } catch (SqlException ex) when(ex.IsTimeoutViolation()) { ErrorMessage = "Timeout fetching data from the server"; return(Page()); } }
public async Task OnGetAsync() { const int PageSize = 25; IQueryable <ModelTrackingIssue> query = Context.ModelTrackingIssues; if (!string.IsNullOrEmpty(Query)) { try { var request = new SearchTrackingIssuesRequest(); request.ParseQueryString(Query); query = request.Filter(query); } catch (Exception ex) { ErrorMessage = ex.Message; return; } } var week = DateTime.UtcNow - TimeSpan.FromDays(7); Issues = await query .Where(x => x.IsActive) .Select(issue => new IssueData() { Id = issue.Id, Title = issue.IssueTitle, Kind = issue.TrackingKind.ToString(), TotalCount = issue.ModelTrackingIssueMatches.Count(), WeekCount = issue.ModelTrackingIssueMatches.Where(x => x.ModelBuildAttempt.ModelBuild.StartTime >= week).Count() }) .OrderByDescending(x => x.WeekCount) .Skip(PageSize * PageNumber) .Take(PageSize) .ToListAsync(); PaginationDisplay = new PaginationDisplay( "/Tracking/Index", new Dictionary <string, string>() { { nameof(Query), Query ?? "" } }, PageNumber); }
public async Task OnGet() { const int pageSize = 50; ErrorMessage = null; if (string.IsNullOrEmpty(BuildQuery)) { BuildQuery = new SearchBuildsRequest() { Definition = "runtime", Started = new DateRequestValue(dayQuery: 3), }.GetQueryString(); return; } if (!SearchBuildsRequest.TryCreate(BuildQuery, out var buildsRequest, out var errorMessage) || !SearchHelixLogsRequest.TryCreate(LogQuery ?? "", out var logsRequest, out errorMessage)) { ErrorMessage = errorMessage; return; } // Helix logs are only kept for failed builds. If the user doesn't specify a specific result type, // like say cancelled, then just search all non succeeded builds. if (buildsRequest.Result is null) { buildsRequest.Result = new BuildResultRequestValue(BuildResult.Succeeded, EqualsKind.NotEquals); BuildQuery = buildsRequest.GetQueryString(); } if (logsRequest.HelixLogKinds.Count == 0) { logsRequest.HelixLogKinds.Add(HelixLogKind.Console); LogQuery = logsRequest.GetQueryString(); } if (string.IsNullOrEmpty(logsRequest.Text)) { ErrorMessage = @"Must specify text to search for 'text: ""StackOverflowException""'"; return; } try { IQueryable <ModelTestResult> query = TriageContextUtil.Context.ModelTestResults.Where(x => x.IsHelixTestResult); query = buildsRequest.Filter(query); var totalBuildCount = await query.CountAsync(); var modelResults = await query .Skip(PageNumber *pageSize) .Take(pageSize) .Select(x => new { x.ModelBuild.BuildNumber, x.ModelBuild.AzureOrganization, x.ModelBuild.AzureProject, x.ModelBuild.StartTime, x.ModelBuild.GitHubOrganization, x.ModelBuild.GitHubRepository, x.ModelBuild.GitHubTargetBranch, x.ModelBuild.PullRequestNumber, x.HelixConsoleUri, x.HelixCoreDumpUri, x.HelixRunClientUri, x.HelixTestResultsUri, }) .ToListAsync(); var toQuery = modelResults .Select(x => ( new BuildInfo(x.AzureOrganization, x.AzureProject, x.BuildNumber, new GitHubBuildInfo(x.GitHubOrganization, x.GitHubRepository, x.PullRequestNumber, x.GitHubTargetBranch)), new HelixLogInfo( runClientUri: x.HelixRunClientUri, consoleUri: x.HelixConsoleUri, coreDumpUri: x.HelixCoreDumpUri, testResultsUri: x.HelixTestResultsUri))); var helixServer = new HelixServer(); var errorBuilder = new StringBuilder(); var results = await helixServer.SearchHelixLogsAsync( toQuery, logsRequest, ex => errorBuilder.AppendLine(ex.Message)); foreach (var result in results) { HelixLogs.Add(new HelixLogData() { BuildNumber = result.BuildInfo.Number, Line = result.Line, HelixLogKind = result.HelixLogKind.GetDisplayFileName(), HelixLogUri = result.HelixLogUri, }); } if (errorBuilder.Length > 0) { ErrorMessage = errorBuilder.ToString(); } PaginationDisplay = new PaginationDisplay( "/Search/HelixLogs", new Dictionary <string, string>() { { "bq", BuildQuery }, { "lq", LogQuery ?? "" }, }, PageNumber, totalBuildCount / pageSize); BuildResultText = $"Results for {PageNumber * pageSize}-{(PageNumber * pageSize) + pageSize} of {totalBuildCount} builds"; DidSearch = true; } catch (SqlException ex) when(ex.IsTimeoutViolation()) { ErrorMessage = "Timeout fetching data from the server"; } }
public async Task OnGet() { const int pageSize = 25; if (string.IsNullOrEmpty(Query)) { Query = new SearchBuildsRequest() { Definition = "roslyn-ci", Started = new DateRequestValue(dayQuery: 5), }.GetQueryString(); return; } if (!SearchBuildsRequest.TryCreate(Query, out var request, out var errorMessage)) { ErrorMessage = errorMessage; return; } TotalBuildCount = await request .Filter(TriageContext.ModelBuilds) .CountAsync(); PaginationDisplay = new PaginationDisplay( "/Search/Builds", new Dictionary <string, string>() { { "q", Query }, }, PageNumber, TotalBuildCount / pageSize); var skipCount = PageNumber * pageSize; List <BuildResultInfo> results; try { results = await request .Filter(TriageContext.ModelBuilds) .OrderByDescending(x => x.BuildNumber) .Skip(skipCount) .Take(pageSize) .ToBuildResultInfoListAsync(); } catch (SqlException ex) when(ex.IsTimeoutViolation()) { ErrorMessage = "Timeout fetching data from the server"; return; } Builds = results .Select(x => { return(new BuildData() { BuildResult = x.BuildResult, Result = x.BuildResult.ToString(), BuildNumber = x.Number, Kind = x.PullRequestKey.HasValue ? "Pull Request" : "Rolling", PullRequestKey = x.PullRequestKey, BuildUri = x.BuildUri, Definition = x.DefinitionName, DefinitionUri = x.DefinitionInfo.DefinitionUri, TargetBranch = x.GitHubBuildInfo?.TargetBranch, Queued = DateTimeUtil.ConvertDateTime(x.QueueTime)?.ToString("yyyy-MM-dd hh:mm tt"), }); }) .ToList(); IncludeDefinitionColumn = !request.HasDefinition; IncludeTargetBranchColumn = !request.TargetBranch.HasValue; }