/// <summary>
 /// Gets the content of a SIF file to download corresponding to the provided control path.
 /// </summary>
 /// <param name="controlPath">The current control path.</param>
 /// <param name="stream">The stream to which to write to.</param>
 /// <param name="serviceProvider">The application service provider.</param>
 /// <returns>The content of the SIF file corresponding to the provided control path.</returns>
 public static async Task WriteToStreamSifFileContent(this ControlPath controlPath, Stream stream, IServiceProvider serviceProvider)
 {
     // Use a new scope.
     using var scope = serviceProvider.CreateScope();
     // Use a new context instance.
     using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
     // Define the stream writer for the file.
     using var streamWriter = new StreamWriter(stream);
     // Get the data for the file.
     var data = string.Join("\n", context.Paths
                            .Where(item => item.ControlPath == controlPath)
                            .Select(item => item.PathEdges)
                            .SelectMany(item => item)
                            .Select(item => item.Edge)
                            .Select(item => new
     {
         SourceNodeName = item.EdgeNodes
                          .Where(item1 => item1.Type == EdgeNodeType.Source)
                          .Select(item1 => item1.Node)
                          .Where(item1 => item1 != null)
                          .Select(item1 => item1.Name)
                          .FirstOrDefault(),
         TargetNodeName = item.EdgeNodes
                          .Where(item1 => item1.Type == EdgeNodeType.Target)
                          .Select(item1 => item1.Node)
                          .Where(item1 => item1 != null)
                          .Select(item1 => item1.Name)
                          .FirstOrDefault()
     })
                            .Where(item => !string.IsNullOrEmpty(item.SourceNodeName) && !string.IsNullOrEmpty(item.TargetNodeName))
                            .Select(item => $"{item.SourceNodeName}\tinteracts with\t{item.TargetNodeName}"));
     // Write the data to the stream.
     await streamWriter.WriteAsync(data);
 }
 public AddControl(ControlPath parentControlPath, BlockNode control, Dictionary <string, ControlState> controlStates, bool isInComponent)
 {
     _isInComponent     = isInComponent;
     _parentControlPath = parentControlPath;
     _control           = control;
     _controlStates     = controlStates;
 }
Ejemplo n.º 3
0
 private ChangeProperty(ControlPath path, string propertyName, string expression, CustomPropertyJson customProperty, bool wasRemoved)
 {
     ControlPath     = path;
     PropertyName    = propertyName;
     _expression     = expression;
     _customProperty = customProperty;
     _wasRemoved     = wasRemoved;
 }
 private ChangeComponentFunction(ControlPath path, string propertyName, FunctionNode func, CustomPropertyJson customProperty, bool wasRemoved)
 {
     ControlPath     = path;
     PropertyName    = propertyName;
     _func           = func;
     _customProperty = customProperty;
     _wasRemoved     = wasRemoved;
 }
