Exemplo n.º 1
0
        private SarifLog CreatePartitionLog(T partitionValue)
        {
            SarifLog partitionLog;

            if (deepClone)
            {
                // Save time and space by not cloning the runs unless and until necessary. We will
                // only need to clone the runs that have results in this partition.
                IList <Run> originalRuns = originalLog.Runs;
                originalLog.Runs = null;

                partitionLog = originalLog.DeepClone();

                originalLog.Runs = originalRuns;
            }
            else
            {
                partitionLog = new SarifLog(originalLog.SchemaUri,
                                            originalLog.Version,
                                            runs: null,
                                            originalLog.InlineExternalProperties,
                                            originalLog.Properties);
            }

            partitionLog.Runs = new List <Run>();
            partitionLog.SetProperty(PartitionValuePropertyName, partitionValue);

            var artifactIndexRemappingDictionaries = new List <Dictionary <int, int> >();

            for (int iOriginalRun = 0; iOriginalRun < partitionRunInfos.Count; ++iOriginalRun)
            {
                // Are there results for this run in this partition?
                if (partitionRunInfos[iOriginalRun].ResultDictionary.TryGetValue(partitionValue, out List <Result> results))
                {
                    // Yes, so we'll need a copy of the original run in which the results, and
                    // certain run-level collections such as Run.Artifacts, have been replaced.
                    Run originalRun = originalLog.Runs[iOriginalRun];
                    Run partitionRun;
                    if (deepClone)
                    {
                        // Save time and space by only cloning the necessary results and associated
                        // collection elements. We already cloned the relevant results in VisitResult.
                        IList <Result>   originalResults   = originalRun.Results;
                        IList <Artifact> originalArtifacts = originalRun.Artifacts;
                        originalRun.Results   = null;
                        originalRun.Artifacts = null;

                        partitionRun = originalRun.DeepClone();

                        originalRun.Results   = originalResults;
                        originalRun.Artifacts = originalArtifacts;
                    }
                    else
                    {
                        partitionRun = new Run(originalRun.Tool,
                                               originalRun.Invocations,
                                               originalRun.Conversion,
                                               originalRun.Language,
                                               originalRun.VersionControlProvenance,
                                               originalRun.OriginalUriBaseIds,
                                               artifacts: null,
                                               originalRun.LogicalLocations,
                                               originalRun.Graphs,
                                               results: null,
                                               originalRun.AutomationDetails,
                                               originalRun.RunAggregates,
                                               originalRun.BaselineGuid,
                                               originalRun.RedactionTokens,
                                               originalRun.DefaultEncoding,
                                               originalRun.DefaultSourceLanguage,
                                               originalRun.NewlineSequences,
                                               originalRun.ColumnKind,
                                               originalRun.ExternalPropertyFileReferences,
                                               originalRun.ThreadFlowLocations,
                                               originalRun.Taxonomies,
                                               originalRun.Addresses,
                                               originalRun.Translations,
                                               originalRun.Policies,
                                               originalRun.WebRequests,
                                               originalRun.WebResponses,
                                               originalRun.SpecialLocations,
                                               originalRun.Properties);
                    }

                    partitionRun.Results = results;

                    // Construct a mapping from the indices in the original run to the indices
                    // in the partition run. This includes both the indices relevant to the
                    // results in this partition, and indices that appear in all partitions
                    // because they are mentioned outside of any result (we refer to these as
                    // "global" indices).
                    IEnumerable <int> allPartitionArtifactIndices = partitionRunInfos[iOriginalRun].GlobalArtifactIndices;

                    if (partitionRunInfos[iOriginalRun].ArtifactIndicesDictionary.TryGetValue(partitionValue, out HashSet <int> partitionResultArtifactIndices))
                    {
                        allPartitionArtifactIndices = allPartitionArtifactIndices.Union(partitionResultArtifactIndices);
                    }

                    var partitionArtifactIndexRemappingDictionary = new Dictionary <int, int>();
                    artifactIndexRemappingDictionaries.Add(partitionArtifactIndexRemappingDictionary);

                    List <int> allPartitionArtifactIndicesList = allPartitionArtifactIndices
                                                                 .OrderBy(index => index)
                                                                 .ToList();

                    int numPartitionIndices = 0;
                    foreach (int originalIndex in allPartitionArtifactIndicesList)
                    {
                        partitionArtifactIndexRemappingDictionary.Add(originalIndex, numPartitionIndices++);
                    }

                    // Copy the artifacts corresponding to the complete set of indices.
                    var artifacts = new List <Artifact>();
                    foreach (int originalIndex in allPartitionArtifactIndicesList)
                    {
                        Artifact originalArtifact  = originalRun.Artifacts[originalIndex];
                        Artifact partitionArtifact = deepClone
                            ? originalArtifact.DeepClone()
                            : new Artifact(originalArtifact);

                        artifacts.Add(partitionArtifact);
                    }

                    if (artifacts.Count > 0)
                    {
                        partitionRun.Artifacts = artifacts;
                    }

                    partitionLog.Runs.Add(partitionRun);
                }
            }

            // Traverse the entire log, fixing the index mappings for indices that appear
            // in the remapping dictionaries.
            var remappingVisitor = new PartitionedIndexRemappingVisitor(artifactIndexRemappingDictionaries);

            remappingVisitor.VisitSarifLog(partitionLog);

            return(partitionLog);
        }
