Dynamic update for all writes for VehiclePreviousLog
This commit is contained in:
Binary file not shown.
@@ -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
@@ -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
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user