Dynamic update for all writes for VehiclePreviousLog

This commit is contained in:
2012-12-07 13:43:05 -05:00
parent ea2d8b4262
commit 6f28fb1621
6 changed files with 69 additions and 35 deletions
Binary file not shown.
+4 -3
View File
@@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using MileageTraker.Web.DAL; using MileageTraker.Web.DAL;
@@ -86,7 +85,7 @@ namespace MileageTraker.Web.Controllers
public ActionResult PreviousDetails(int id) public ActionResult PreviousDetails(int id)
{ {
var log = _dataService.GetLog(id); var log = _dataService.GetLog(id);
var previousLog = _dataService.GetPreviousLog(log); var previousLog = _dataService.SearchPreviousLog(log);
int logId; int logId;
if (previousLog != null) if (previousLog != null)
{ {
@@ -103,7 +102,7 @@ namespace MileageTraker.Web.Controllers
public ActionResult NextDetails(int id) public ActionResult NextDetails(int id)
{ {
var log = _dataService.GetLog(id); var log = _dataService.GetLog(id);
var nextLog = _dataService.GetNextLog(log); var nextLog = _dataService.SearchNextLog(log);
int logId; int logId;
if (nextLog != null) if (nextLog != null)
{ {
@@ -170,6 +169,8 @@ namespace MileageTraker.Web.Controllers
ModelState.Remove("Source"); ModelState.Remove("Source");
ModelState.Remove("UserAgent"); ModelState.Remove("UserAgent");
ModelState.Remove("UserHostAddress"); ModelState.Remove("UserHostAddress");
ModelState.Remove("VehiclePreviousLogId");
ModelState.Remove("VehiclePreviousLog");
} }
public ActionResult Delete(int id) public ActionResult Delete(int id)
+58 -27
View File
@@ -20,6 +20,14 @@ namespace MileageTraker.Web.DAL
{ {
log.Created = DateTime.Now; log.Created = DateTime.Now;
_db.Logs.Add(log); _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(); _db.SaveChanges();
UpdateCurrentOdometer(log.VehicleId); UpdateCurrentOdometer(log.VehicleId);
@@ -190,60 +198,75 @@ namespace MileageTraker.Web.DAL
return logs; return logs;
} }
public Log GetPreviousLog(Log current) public Log SearchPreviousLog(Log current)
{ {
var vehicleId = current.VehicleId; var vehicleId = current.VehicleId;
var date = current.Date; var date = current.Date;
var endOdometer = current.EndOdometer; 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<Log> GetPreviousLogQuery(int endOdometer, string vehicleId, DateTime date, DateTime created) public Log SearchNextLog(Log current)
{
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)
{ {
var vehicleId = current.VehicleId; var vehicleId = current.VehicleId;
var date = current.Date; var date = current.Date;
var endOdometer = current.EndOdometer; 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() return (from nl in GetLogs()
where nl.VehicleId == vehicleId && where nl.VehicleId == vehicleId &&
((nl.Date >= date && nl.EndOdometer > endOdometer) ((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 orderby nl.EndOdometer ascending, nl.Created ascending
select nl).FirstOrDefault(); select nl).FirstOrDefault();
} }
public void UpdateLog(Log log) 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 // ignore these properties while updating
log.Created = currentLog.Created; log.Created = original.Created;
log.Source = currentLog.Source; log.Source = original.Source;
log.UserAgent = currentLog.UserAgent; log.UserAgent = original.UserAgent;
log.UserHostAddress = currentLog.UserHostAddress; 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(); _db.SaveChanges();
UpdateCurrentOdometer(log.VehicleId); UpdateCurrentOdometer(log.VehicleId);
@@ -252,6 +275,14 @@ namespace MileageTraker.Web.DAL
public void DeleteLog(int id) public void DeleteLog(int id)
{ {
var log = _db.Logs.Find(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.Logs.Remove(log);
_db.SaveChanges(); _db.SaveChanges();
@@ -335,7 +366,7 @@ namespace MileageTraker.Web.DAL
// TODO HACK for testing, delete later // TODO HACK for testing, delete later
try try
{ {
if (_db.Logs.Count() == 0) if (!_db.Logs.Any())
return null; return null;
} }
catch (NullReferenceException) catch (NullReferenceException)
@@ -10,9 +10,11 @@ namespace MileageTraker.Web.Migrations
AddForeignKey("Log", "VehiclePreviousLogId", "Log", "LogId"); AddForeignKey("Log", "VehiclePreviousLogId", "Log", "LogId");
CreateIndex("Log", "VehiclePreviousLogId"); CreateIndex("Log", "VehiclePreviousLogId");
var populateSql = var populateSql =
@"WITH summary AS ( @"WITH summary AS (
SELECT 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 l.LogId, pl.LogId as PreviousLogId
FROM FROM
[Log] as l, [Log] as l,
@@ -22,7 +24,7 @@ namespace MileageTraker.Web.Migrations
AND ((pl.[Date] <= l.[Date] AND ((pl.[Date] <= l.[Date]
AND pl.EndOdometer < l.EndOdometer) AND pl.EndOdometer < l.EndOdometer)
OR ( OR (
pl.EndOdometer < l.EndOdometer pl.EndOdometer = l.EndOdometer
AND pl.Created < l.Created AND pl.Created < l.Created
)) ))
) )
+1 -1
View File
@@ -26,7 +26,7 @@ namespace MileageTraker.Web.Models
public static implicit operator MileageLogType(MileageLogTypeWrapper w) 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) public static implicit operator MileageLogTypeWrapper(MileageLogType c)
+1 -1
View File
@@ -33,7 +33,7 @@ namespace MileageTraker.Web.ViewModels
var endOdometer = int.Parse(createLogViewModel.EndOdometer); var endOdometer = int.Parse(createLogViewModel.EndOdometer);
var date = DateTime.Parse(createLogViewModel.Date); 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) if (previousLog != null)
{ {
PreviousOdometer = previousLog.EndOdometer; PreviousOdometer = previousLog.EndOdometer;