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