await FindAsyncWrapper(() => _databaseSet.AsNoTracking().FirstOrDefaultAsync(IdPredicate(id)) !, id);
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); }