Dynamic update for all writes for VehiclePreviousLog
This commit is contained in:
Binary file not shown.
@@ -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)
|
||||
|
||||
+54
-23
@@ -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();
|
||||
}
|
||||
|
||||
private IOrderedQueryable<Log> GetPreviousLogQuery(int endOdometer, string vehicleId, DateTime date, DateTime created)
|
||||
{
|
||||
return from pl in _db.Logs
|
||||
return (from pl in _db.Logs
|
||||
where pl.VehicleId == vehicleId &&
|
||||
((pl.Date <= date && pl.EndOdometer < endOdometer)
|
||||
|| (pl.EndOdometer == endOdometer && pl.Created < created))
|
||||
|| (pl.EndOdometer == endOdometer && pl.Created < created)) &&
|
||||
pl.LogId != excludeLogId
|
||||
orderby pl.EndOdometer descending, pl.Created descending
|
||||
select pl;
|
||||
select pl).FirstOrDefault();
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
@@ -12,7 +12,9 @@ namespace MileageTraker.Web.Migrations
|
||||
var populateSql =
|
||||
@"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
|
||||
))
|
||||
)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user