// -------------------------------------------------------------------- // TYukariRequest → TYukariStatistics へコピー // -------------------------------------------------------------------- private static void CopyYukariRequestToYukariStatistics(TYukariRequest yukariRequest, TYukariStatistics yukariStatistics) { // EF Core では、代入しても実際の値が更新されていなければ更新と判定されない(無駄な保存が発生しない)模様なので、プログラムでは更新チェックはせずに常に代入する // 途中で変わるものについては、変わったら Dirty フラグを立てる必要がある yukariStatistics.RequestId = yukariRequest.Id; yukariStatistics.RequestMoviePath = yukariRequest.Path; yukariStatistics.RequestSinger = yukariRequest.Singer; yukariStatistics.Dirty |= yukariStatistics.RequestComment != yukariRequest.Comment; yukariStatistics.RequestComment = yukariRequest.Comment; yukariStatistics.Dirty |= yukariStatistics.RequestOrder != yukariRequest.Order; yukariStatistics.RequestOrder = yukariRequest.Order; yukariStatistics.Dirty |= yukariStatistics.RequestKeyChange != yukariRequest.KeyChange; yukariStatistics.RequestKeyChange = yukariRequest.KeyChange; }
// -------------------------------------------------------------------- // 統計を必要に応じて更新 // -------------------------------------------------------------------- private static void UpdateExistStatisticsIfNeeded(TYukariStatistics existStatistics, TYukariRequest yukariRequest, DbSet <TFound> founds) { CopyYukariRequestToYukariStatistics(yukariRequest, existStatistics); CopyFoundToYukariStatisticsIfNeeded(founds, existStatistics); }
// -------------------------------------------------------------------- // request.db の 1 レコードが既に統計に追加されていればその統計レコードを返す // -------------------------------------------------------------------- private static TYukariStatistics?ExistStatisticsRecord(DbSet <TYukariStatistics> yukariStatistics, TYukariRequest yukariRequest) { // request.db ファイル名、ゆかり予約 Id、Path、Singer のすべてが一致したものを既存レコードとする // かつ、この PC で追加したレコード(ID 接頭辞の先頭が一致するレコード)を既存レコードとする // かつ、推定予約日時が全消去検知日時以降のものを既存レコードとする // ルーム名は途中で変更されることがあるので判定に使用しない return(yukariStatistics.Where(x => x.RequestTime >= YlModel.Instance.EnvModel.YlSettings.LastYukariRequestClearTime && x.RequestId == yukariRequest.Id && x.RequestDatabasePath == YlModel.Instance.EnvModel.YlSettings.YukariRequestDatabasePath() && x.RequestMoviePath == yukariRequest.Path && x.RequestSinger == yukariRequest.Singer && EF.Functions.Like(x.Id, $"{YlModel.Instance.EnvModel.YlSettings.IdPrefix}%")).OrderByDescending(x => x.RequestTime).FirstOrDefault()); }
// ==================================================================== // private 関数 // ==================================================================== // -------------------------------------------------------------------- // request.db の 1 レコードを統計に追加 // -------------------------------------------------------------------- private async Task AddYukariRequest(DbSet <TYukariStatistics> yukariStatistics, TYukariRequest yukariRequest, DbSet <TFound> founds) { try { Debug.Assert(MainWindowViewModel != null, "AddYukariRequest() MainWindowViewModel is null"); await YlCommon.InputIdPrefixIfNeededWithInvoke(MainWindowViewModel); } catch (Exception) { // OperationCanceledException を通常の例外に変換 throw new Exception("ID 接頭辞が設定されていません。"); } Debug.Assert(YlModel.Instance.EnvModel.YlSettings.IdPrefix != null, "AddYukariRequest() IdPrefix is null"); TYukariStatistics yukariStatisticsRecord = new() { Id = YlModel.Instance.EnvModel.YlSettings.PrepareYukariStatisticsLastId(yukariStatistics), Dirty = true, RequestDatabasePath = YlModel.Instance.EnvModel.YlSettings.YukariRequestDatabasePath(), RequestTime = YukariRequestContext.LastWriteMjd(), RoomName = YlModel.Instance.EnvModel.YlSettings.YukariRoomName, //IdPrefix = YukaListerModel.Instance.EnvModel.YlSettings.IdPrefix, }; CopyYukariRequestToYukariStatistics(yukariRequest, yukariStatisticsRecord); CopyFoundToYukariStatisticsIfNeeded(founds, yukariStatisticsRecord); yukariStatistics.Add(yukariStatisticsRecord); Debug.WriteLine("AddYukariRequest() 追加: " + yukariStatisticsRecord.RequestMoviePath); }