Ejemplo n.º 5
0
    public override void AddInput(GameObject dropZone)
    {
        ControlPath cp =
            dropZone.GetComponentInParent <ControlPath>();

        cp.schemeObject.Input = DataClass.panelManager.captured.schemeObject;
        cp.inputText.text     = cp.schemeObject.Input.name;
    }
        /// <summary>
        /// Gets the Cytoscape view model corresponding to the provided control path.
        /// </summary>
        /// <param name="controlPath">The current control path.</param>
        /// <param name="linkGenerator">Represents the link generator.</param>
        /// <returns>Returns the Cytoscape view model corresponding to the provided control path.</returns>
        public static CytoscapeViewModel GetCytoscapeViewModel(this ControlPath controlPath, LinkGenerator linkGenerator)
        {
            // Get the control data.
            var controlNodes = controlPath.Paths.Select(item => item.PathNodes).SelectMany(item => item).Where(item => item.Type == PathNodeType.Source).Select(item => item.Node);
            var controlEdges = controlPath.Paths.Select(item => item.PathEdges).SelectMany(item => item).Select(item => item.Edge);
            // Get the default values.
            var interactionType = controlPath.Analysis.AnalysisDatabases.FirstOrDefault()?.Database.DatabaseType.Name.ToLower();
            var isGeneric       = interactionType == "generic";
            var controlClasses  = new List <string> {
                "control"
            };

            // Return the view model.
            return(new CytoscapeViewModel
            {
                Elements = new CytoscapeViewModel.CytoscapeElements
                {
                    Nodes = controlPath.Analysis.AnalysisNodes
                            .Where(item => item.Type == AnalysisNodeType.None)
                            .Select(item => item.Node)
                            .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeNode
                    {
                        Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeNode.CytoscapeNodeData
                        {
                            Id = item.Id,
                            Name = item.Name,
                            Href = isGeneric ? string.Empty : linkGenerator.GetPathByPage(page: "/Content/Data/Nodes/Details", values: new { id = item.Id }),
                            Alias = item.DatabaseNodeFieldNodes
                                    .Where(item1 => item1.DatabaseNodeField.IsSearchable)
                                    .Select(item1 => item1.Value)
                        },
                        Classes = item.AnalysisNodes
                                  .Where(item1 => item1.Analysis == controlPath.Analysis)
                                  .Select(item1 => item1.Type.ToString().ToLower())
                                  .Concat(controlNodes.Contains(item) ? controlClasses : Enumerable.Empty <string>())
                    }),
                    Edges = controlPath.Analysis.AnalysisEdges
                            .Select(item => item.Edge)
                            .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge
                    {
                        Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge.CytoscapeEdgeData
                        {
                            Id = item.Id,
                            Name = item.Name,
                            Source = item.EdgeNodes.FirstOrDefault(item1 => item1.Type == EdgeNodeType.Source)?.Node.Id,
                            Target = item.EdgeNodes.FirstOrDefault(item1 => item1.Type == EdgeNodeType.Target)?.Node.Id,
                            Interaction = interactionType
                        },
                        Classes = controlEdges.Contains(item) ? controlClasses : Enumerable.Empty <string>()
                    })
                },
                Layout = CytoscapeViewModel.DefaultLayout,
                Styles = CytoscapeViewModel.DefaultStyles.Concat(CytoscapeViewModel.DefaultAnalysisStyles).Concat(CytoscapeViewModel.DefaultControlPathStyles)
            });
        }
        /// <summary>
        /// Gets the updated navigation title card for the analysis details page.
        /// </summary>
        /// <param name="analysis">Represents the current analysis.</param>
        /// <returns>The navigation title card for the analysis page.</returns>
        public static NavigationTitleCardViewModel GetControlPathNavigationTitleCard(ControlPath controlPath)
        {
            // Get the corresponding navigation title card.
            var navigationTitleCard = ControlPathNavigationTitleCard;

            // Update the title and subtitle.
            navigationTitleCard.Title    = "Control path";
            navigationTitleCard.Subtitle = controlPath.Id;
            // Return the navigation title card.
            return(navigationTitleCard);
        }
