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.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)
+58 -27
View File
@@ -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<Log> 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)
@@ -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
))
)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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;