From 6f28fb1621515ea164bd47129ba524c816228661 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 7 Dec 2012 13:43:05 -0500 Subject: [PATCH] Dynamic update for all writes for VehiclePreviousLog --- Notes/UpdateAllVehiclePreviousLog.sql | Bin 1100 -> 1192 bytes Web/Controllers/LogController.cs | 7 +- Web/DAL/DataService.cs | 85 ++++++++++++------ .../201212042021486_AddVehiclePreviousLog.cs | 8 +- Web/Models/MileageLogType.cs | 2 +- Web/ViewModels/ConfirmCreateLogViewModel.cs | 2 +- 6 files changed, 69 insertions(+), 35 deletions(-) diff --git a/Notes/UpdateAllVehiclePreviousLog.sql b/Notes/UpdateAllVehiclePreviousLog.sql index 7d7e1482d31dd655c64a6c0c9d2228c9971883ab..728575af2686406e3dd806adc6a7375215c0ef3f 100644 GIT binary patch delta 123 zcmX@Zv4T_n|G!d(0)`ZZM1~TER0ahGABKE}bRb;}QbAsT+WNm3UhrypAh{1)y6-X*DI59*5jabMezwyQkMn>Ds2bsDVSwKnw D4hR=$ delta 48 zcmZ3%d4_}O|G$X|NfXa#ar!d^F}N_eG6YS$E6MK25X|7rptG5uk&|ii9wxcXX3Tkv E0E~(b4FCWD diff --git a/Web/Controllers/LogController.cs b/Web/Controllers/LogController.cs index 9135721..d757f92 100644 --- a/Web/Controllers/LogController.cs +++ b/Web/Controllers/LogController.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using MileageTraker.Web.DAL; @@ -86,7 +85,7 @@ namespace MileageTraker.Web.Controllers public ActionResult PreviousDetails(int id) { var log = _dataService.GetLog(id); - var previousLog = _dataService.GetPreviousLog(log); + var previousLog = _dataService.SearchPreviousLog(log); int logId; if (previousLog != null) { @@ -103,7 +102,7 @@ namespace MileageTraker.Web.Controllers public ActionResult NextDetails(int id) { var log = _dataService.GetLog(id); - var nextLog = _dataService.GetNextLog(log); + var nextLog = _dataService.SearchNextLog(log); int logId; if (nextLog != null) { @@ -170,6 +169,8 @@ namespace MileageTraker.Web.Controllers ModelState.Remove("Source"); ModelState.Remove("UserAgent"); ModelState.Remove("UserHostAddress"); + ModelState.Remove("VehiclePreviousLogId"); + ModelState.Remove("VehiclePreviousLog"); } public ActionResult Delete(int id) diff --git a/Web/DAL/DataService.cs b/Web/DAL/DataService.cs index 76a2363..d40962d 100644 --- a/Web/DAL/DataService.cs +++ b/Web/DAL/DataService.cs @@ -20,6 +20,14 @@ namespace MileageTraker.Web.DAL { log.Created = DateTime.Now; _db.Logs.Add(log); + + // update previous log links + var previousLog = SearchPreviousLog(log); + log.VehiclePreviousLog = previousLog; + var nextLog = SearchNextLog(log); + if (nextLog != null) + nextLog.VehiclePreviousLog = log; + _db.SaveChanges(); UpdateCurrentOdometer(log.VehicleId); @@ -190,60 +198,75 @@ namespace MileageTraker.Web.DAL return logs; } - public Log GetPreviousLog(Log current) + public Log SearchPreviousLog(Log current) { var vehicleId = current.VehicleId; var date = current.Date; var endOdometer = current.EndOdometer; - return GetPreviousLog(endOdometer, vehicleId, date, current.Created); + return SearchPreviousLog(endOdometer, vehicleId, date, current.Created, current.LogId); } - public Log GetPreviousLog(int endOdometer, string vehicleId, DateTime date, DateTime created) + public Log SearchPreviousLog(int endOdometer, string vehicleId, DateTime date, DateTime created, int? excludeLogId = null) { - return GetPreviousLogQuery(endOdometer, vehicleId, date, created).FirstOrDefault(); + return (from pl in _db.Logs + where pl.VehicleId == vehicleId && + ((pl.Date <= date && pl.EndOdometer < endOdometer) + || (pl.EndOdometer == endOdometer && pl.Created < created)) && + pl.LogId != excludeLogId + orderby pl.EndOdometer descending, pl.Created descending + select pl).FirstOrDefault(); } - private IOrderedQueryable GetPreviousLogQuery(int endOdometer, string vehicleId, DateTime date, DateTime created) - { - return from pl in _db.Logs - where pl.VehicleId == vehicleId && - ((pl.Date <= date && pl.EndOdometer < endOdometer) - || (pl.EndOdometer == endOdometer && pl.Created < created)) - orderby pl.EndOdometer descending, pl.Created descending - select pl; - } - - public Log GetNextLog(Log current) + public Log SearchNextLog(Log current) { var vehicleId = current.VehicleId; var date = current.Date; var endOdometer = current.EndOdometer; - return GetNextLog(endOdometer, vehicleId, date, current.Created); + return SearchNextLog(endOdometer, vehicleId, date, current.Created, current.LogId); } - public Log GetNextLog(int endOdometer, string vehicleId, DateTime date, DateTime created) + public Log SearchNextLog(int endOdometer, string vehicleId, DateTime date, DateTime created, int? excludeLogId = null) { return (from nl in GetLogs() where nl.VehicleId == vehicleId && ((nl.Date >= date && nl.EndOdometer > endOdometer) - || (nl.EndOdometer == endOdometer && nl.Created > created)) + || (nl.EndOdometer == endOdometer && nl.Created > created)) && + nl.LogId != excludeLogId orderby nl.EndOdometer ascending, nl.Created ascending select nl).FirstOrDefault(); } - + public void UpdateLog(Log log) { - var currentLog = GetLog(log.LogId); + _db.Logs.Attach(log); + var original = _db.Logs.Find(log.LogId); // ignore these properties while updating - log.Created = currentLog.Created; - log.Source = currentLog.Source; - log.UserAgent = currentLog.UserAgent; - log.UserHostAddress = currentLog.UserHostAddress; + log.Created = original.Created; + log.Source = original.Source; + log.UserAgent = original.UserAgent; + log.UserHostAddress = original.UserHostAddress; - _db.Entry(currentLog).CurrentValues.SetValues(log); + // remove from the list + var nextLog = + (from l in _db.Logs + where l.VehiclePreviousLogId == log.LogId + select l).FirstOrDefault(); + if (nextLog != null) + nextLog.VehiclePreviousLogId = log.VehiclePreviousLogId; - _db.Entry(currentLog).State = EntityState.Modified; + log.VehiclePreviousLog = null; + log.VehiclePreviousLogId = null; + + // add it back in new position + var previousLog = SearchPreviousLog(log); + if (previousLog != null) + log.VehiclePreviousLogId = previousLog.LogId; + var newNextLog = SearchNextLog(log); + if (newNextLog != null) + newNextLog.VehiclePreviousLogId = log.LogId; + + _db.Entry(log).State = EntityState.Modified; _db.SaveChanges(); UpdateCurrentOdometer(log.VehicleId); @@ -252,6 +275,14 @@ namespace MileageTraker.Web.DAL public void DeleteLog(int id) { var log = _db.Logs.Find(id); + + var nextLog = + (from l in _db.Logs + where l.VehiclePreviousLogId == log.LogId + select l).FirstOrDefault(); + if (nextLog != null) + nextLog.VehiclePreviousLog = log.VehiclePreviousLog; + _db.Logs.Remove(log); _db.SaveChanges(); @@ -335,7 +366,7 @@ namespace MileageTraker.Web.DAL // TODO HACK for testing, delete later try { - if (_db.Logs.Count() == 0) + if (!_db.Logs.Any()) return null; } catch (NullReferenceException) diff --git a/Web/Migrations/201212042021486_AddVehiclePreviousLog.cs b/Web/Migrations/201212042021486_AddVehiclePreviousLog.cs index df371f3..2dd2959 100644 --- a/Web/Migrations/201212042021486_AddVehiclePreviousLog.cs +++ b/Web/Migrations/201212042021486_AddVehiclePreviousLog.cs @@ -10,9 +10,11 @@ namespace MileageTraker.Web.Migrations AddForeignKey("Log", "VehiclePreviousLogId", "Log", "LogId"); CreateIndex("Log", "VehiclePreviousLogId"); var populateSql = - @"WITH summary AS ( + @"WITH summary AS ( SELECT - ROW_NUMBER() OVER (PARTITION BY l.LogId ORDER BY l.LogId ASC, pl.EndOdometer DESC, pl.Created DESC) AS rk, + ROW_NUMBER() OVER ( + PARTITION BY l.LogId + ORDER BY pl.EndOdometer DESC, pl.Created DESC) AS rk, l.LogId, pl.LogId as PreviousLogId FROM [Log] as l, @@ -22,7 +24,7 @@ namespace MileageTraker.Web.Migrations AND ((pl.[Date] <= l.[Date] AND pl.EndOdometer < l.EndOdometer) OR ( - pl.EndOdometer < l.EndOdometer + pl.EndOdometer = l.EndOdometer AND pl.Created < l.Created )) ) diff --git a/Web/Models/MileageLogType.cs b/Web/Models/MileageLogType.cs index 3b12c85..904eabb 100644 --- a/Web/Models/MileageLogType.cs +++ b/Web/Models/MileageLogType.cs @@ -26,7 +26,7 @@ namespace MileageTraker.Web.Models public static implicit operator MileageLogType(MileageLogTypeWrapper w) { - return w == null ? default(MileageLogType) : w.Enum; + return w == null ? default(MileageLogType) : w.Enum; } public static implicit operator MileageLogTypeWrapper(MileageLogType c) diff --git a/Web/ViewModels/ConfirmCreateLogViewModel.cs b/Web/ViewModels/ConfirmCreateLogViewModel.cs index 0b9e8dd..1b5acda 100644 --- a/Web/ViewModels/ConfirmCreateLogViewModel.cs +++ b/Web/ViewModels/ConfirmCreateLogViewModel.cs @@ -33,7 +33,7 @@ namespace MileageTraker.Web.ViewModels var endOdometer = int.Parse(createLogViewModel.EndOdometer); var date = DateTime.Parse(createLogViewModel.Date); - var previousLog = dataService.GetPreviousLog(endOdometer, createLogViewModel.VehicleId, date, DateTime.Now); + var previousLog = dataService.SearchPreviousLog(endOdometer, createLogViewModel.VehicleId, date, DateTime.Now); if (previousLog != null) { PreviousOdometer = previousLog.EndOdometer;