Ejemplo n.º 8
0
    public void AddNewPath()
    {
        ControlPath p = Instantiate(prefab, container);

        p.panel = this;
        controlPaths.Add(p);
        p.UpdateID(controlPaths.Count - 1);
        ControllerEntity entity = Instantiate(ePrefab, parent.boardObject.transform);

        p.schemeObject.boardObject = entity.gameObject;
        parent.boardObject.GetComponent <MIK51>().controllers.Add(entity);
    }
 /// <summary>
 /// Gets the content of a text file to download corresponding to the provided control path.
 /// </summary>
 /// <param name="controlPath">The current control path.</param>
 /// <param name="stream">The stream to which to write to.</param>
 /// <param name="serviceProvider">The application service provider.</param>
 /// <returns>The content of the text file corresponding to the provided control path.</returns>
 public static async Task WriteToStreamTxtFileContent(this ControlPath controlPath, Stream stream, IServiceProvider serviceProvider)
 {
     // Use a new scope.
     using var scope = serviceProvider.CreateScope();
     // Use a new context instance.
     using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
     // Define the stream writer for the file.
     using var streamWriter = new StreamWriter(stream);
     // Get the data for the file.
     var data = string.Join("\n", context.ControlPaths
                            .Where(item => item == controlPath)
                            .Select(item => item.Paths)
                            .SelectMany(item => item)
                            .Select(item => item.PathNodes
                                    .Where(item1 => item1.Type == PathNodeType.None)
                                    .OrderBy(item1 => item1.Index)
                                    .Select(item1 => item1.Node.Name))
                            .Select(item => string.Join(";", item)));
     // Write the data to the stream.
     await streamWriter.WriteAsync(data);
 }
        private Hashtable TokenSettings()
        {
            if (_sqlviewproTokens != null)
            {
                return(_sqlviewproTokens);
            }

            var tokens = new Hashtable
            {
                { "MODULEID", EffectiveModuleId.ToString() },
                { "MODULEFOLDER", ControlPath.Remove(ControlPath.Length - 1) },                     // remove last / character to be consistent with resolveurl
                { "TABMODULEID", TabModuleId.ToString() },
                { "PAGEURL", Request.Url.AbsoluteUri },
                { "IMAGEURL", ResolveUrl("~/images") },
                { "CDATASTART", "<![CDATA[" },
                { "CDATAEND", "]]>" }
            };

            _sqlviewproTokens = tokens;
            return(_sqlviewproTokens);
        }
 public RemoveControl(ControlPath parentControlPath, string controlName, bool isInComponent)
 {
     _parentControlPath = parentControlPath;
     _controlName       = controlName;
     _isInComponent     = isInComponent;
 }
 public static ChangeComponentFunction GetFunctionRemoval(ControlPath path, string propertyName)
 {
     return(new ChangeComponentFunction(path, propertyName, null, null, true));
 }
 public static ChangeComponentFunction GetFunctionChange(ControlPath path, string propertyName, FunctionNode func)
 {
     return(new ChangeComponentFunction(path, propertyName, func, null, false));
 }
 public static ChangeComponentFunction GetFunctionChangeWithMetadata(ControlPath path, string propertyName, FunctionNode func, CustomPropertyJson customProperty)
 {
     return(new ChangeComponentFunction(path, propertyName, func, customProperty, false));
 }
        /// <summary>
        /// Gets the Cytoscape view model corresponding to the provided control path.
        /// </summary>
        /// <param name="controlPath">The current control path.</param>
        /// <param name="httpContext">The HTTP context.</param>
        /// <param name="linkGenerator">The link generator.</param>
        /// <param name="context">The application database context.</param>
        /// <returns>Returns the Cytoscape view model corresponding to the provided control path.</returns>
        public static CytoscapeViewModel GetCytoscapeViewModel(this ControlPath controlPath, HttpContext httpContext, LinkGenerator linkGenerator, ApplicationDbContext context)
        {
            // Get the required values.
            var databaseTypeName = context.ControlPaths
                                   .Where(item => item == controlPath)
                                   .Select(item => item.Analysis.AnalysisDatabases)
                                   .SelectMany(item => item)
                                   .Select(item => item.Database.DatabaseType.Name)
                                   .First();
            // Get the control data.
            var analysis = context.ControlPaths
                           .Where(item => item == controlPath)
                           .Select(item => item.Analysis)
                           .FirstOrDefault();
            var controlNodes = context.ControlPaths
                               .Where(item => item == controlPath)
                               .Select(item => item.Paths)
                               .SelectMany(item => item)
                               .Select(item => item.PathNodes)
                               .SelectMany(item => item)
                               .Where(item => item.Type == PathNodeType.Source)
                               .Select(item => item.Node.Id)
                               .Where(item => !string.IsNullOrEmpty(item))
                               .ToHashSet();
            var controlEdges = context.ControlPaths
                               .Where(item => item == controlPath)
                               .Select(item => item.Paths)
                               .SelectMany(item => item)
                               .Select(item => item.PathEdges)
                               .SelectMany(item => item)
                               .Select(item => item.Edge.Id)
                               .Where(item => !string.IsNullOrEmpty(item))
                               .ToHashSet();

            // Return the view model.
            return(new CytoscapeViewModel
            {
                Elements = new CytoscapeViewModel.CytoscapeElements
                {
                    Nodes = context.PathNodes
                            .Where(item => item.Path.ControlPath == controlPath)
                            .Where(item => item.Type == PathNodeType.None)
                            .Select(item => item.Node)
                            .Select(item => new
                    {
                        Id = item.Id,
                        Name = item.Name,
                        Classes = item.AnalysisNodes
                                  .Where(item1 => item1.Analysis == analysis)
                                  .Select(item1 => item1.Type.ToString().ToLower())
                    })
                            .AsEnumerable()
                            .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeNode
                    {
                        Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeNode.CytoscapeNodeData
                        {
                            Id = item.Id,
                            Name = item.Name,
                            Href = linkGenerator.GetUriByPage(httpContext, $"/Content/DatabaseTypes/{databaseTypeName}/Data/Nodes/Details", handler: null, values: new { id = item.Id })
                        },
                        Classes = item.Classes.Concat(controlNodes.Contains(item.Id) ? new List <string> {
                            "control"
                        } : new List <string> {
                        })
                    }),
                    Edges = context.PathEdges
                            .Where(item => item.Path.ControlPath == controlPath)
                            .Select(item => item.Edge)
                            .Select(item => new
                    {
                        Id = item.Id,
                        Name = item.Name,
                        SourceNodeId = item.EdgeNodes
                                       .Where(item1 => item1.Type == EdgeNodeType.Source)
                                       .Select(item1 => item1.Node)
                                       .Where(item1 => item1 != null)
                                       .Select(item1 => item1.Id)
                                       .FirstOrDefault(),
                        TargetNodeId = item.EdgeNodes
                                       .Where(item1 => item1.Type == EdgeNodeType.Target)
                                       .Select(item1 => item1.Node)
                                       .Where(item1 => item1 != null)
                                       .Select(item1 => item1.Id)
                                       .FirstOrDefault()
                    })
                            .AsEnumerable()
                            .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge
                    {
                        Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge.CytoscapeEdgeData
                        {
                            Id = item.Id,
                            Name = item.Name,
                            Href = linkGenerator.GetUriByPage(httpContext, $"/Content/DatabaseTypes/{databaseTypeName}/Data/Edges/Details", handler: null, values: new { id = item.Id }),
                            Source = item.SourceNodeId,
                            Target = item.TargetNodeId
                        },
                        Classes = controlEdges.Contains(item.Id) ? new List <string> {
                            "control"
                        } : new List <string> {
                        }
                    })
                },
                Layout = CytoscapeViewModel.DefaultLayout,
                Styles = CytoscapeViewModel.DefaultStyles.Concat(CytoscapeViewModel.DefaultAnalysisStyles).Concat(CytoscapeViewModel.DefaultControlPathStyles)
            });
        }
