Beispiel #1
0
        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;
        }
Beispiel #2
0
        /// <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));
                        }
                    }
                }
            }
        }