public override async Task Execute(SaveLayoutCommand command) { var layout = await UnitOfWork.Db.Layouts.SingleOrDefaultAsync(l => l.NetworkId == command.NetworkId && l.Key == command.Key); if (layout == null) { layout = new Entities.Layout() { Id = Guid.NewGuid(), NetworkId = command.NetworkId, Key = command.Key }; UnitOfWork.Db.Layouts.Add(layout); } layout.GraphLayout = command.GraphLayout; }
/// <summary> /// 1) jeśli nie layoutu ma to utwórz nowy layout, synchronicznie odpal layout i dodaj do bazy /// 2) jeśli jest już layout to go wczytaj /// 2a) jeśli któryś z węzłow nie ma współżędnych to synchronicznie odpal layout ale na krótkie 0.5 sekundy /// 2b) zakolejkuj kolejny krok rozłożenia z niskim priorytetem /// </summary> public async Task LayoutGraph(SigmaGraphModel graph, LayoutTask layoutTask, TimeSpan?duration) { if (Guid.Empty.Equals(layoutTask.Query.NetworkId)) { throw new ArgumentNullException(nameof(layoutTask.Query.NetworkId)); } if (graph.Nodes == null) { return; } var networkId = layoutTask.Query.NetworkId; var layout = await _repository.Db.Layouts.SingleOrDefaultAsync(l => l.NetworkId == networkId && l.Key == layoutTask.Query.LayoutKey); // Ad 1 if (layout == null) { lock (LayoutLock) { // prevent entering here from many threads layout = _repository.Db.Layouts.SingleOrDefault( l => l.NetworkId == networkId && l.Key == layoutTask.Query.LayoutKey); if (layout == null) { layout = new Entities.Layout() { Id = Guid.NewGuid(), NetworkId = networkId, Key = layoutTask.Query.LayoutKey }; _repository.Db.Layouts.Add(layout); _repository.Db.SaveChanges(); } } ApplyLayout(graph, null); var graphLayout = new GraphLayout(); ImproveAppliedLayout(graph, graphLayout, layoutTask.Settings, duration ?? _firstTimeLayoutDuration); // save layout layout.GraphLayout = graphLayout; _repository.Db.SaveChanges(); } else // Ad 2 { var graphLayout = layout.GraphLayout; if (!ApplyLayout(graph, graphLayout)) { // ad 2a ImproveAppliedLayout(graph, graphLayout, layoutTask.Settings, duration ?? _missingNodesImproveLayoutDuration); layout.GraphLayout = graphLayout; await _repository.Db.SaveChangesAsync(); } else { // ad 2b if (Background == null) { ImproveAppliedLayout(graph, graphLayout, layoutTask.Settings, duration ?? _missingNodesImproveLayoutDuration); layout.GraphLayout = graphLayout; await _repository.Db.SaveChangesAsync(); } else { _log.Debug("Scheduling background layout"); if (layoutTask.ModifyLayout) { Background.Execute(new ImproveLayoutCommand() { Task = layoutTask, Duration = duration ?? _improveLayoutInBackgroundDuration }, new BackgroundPrincipal(Auth.UserName)); } } } } }