Exemplo n.º 2
0
        private SarifLog CreatePartitionLog(T partitionValue)
        {
            SarifLog partitionLog;

            if (deepClone)
            {
                // Save time and space by not cloning the runs unless and until necessary. We will
                // only need to clone the runs that have results in this partition.
                IList <Run> originalRuns = originalLog.Runs;
                originalLog.Runs = null;

                partitionLog = originalLog.DeepClone();

                originalLog.Runs = originalRuns;
            }
            else
            {
                partitionLog = new SarifLog(originalLog)
                {
                    Runs = null
                };
            }

            partitionLog.Runs = new List <Run>();
            partitionLog.SetProperty(PartitionValuePropertyName, partitionValue);

            var artifactIndexRemappingDictionaries = new List <Dictionary <int, int> >();

            for (int iOriginalRun = 0; iOriginalRun < partitionRunInfos.Count; ++iOriginalRun)
            {
                // Are there results for this run in this partition?
                if (partitionRunInfos[iOriginalRun].ResultDictionary.TryGetValue(partitionValue, out List <Result> results))
                {
                    // Yes, so we'll need a copy of the original run in which the results, and
                    // certain run-level collections such as Run.Artifacts, have been replaced.
                    Run originalRun = originalLog.Runs[iOriginalRun];
                    Run partitionRun;
                    if (deepClone)
                    {
                        // Save time and space by only cloning the necessary results and associated
                        // collection elements. We already cloned the relevant results in VisitResult.
                        IList <Result>   originalResults   = originalRun.Results;
                        IList <Artifact> originalArtifacts = originalRun.Artifacts;
                        originalRun.Results   = null;
                        originalRun.Artifacts = null;

                        partitionRun = originalRun.DeepClone();

                        originalRun.Results   = originalResults;
                        originalRun.Artifacts = originalArtifacts;
                    }
                    else
                    {
                        partitionRun = new Run(originalRun)
                        {
                            Results   = null,
                            Artifacts = null
                        };
                    }

                    partitionRun.Results = results;

                    // Construct a mapping from the indices in the original run to the indices
                    // in the partition run. This includes both the indices relevant to the
                    // results in this partition, and indices that appear in all partitions
                    // because they are mentioned outside of any result (we refer to these as
                    // "global" indices).
                    IEnumerable <int> allPartitionArtifactIndices = partitionRunInfos[iOriginalRun].GlobalArtifactIndices;

                    if (partitionRunInfos[iOriginalRun].ArtifactIndicesDictionary.TryGetValue(partitionValue, out HashSet <int> partitionResultArtifactIndices))
                    {
                        allPartitionArtifactIndices = allPartitionArtifactIndices.Union(partitionResultArtifactIndices);
                    }

                    var partitionArtifactIndexRemappingDictionary = new Dictionary <int, int>();
                    artifactIndexRemappingDictionaries.Add(partitionArtifactIndexRemappingDictionary);

                    List <int> allPartitionArtifactIndicesList = allPartitionArtifactIndices
                                                                 .OrderBy(index => index)
                                                                 .ToList();

                    int numPartitionIndices = 0;
                    foreach (int originalIndex in allPartitionArtifactIndicesList)
                    {
                        partitionArtifactIndexRemappingDictionary.Add(originalIndex, numPartitionIndices++);
                    }

                    // Copy the artifacts corresponding to the complete set of indices.
                    var artifacts = new List <Artifact>();
                    foreach (int originalIndex in allPartitionArtifactIndicesList)
                    {
                        Artifact originalArtifact  = originalRun.Artifacts[originalIndex];
                        Artifact partitionArtifact = deepClone
                            ? originalArtifact.DeepClone()
                            : new Artifact(originalArtifact);

                        artifacts.Add(partitionArtifact);
                    }

                    if (artifacts.Any())
                    {
                        partitionRun.Artifacts = artifacts;
                    }

                    partitionLog.Runs.Add(partitionRun);
                }
            }

            // Traverse the entire log, fixing the index mappings for indices that appear
            // in the remapping dictionaries.
            var remappingVisitor = new PartitionedIndexRemappingVisitor(artifactIndexRemappingDictionaries);

            remappingVisitor.VisitSarifLog(partitionLog);

            return(partitionLog);
        }