Esempio n. 1
0
 await FindAsyncWrapper(() => _databaseSet.AsNoTracking().FirstOrDefaultAsync(IdPredicate(id)) !, id);
Esempio n. 2
0
        public WorkspaceData LoadChanges(WorkspaceData savedData, IDictionary <long, bool> requestedPeptideAnalyses)
        {
            var workspaceData = savedData;

            lock (_eventWaitHandle)
            {
                if (!_isRunning)
                {
                    return(null);
                }
            }
            var peptides        = ToMutableDictionary(workspaceData.Peptides);
            var msDataFiles     = ToMutableDictionary(workspaceData.MsDataFiles);
            var peptideAnalyses = ToMutableDictionary(workspaceData.PeptideAnalyses);

            using (var session = _workspace.OpenSession())
            {
                var  changedPeptideIds         = new HashSet <long>();
                var  changedDataFileIds        = new HashSet <long>();
                var  changedPeptideAnalysisIds = new HashSet <long>();
                bool workspaceChanged          = false;
                if (workspaceData.LastChangeLogId.HasValue)
                {
                    long lastChangeLogId = workspaceData.LastChangeLogId.Value;
                    var  changeLogs      = session.CreateCriteria <DbChangeLog>()
                                           .Add(Restrictions.Gt("Id", workspaceData.LastChangeLogId))
                                           .List <DbChangeLog>();
                    foreach (var dbChangeLog in changeLogs)
                    {
                        if (dbChangeLog.PeptideId.HasValue)
                        {
                            changedPeptideIds.Add(dbChangeLog.PeptideId.Value);
                            peptides.Remove(dbChangeLog.PeptideId.Value);
                        }
                        if (dbChangeLog.MsDataFileId.HasValue)
                        {
                            changedDataFileIds.Add(dbChangeLog.MsDataFileId.Value);
                            msDataFiles.Remove(dbChangeLog.MsDataFileId.Value);
                        }
                        if (dbChangeLog.PeptideAnalysisId.HasValue)
                        {
                            changedPeptideAnalysisIds.Add(dbChangeLog.PeptideAnalysisId.Value);
                            peptideAnalyses.Remove(dbChangeLog.PeptideAnalysisId.Value);
                        }
                        if (dbChangeLog.WorkspaceId.HasValue)
                        {
                            workspaceChanged = true;
                        }
                        lastChangeLogId = Math.Max(lastChangeLogId, dbChangeLog.GetId());
                    }
                    workspaceData = workspaceData.SetLastChangeLogId(lastChangeLogId);
                }
                else
                {
                    workspaceChanged = true;
                    long lastChangeLogId = (long?)session.CreateQuery("SELECT Max(T.Id) FROM " + typeof(DbChangeLog) + " T")
                                           .UniqueResult() ?? 0;
                    var dbWorkspace = session.CreateCriteria <DbWorkspace>().UniqueResult <DbWorkspace>();
                    workspaceData = workspaceData
                                    .SetLastChangeLogId(lastChangeLogId)
                                    .SetDbWorkspaceId(dbWorkspace.Id);
                }

                if (workspaceChanged)
                {
                    var settings =
                        session.CreateCriteria <DbSetting>()
                        .List <DbSetting>()
                        .ToDictionary(dbSetting => dbSetting.Name, dbSetting => dbSetting.Value);
                    var tracerDefs =
                        session.CreateCriteria <DbTracerDef>()
                        .List <DbTracerDef>()
                        .ToDictionary(dbTracerDef => dbTracerDef.Name,
                                      dbTracerDef => new TracerDefData(dbTracerDef));
                    var modifications =
                        session.CreateCriteria <DbModification>()
                        .List <DbModification>()
                        .ToDictionary(dbModification => dbModification.Symbol,
                                      dbModification => dbModification.DeltaMass);
                    workspaceData = workspaceData
                                    .SetSettings(ImmutableSortedList.FromValues(settings))
                                    .SetTracerDefs(ImmutableSortedList.FromValues(tracerDefs))
                                    .SetModifications(ImmutableSortedList.FromValues(modifications));
                }

                foreach (var dbPeptide in EntitiesWithIdGreaterThanOrOneOf <DbPeptide>(session, GetLastId(savedData.Peptides), changedPeptideIds))
                {
                    peptides.Add(dbPeptide.GetId(), new PeptideData(dbPeptide));
                }
                workspaceData = workspaceData.SetPeptides(ImmutableSortedList.FromValues(peptides));

                // Load the MSDataFiles
                var dataFileIdPredicate = new IdPredicate(GetLastId(savedData.MsDataFiles), changedDataFileIds);
                var psmsByDataFileId    = session.CreateQuery("FROM " + typeof(DbPeptideSpectrumMatch) + " M WHERE " +
                                                              dataFileIdPredicate.GetSql("M.MsDataFile.Id")).List <DbPeptideSpectrumMatch>().ToLookup(psm => psm.MsDataFile.Id);
                foreach (var dbMsDataFile in EntitiesWithIdGreaterThanOrOneOf <DbMsDataFile>(session, GetLastId(savedData.MsDataFiles), changedDataFileIds))
                {
                    var msDataFileData = new MsDataFileData(dbMsDataFile);
                    var psmTimes       = psmsByDataFileId[dbMsDataFile.GetId()].ToLookup(psm => psm.ModifiedSequence, psm => psm.RetentionTime);
                    msDataFileData = msDataFileData.SetRetentionTimesByModifiedSequence(
                        psmTimes.Select(grouping => new KeyValuePair <string, double>(grouping.Key, grouping.Min())));
                    msDataFiles.Add(dbMsDataFile.GetId(), msDataFileData);
                }

                workspaceData = workspaceData.SetMsDataFiles(ImmutableSortedList.FromValues(msDataFiles));
                var idsToSnapshot           = new HashSet <long>(changedPeptideAnalysisIds);
                var chromatogramsToSnapshot = new HashSet <long>();
                if (null != requestedPeptideAnalyses)
                {
                    foreach (var pair in requestedPeptideAnalyses)
                    {
                        PeptideAnalysisData existing;
                        if (peptideAnalyses.TryGetValue(pair.Key, out existing))
                        {
                            if (pair.Value)
                            {
                                if (existing.ChromatogramsWereLoaded)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                peptideAnalyses[pair.Key] = existing.UnloadChromatograms();
                                continue;
                            }
                        }
                        idsToSnapshot.Add(pair.Key);
                        if (pair.Value)
                        {
                            chromatogramsToSnapshot.Add(pair.Key);
                        }
                    }
                }
                var loadedPeptideAnalyses = PeptideAnalysisSnapshot.Query(session,
                                                                          new IdPredicate(GetLastId(workspaceData.PeptideAnalyses) + 1, idsToSnapshot),
                                                                          new IdPredicate(null, chromatogramsToSnapshot));
                foreach (var entry in loadedPeptideAnalyses)
                {
                    peptideAnalyses[entry.Key] = entry.Value;
                }
                workspaceData = workspaceData.SetPeptideAnalyses(ImmutableSortedList.FromValues(peptideAnalyses));
            }

            return(workspaceData);
        }