Ejemplo n.º 16
0
 public static ChangeProperty GetPropertyRemovedChange(ControlPath path, string propertyName)
 {
     return(new ChangeProperty(path, propertyName, null, null, true));
 }
Ejemplo n.º 17
0
 public static ChangeProperty GetComponentCustomPropertyChange(ControlPath path, string propertyName, string expression, CustomPropertyJson customProperty)
 {
     return(new ChangeProperty(path, propertyName, expression, customProperty, false));
 }
Ejemplo n.º 18
0
 public static ChangeProperty GetNormalPropertyChange(ControlPath path, string propertyName, string expression)
 {
     return(new ChangeProperty(path, propertyName, expression, null, false));
 }
Ejemplo n.º 19
0
 public ControlDiffContext(ControlPath path, IRNode theirs, bool isInComponent)
 {
     Theirs        = theirs;
     Path          = path;
     IsInComponent = isInComponent;
 }
 /// <summary>
 /// Gets the content of a JSON file to download corresponding to the provided control path.
 /// </summary>
 /// <param name="controlPath">The current control path.</param>
 /// <param name="stream">The stream to which to write to.</param>
 /// <param name="serviceProvider">The application service provider.</param>
 /// <returns>The content of the JSON file corresponding to the provided control path.</returns>
 public static async Task WriteToStreamJsonFileContent(this ControlPath controlPath, Stream stream, IServiceProvider serviceProvider)
 {
     // Use a new scope.
     using var scope = serviceProvider.CreateScope();
     // Use a new context instance.
     using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
     // Get the required data.
     var data = new
     {
         Id       = controlPath.Id,
         Analysis = context.Analyses
                    .Where(item => item.ControlPaths.Any(item1 => item1 == controlPath))
                    .Select(item => new
         {
             Id          = item.Id,
             Name        = item.Name,
             Description = item.Description,
             Algorithm   = item.Algorithm.ToString()
         })
                    .FirstOrDefault(),
         UniqueControlNodes = context.Paths
                              .Where(item1 => item1.ControlPath == controlPath)
                              .Select(item1 => item1.PathNodes)
                              .SelectMany(item1 => item1)
                              .Where(item1 => item1.Type == PathNodeType.Source)
                              .Select(item1 => item1.Node)
                              .AsEnumerable()
                              .GroupBy(item1 => item1)
                              .Select(item1 => new
         {
             Id    = item1.Key.Id,
             Name  = item1.Key.Name,
             Count = item1.Count()
         }),
         Paths = context.ControlPaths
                 .Where(item => item == controlPath)
                 .Select(item => item.Paths)
                 .SelectMany(item => item)
                 .Select(item => item.PathEdges
                         .OrderBy(item1 => item1.Index)
                         .Select(item1 => item1.Edge)
                         .Select(item1 => new
         {
             SourceNode = item1.EdgeNodes
                          .Where(item2 => item2.Type == EdgeNodeType.Source)
                          .Select(item2 => item2.Node)
                          .Where(item2 => item2 != null)
                          .FirstOrDefault(),
             TargetNode = item1.EdgeNodes
                          .Where(item2 => item2.Type == EdgeNodeType.Target)
                          .Select(item2 => item2.Node)
                          .Where(item2 => item2 != null)
                          .FirstOrDefault()
         })
                         .Where(item1 => item1.SourceNode != null && item1.TargetNode != null)
                         .AsEnumerable()
                         .Select(item1 => new
         {
             SourceNode = new
             {
                 Id   = item1.SourceNode.Id,
                 Name = item1.SourceNode.Name
             },
             TargetNode = new
             {
                 Id   = item1.TargetNode.Id,
                 Name = item1.TargetNode.Name
             }
         }))
     };
     // Write the data corresponding to the file.
     await JsonSerializer.SerializeAsync(stream, data, new JsonSerializerOptions { IgnoreNullValues = true });
 }
        /// <summary>
        /// Gets the content of an Excel file to download corresponding to the provided control path.
        /// </summary>
        /// <param name="controlPath">The current control path.</param>
        /// <param name="stream">The stream to which to write to.</param>
        /// <param name="serviceProvider">The application service provider.</param>
        /// <returns>The content of the Excel file corresponding to the provided control path.</returns>
        public static async Task WriteToStreamXlsxFileContent(this ControlPath controlPath, Stream stream, IServiceProvider serviceProvider)
        {
            // Use a new scope.
            using var scope = serviceProvider.CreateScope();
            // Use a new context instance.
            using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
            // Get the required data.
            var analysis = context.ControlPaths
                           .Where(item => item == controlPath)
                           .Select(item => item.Analysis)
                           .FirstOrDefault();
            var databaseTypeName = context.AnalysisDatabases
                                   .Where(item => item.Analysis == analysis)
                                   .Select(item => item.Database.DatabaseType.Name)
                                   .FirstOrDefault();
            var databaseNodeFields = context.AnalysisDatabases
                                     .Where(item => item.Analysis == analysis)
                                     .Where(item => item.Type == AnalysisDatabaseType.Node)
                                     .Select(item => item.Database.DatabaseNodeFields)
                                     .SelectMany(item => item)
                                     .ToList();
            var databaseEdgeFields = context.AnalysisDatabases
                                     .Where(item => item.Analysis == analysis)
                                     .Where(item => item.Type == AnalysisDatabaseType.Edge)
                                     .Select(item => item.Database.DatabaseEdgeFields)
                                     .SelectMany(item => item)
                                     .ToList();
            // Get the required variables.
            var nodeTitle = databaseTypeName == "PPI" ? "Protein" : "Node";
            var edgeTitle = databaseTypeName == "PPI" ? "Interaction" : "Edge";
            // Define the rows in the first sheet.
            var worksheet1Rows = new List <List <string> >
            {
                new List <string>
                {
                    "Internal ID",
                    controlPath.Id
                },
                new List <string>
                {
                    "Analysis ID",
                    analysis?.Id ?? string.Empty
                },
                new List <string>
                {
                    "Analysis name",
                    analysis?.Name ?? string.Empty
                },
                new List <string>
                {
                    "Analysis description",
                    analysis?.Description ?? string.Empty
                },
                new List <string>
                {
                    "Analysis algorithm",
                    analysis?.Algorithm.ToString() ?? string.Empty
                }
            };
            // Define the rows in the second sheet.
            var worksheet2Rows = new List <List <string> >
            {
                new List <string>
                {
                    "Internal ID",
                    "Name",
                    "Type"
                }
            }.Concat(context.AnalysisDatabases
                     .Where(item => item.Analysis == analysis)
                     .Select(item => new
            {
                DatabaseId   = item.Database.Id,
                DatabaseName = item.Database.Name,
                Type         = item.Type
            })
                     .AsEnumerable()
                     .Select(item => new List <string>
            {
                item.DatabaseId,
                item.DatabaseName,
                item.Type == AnalysisDatabaseType.Node ? nodeTitle : item.Type == AnalysisDatabaseType.Edge ? edgeTitle : string.Empty
            })
                     .ToList())
            .ToList();
            // Define the rows in the third sheet.
            var worksheet3Rows = new List <List <string> >
            {
                new List <string>
                {
                    "Internal ID",
                    "Name",
                    $"{nodeTitle}s"
                }.Concat(databaseNodeFields
                         .Select(item => item.Name)
                         .ToList())
                .ToList()
            }.Concat(context.PathNodes
                     .Where(item => item.Path.ControlPath == controlPath)
                     .Where(item => item.Type == PathNodeType.None)
                     .Select(item => item.Node)
                     .Select(item => new
            {
                Id          = item.Id,
                Name        = item.Name,
                Description = item.Description,
                Values      = item.DatabaseNodeFieldNodes
                              .Select(item1 => new
                {
                    DatabaseNodeFieldId = item1.DatabaseNodeField.Id,
                    Value = item1.Value
                }),
                Types = item.PathNodes
                        .Where(item1 => item1.Path.ControlPath == controlPath)
                        .Select(item => item.Type.ToString().ToLower())
            })
                     .AsEnumerable()
                     .Select(item => new List <string>
            {
                item.Id,
                item.Name,
                string.Join(",", item.Types)
            }.Concat(databaseNodeFields
                     .Select(item1 => item.Values.FirstOrDefault(item2 => item2.DatabaseNodeFieldId == item1.Id))
                     .Select(item1 => item1 == null ? string.Empty : item1.Value)
                     .ToList())))
            .ToList();
            // Define the rows in the fourth sheet.
            var worksheet4Rows = new List <List <string> >
            {
                new List <string>
                {
                    "Internal ID",
                    $"Source {nodeTitle.ToLower()} ID",
                    $"Source {nodeTitle.ToLower()} name",
                    $"Target {nodeTitle.ToLower()} ID",
                    $"Target {nodeTitle.ToLower()} name"
                }.Concat(databaseEdgeFields
                         .Select(item => item.Name)
                         .ToList())
                .ToList()
            }.Concat(context.PathEdges
                     .Where(item => item.Path.ControlPath == controlPath)
                     .Select(item => item.Edge)
                     .Select(item => new
            {
                Id         = item.Id,
                SourceNode = item.EdgeNodes
                             .Where(item1 => item1.Type == EdgeNodeType.Source)
                             .Select(item1 => item1.Node)
                             .FirstOrDefault(),
                TargetNode = item.EdgeNodes
                             .Where(item1 => item1.Type == EdgeNodeType.Target)
                             .Select(item1 => item1.Node)
                             .FirstOrDefault(),
                Values = item.DatabaseEdgeFieldEdges
                         .Select(item1 => new
                {
                    DatabaseEdgeFieldId = item1.DatabaseEdgeField.Id,
                    Value = item1.Value
                })
            })
                     .Where(item => item.SourceNode != null && item.TargetNode != null)
                     .AsEnumerable()
                     .Select(item => new List <string>
            {
                item.Id,
                item.SourceNode.Id,
                item.SourceNode.Name,
                item.TargetNode.Id,
                item.TargetNode.Name
            }.Concat(databaseEdgeFields
                     .Select(item1 => item.Values.FirstOrDefault(item2 => item2.DatabaseEdgeFieldId == item1.Id))
                     .Select(item1 => item1 == null ? string.Empty : item1.Value)
                     .ToList())))
            .ToList();
            // Define the rows in the fifth sheet.
            var worksheet5Rows = new List <List <string> >
            {
                new List <string>
                {
                    "Internal ID",
                    "Length",
                    $"Source {nodeTitle.ToLower()} name",
                    $"Target {nodeTitle.ToLower()} name",
                    $"{nodeTitle}s"
                }
            }.Concat(context.Paths
                     .Where(item => item.ControlPath == controlPath)
                     .Select(item => new
            {
                Id             = item.Id,
                Length         = item.PathEdges.Count(),
                SourceNodeName = item.PathNodes
                                 .Where(item1 => item1.Type == PathNodeType.Source)
                                 .Select(item1 => item1.Node.Name)
                                 .FirstOrDefault(),
                TargetNodeName = item.PathNodes
                                 .Where(item1 => item1.Type == PathNodeType.Target)
                                 .Select(item1 => item1.Node.Name)
                                 .FirstOrDefault(),
                Nodes = item.PathNodes
                        .Where(item1 => item1.Type == PathNodeType.None)
                        .OrderBy(item1 => item1.Index)
                        .Select(item1 => item1.Node.Name)
            })
                     .Where(item => !string.IsNullOrEmpty(item.SourceNodeName) && !string.IsNullOrEmpty(item.TargetNodeName))
                     .AsEnumerable()
                     .Select(item => new List <string>
            {
                item.Id,
                item.Length.ToString(),
                item.SourceNodeName,
                item.TargetNodeName,
                string.Join(",", item.Nodes)
            })
                     .ToList())
            .ToList();
            // Define the stream for the file.
            var fileStream = new MemoryStream();

            // Define the Excel file.
            using SpreadsheetDocument document = SpreadsheetDocument.Create(fileStream, SpreadsheetDocumentType.Workbook);
            // Definte a new workbook part.
            var workbookPart = document.AddWorkbookPart();

            workbookPart.Workbook = new Workbook();
            var worksheets = workbookPart.Workbook.AppendChild(new Sheets());
            // Define the first worksheet.
            var worksheet1Part = workbookPart.AddNewPart <WorksheetPart>();
            var worksheet1Data = new SheetData();
            var worksheet1     = new Sheet {
                Id = workbookPart.GetIdOfPart(worksheet1Part), SheetId = 1, Name = "Details"
            };

            worksheet1Part.Worksheet = new Worksheet(worksheet1Data);
            worksheet1Data.Append(worksheet1Rows.Select(item => new Row(item.Select(item1 => new Cell {
                DataType = CellValues.String, CellValue = new CellValue(item1)
            }))));
            worksheets.Append(worksheet1);
            // Define the second worksheet.
            var worksheet2Part = workbookPart.AddNewPart <WorksheetPart>();
            var worksheet2Data = new SheetData();
            var worksheet2     = new Sheet {
                Id = workbookPart.GetIdOfPart(worksheet2Part), SheetId = 2, Name = "Databases"
            };

            worksheet2Part.Worksheet = new Worksheet(worksheet2Data);
            worksheet2Data.Append(worksheet2Rows.Select(item => new Row(item.Select(item1 => new Cell {
                DataType = CellValues.String, CellValue = new CellValue(item1)
            }))));
            worksheets.Append(worksheet2);
            // Define the third worksheet.
            var worksheet3Part = workbookPart.AddNewPart <WorksheetPart>();
            var worksheet3Data = new SheetData();
            var worksheet3     = new Sheet {
                Id = workbookPart.GetIdOfPart(worksheet3Part), SheetId = 3, Name = $"{nodeTitle}s"
            };

            worksheet3Part.Worksheet = new Worksheet(worksheet3Data);
            worksheet3Data.Append(worksheet3Rows.Select(item => new Row(item.Select(item1 => new Cell {
                DataType = CellValues.String, CellValue = new CellValue(item1)
            }))));
            worksheets.Append(worksheet3);
            // Define the fourth worksheet.
            var worksheet4Part = workbookPart.AddNewPart <WorksheetPart>();
            var worksheet4Data = new SheetData();
            var worksheet4     = new Sheet {
                Id = workbookPart.GetIdOfPart(worksheet4Part), SheetId = 4, Name = $"{edgeTitle}s"
            };

            worksheet4Part.Worksheet = new Worksheet(worksheet4Data);
            worksheet4Data.Append(worksheet4Rows.Select(item => new Row(item.Select(item1 => new Cell {
                DataType = CellValues.String, CellValue = new CellValue(item1)
            }))));
            worksheets.Append(worksheet4);
            // Define the fifth worksheet.
            var worksheet5Part = workbookPart.AddNewPart <WorksheetPart>();
            var worksheet5Data = new SheetData();
            var worksheet5     = new Sheet {
                Id = workbookPart.GetIdOfPart(worksheet5Part), SheetId = 5, Name = $"Paths"
            };

            worksheet5Part.Worksheet = new Worksheet(worksheet5Data);
            worksheet5Data.Append(worksheet5Rows.Select(item => new Row(item.Select(item1 => new Cell {
                DataType = CellValues.String, CellValue = new CellValue(item1)
            }))));
            worksheets.Append(worksheet5);
            // Close the document.
            document.Close();
            // Reset the stream position.
            fileStream.Position = 0;
            // Copy it to the archive stream.
            await fileStream.CopyToAsync(stream);
        }
 /// <summary>
 /// Gets the content of a JSON file to download corresponding to the provided control path.
 /// </summary>
 /// <param name="controlPath">The current control path.</param>
 /// <param name="stream">The stream to which to write to.</param>
 /// <param name="serviceProvider">The application service provider.</param>
 /// <returns>The content of the JSON file corresponding to the provided control path.</returns>
 public static async Task WriteToStreamCyjsFileContent(this ControlPath controlPath, Stream stream, IServiceProvider serviceProvider)
 {
     // Use a new scope.
     using var scope = serviceProvider.CreateScope();
     // Use a new context instance.
     using var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
     // Get the control data.
     var analysis = context.ControlPaths
                    .Where(item => item == controlPath)
                    .Select(item => item.Analysis)
                    .First();
     var controlNodes = context.ControlPaths
                        .Where(item => item == controlPath)
                        .Select(item => item.Paths)
                        .SelectMany(item => item)
                        .Select(item => item.PathNodes)
                        .SelectMany(item => item)
                        .Where(item => item.Type == PathNodeType.Source)
                        .Select(item => item.Node.Id)
                        .Where(item => !string.IsNullOrEmpty(item))
                        .ToHashSet();
     var controlEdges = context.ControlPaths
                        .Where(item => item == controlPath)
                        .Select(item => item.Paths)
                        .SelectMany(item => item)
                        .Select(item => item.PathEdges)
                        .SelectMany(item => item)
                        .Select(item => item.Edge.Id)
                        .Where(item => !string.IsNullOrEmpty(item))
                        .ToHashSet();
     // Return the view model.
     var data = new CytoscapeViewModel
     {
         Data = new CytoscapeViewModel.CytoscapeData
         {
             Id          = controlPath.Id,
             Name        = $"{controlPath.Analysis.Name} - Control Path",
             Description = controlPath.Analysis.Description
         },
         Elements = new CytoscapeViewModel.CytoscapeElements
         {
             Nodes = context.PathNodes
                     .Where(item => item.Path.ControlPath == controlPath)
                     .Where(item => item.Type == PathNodeType.None)
                     .Select(item => item.Node)
                     .Select(item => new
             {
                 Id      = item.Id,
                 Name    = item.Name,
                 Classes = item.AnalysisNodes
                           .Where(item1 => item1.Analysis == analysis)
                           .Select(item1 => item1.Type.ToString().ToLower())
             })
                     .AsEnumerable()
                     .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeNode
             {
                 Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeNode.CytoscapeNodeData
                 {
                     Id   = item.Id,
                     Name = item.Name,
                     Type = string.Join(",", item.Classes.Concat(controlNodes.Contains(item.Id) ? new List <string> {
                         "control"
                     } : new List <string> {
                     }).OrderBy(item => item))
                 }
             }),
             Edges = context.PathEdges
                     .Where(item => item.Path.ControlPath == controlPath)
                     .Select(item => item.Edge)
                     .Select(item => new
             {
                 Id           = item.Id,
                 Name         = item.Name,
                 SourceNodeId = item.EdgeNodes
                                .Where(item1 => item1.Type == EdgeNodeType.Source)
                                .Select(item1 => item1.Node)
                                .Where(item1 => item1 != null)
                                .Select(item1 => item1.Id)
                                .FirstOrDefault(),
                 TargetNodeId = item.EdgeNodes
                                .Where(item1 => item1.Type == EdgeNodeType.Target)
                                .Select(item1 => item1.Node)
                                .Where(item1 => item1 != null)
                                .Select(item1 => item1.Id)
                                .FirstOrDefault()
             })
                     .AsEnumerable()
                     .Select(item => new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge
             {
                 Data = new CytoscapeViewModel.CytoscapeElements.CytoscapeEdge.CytoscapeEdgeData
                 {
                     Id     = item.Id,
                     Name   = item.Name,
                     Source = item.SourceNodeId,
                     Target = item.TargetNodeId,
                     Type   = string.Join(",", controlEdges.Contains(item.Id) ? new List <string> {
                         "control"
                     } : new List <string> {
                     })
                 }
             })
         }
     };
     // Write the data corresponding to the file.
     await JsonSerializer.SerializeAsync(stream, data, new JsonSerializerOptions { IgnoreNullValues = true });
 }