private async Task GetJobsStatusAsync()

in tools/Explorer/ViewModels/SubmittedQueriesViewModel.cs [45:116]


        private async Task GetJobsStatusAsync()
        {
            string result = "";
            using (var session = await this.model.GetSessionAsync(""))
            {
                result = $"<Jobs>{await session.ExecuteAsync(jobDetailsQuery)}</Jobs>";
            }
            XDocument document = XDocument.Parse(result);

            // Build the list from the server:
            IList<SubmittedQueryDescriptor> serverList = new List<SubmittedQueryDescriptor>();
            foreach (var job in document.Document.XPathSelectElements("//job"))
            {
                var jobId = job.Attribute("id").Value;
                var state = job.Attribute("state").Value;
                var user = job.Attribute("user").Value;
                var duration = job.Attribute("duration").Value;
                string query;

                if (this.model.JobIdToQuery.TryGetValue(jobId, out string formattedQuery))
                {
                    query = formattedQuery;
                }
                else
                {
                    query = job.Value;
                }

                // Do not show the job that is getting the job details.
                if (string.Compare(query, jobDetailsQuery, true) == 0)
                {
                    continue;
                }
                serverList.Add(new SubmittedQueryDescriptor(jobId)
                {
                    Query = query,
                    Duration = XmlConvert.ToTimeSpan(duration),
                    User = user,
                    IsRunning = (string.Compare(state, "running") == 0),
                });
            }

            var displayList = this.model.SubmittedQueries;
            foreach (var descriptor in displayList)
                descriptor.Delete = true;

            foreach (var descriptor in serverList)
            {
                var displayed = displayList.Where(d => d.JobId == descriptor.JobId).FirstOrDefault();

                if (displayed != null)
                {
                    displayed.IsRunning = descriptor.IsRunning;
                    displayed.Duration = descriptor.Duration;
                    displayed.Delete = false;
                }
                else
                {
                    // There is nothing displayed for this item from the server.
                    displayList.Add(descriptor);
                }
            }

            // Now all the displayed elements have been updated with new values
            // and new ones have been inserted. Any displayed item that has the 
            // delete flag set to true is deleted:
            foreach (var descriptor in displayList.Where(d => d.Delete).ToArray())
            {
                displayList.Remove(descriptor);
                this.model.JobIdToQuery.Remove(descriptor.JobId);
            }
        }