moved history over to objectdb

This commit is contained in:
kay.one 2013-02-23 13:29:22 -08:00
parent cf8be4bf8f
commit f568fdad6a
20 changed files with 259 additions and 494 deletions

View File

@ -5,6 +5,7 @@ using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.History;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers;
@ -65,9 +66,9 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
firstQuality = new QualityModel(QualityTypes.Bluray1080p, true);
secondQuality = new QualityModel(QualityTypes.Bluray1080p, true);
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 4)).Returns(secondQuality);
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 5)).Returns<QualityModel>(null);
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 4)).Returns(secondQuality);
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 5)).Returns<QualityModel>(null);
}
private void WithFirstReportUpgradable()
@ -123,7 +124,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
parseResultSingle.Quality = new QualityModel(QualityTypes.WEBDL1080p, false);
firstQuality = new QualityModel(QualityTypes.WEBDL1080p, false);
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
_upgradeHistory.IsSatisfiedBy(parseResultSingle).Should().BeFalse();
}

View File

@ -28,7 +28,7 @@ namespace NzbDrone.Core.Test.Framework
}
}
public abstract class CoreTest<TSubject> : CoreTest where TSubject: class
public abstract class CoreTest<TSubject> : CoreTest where TSubject : class
{
private TSubject _subject;

View File

@ -0,0 +1,108 @@
using System;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.History;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Repository.Quality;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.HistoryTests
{
[TestFixture]
public class HistoryServiceTest : ObjectDbTest<HistoryRepository, History.History>
{
[Test]
public void Trim_Items()
{
var historyItem = Builder<History.History>.CreateListOfSize(30)
.All()
.With(c=>c.OID = 0)
.TheFirst(10).With(c => c.Date = DateTime.Now)
.TheNext(20).With(c => c.Date = DateTime.Now.AddDays(-31))
.Build();
Db.InsertMany(historyItem);
AllStoredModels.Should().HaveCount(30);
Subject.Trim();
AllStoredModels.Should().HaveCount(10);
AllStoredModels.Should().OnlyContain(s => s.Date > DateTime.Now.AddDays(-30));
}
[Test]
public void GetBestQualityInHistory_no_result()
{
Subject.GetBestQualityInHistory(12, 12, 12).Should().Be(null);
}
[Test]
public void GetBestQualityInHistory_single_result()
{
var series = Builder<Series>.CreateNew().Build();
var episode = Builder<Episode>.CreateNew()
.With(c => c.Series = series)
.With(c => c.SeriesId = series.OID)
.Build();
var history = Builder<History.History>.CreateNew()
.With(c => c.OID = 0)
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
.With(h => h.Episode = episode)
.Build();
Db.Insert(history);
var result = Subject.GetBestQualityInHistory(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
result.Should().NotBeNull();
result.Quality.Should().Be(QualityTypes.Bluray720p);
result.Proper.Should().BeTrue();
}
[Test]
public void GetBestQualityInHistory_should_return_highest_result()
{
var series = Builder<Series>.CreateNew().Build();
var episode = Builder<Episode>.CreateNew()
.With(c => c.Series = series)
.With(c => c.SeriesId = series.OID)
.Build();
var history = Builder<History.History>
.CreateListOfSize(5)
.All()
.With(c => c.OID = 0)
.With(h => h.Episode = episode)
.TheFirst(1)
.With(h => h.Quality = new QualityModel(QualityTypes.DVD, true))
.TheNext(1)
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
.TheNext(1)
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
.TheNext(1)
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, false))
.TheNext(1)
.With(h => h.Quality = new QualityModel(QualityTypes.SDTV, true))
.Build();
Db.InsertMany(history);
var result = Subject.GetBestQualityInHistory(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
result.Should().NotBeNull();
result.Quality.Should().Be(QualityTypes.Bluray720p);
result.Proper.Should().BeTrue();
}
}
}

View File

@ -248,7 +248,7 @@
<Compile Include="QualityTest.cs" />
<Compile Include="RootFolderTests\RootFolderServiceFixture.cs" />
<Compile Include="Indexers\IndexerServiceTest.cs" />
<Compile Include="ProviderTests\HistoryProviderTest.cs" />
<Compile Include="HistoryTests\HistoryServiceTest.cs" />
<Compile Include="ProviderTests\MediaFileProviderTest.cs" />
<Compile Include="ProviderTests\ConfigProviderTests\ConfigProviderFixture.cs" />
<Compile Include="TvTests\EpisodeProviderTests\EpisodeProviderTest.cs" />

View File

@ -5,12 +5,12 @@ using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.History;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Providers.DownloadClients;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality;
using NzbDrone.Core.Test.Framework;
@ -98,11 +98,11 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
Mocker.GetMock<BlackholeProvider>()
.Verify(s => s.DownloadNzb(It.IsAny<String>(), It.IsAny<String>(), true), Times.Never());
Mocker.GetMock<HistoryProvider>()
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 12 && h.SeriesId == 5)), Times.Once());
Mocker.GetMock<HistoryService>()
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[0])), Times.Once());
Mocker.GetMock<HistoryProvider>()
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 99 && h.SeriesId == 5)), Times.Once());
Mocker.GetMock<HistoryService>()
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[1])), Times.Once());
Mocker.GetMock<IEpisodeService>()
.Verify(c => c.MarkEpisodeAsFetched(12));
@ -133,11 +133,11 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
Mocker.GetMock<BlackholeProvider>()
.Verify(s => s.DownloadNzb(It.IsAny<String>(), It.IsAny<String>(), true), Times.Once());
Mocker.GetMock<HistoryProvider>()
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 12 && h.SeriesId == 5)), Times.Once());
Mocker.GetMock<HistoryService>()
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[0])), Times.Once());
Mocker.GetMock<HistoryProvider>()
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 99 && h.SeriesId == 5)), Times.Once());
Mocker.GetMock<HistoryService>()
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[1])), Times.Once());
Mocker.GetMock<IEpisodeService>()
.Verify(c => c.MarkEpisodeAsFetched(12));
@ -161,8 +161,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
//Act
Mocker.Resolve<DownloadProvider>().DownloadReport(parseResult);
Mocker.GetMock<HistoryProvider>()
.Verify(s => s.Add(It.IsAny<History>()), Times.Never());
Mocker.GetMock<HistoryService>()
.Verify(s => s.Add(It.IsAny<History.History>()), Times.Never());
Mocker.GetMock<IEpisodeService>()

View File

@ -1,278 +0,0 @@
using System;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ProviderTests
{
[TestFixture]
// ReSharper disable InconsistentNaming
public class HistoryProviderTest : SqlCeTest
{
[Test]
public void AllItems()
{
WithRealDb();
//Setup
var historyItem = Builder<History>.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.Build();
Db.InsertMany(historyItem);
//Act
var result = Mocker.Resolve<HistoryProvider>().AllItems();
//Assert
result.Should().HaveSameCount(historyItem);
}
[Test]
public void AllItemsWithRelationships()
{
WithRealDb();
var seriesOne = Builder<Series>.CreateNew().With(s => s.SeriesId = 12345).Build();
var seriesTwo = Builder<Series>.CreateNew().With(s => s.SeriesId = 54321).Build();
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
var historyItems = Builder<History>
.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.TheFirst(5)
.With(h => h.SeriesId = seriesOne.SeriesId)
.TheLast(5)
.With(h => h.SeriesId = seriesTwo.SeriesId)
.Build();
Db.InsertMany(historyItems);
Db.InsertMany(episodes);
Db.Insert(seriesOne);
Db.Insert(seriesTwo);
//Act
var result = Mocker.Resolve<HistoryProvider>().AllItemsWithRelationships();
//Assert
result.Should().HaveSameCount(historyItems);
foreach (var history in result)
{
Assert.NotNull(history.Episode);
Assert.That(!String.IsNullOrEmpty(history.SeriesTitle));
}
}
[Test]
public void PurgeItem()
{
WithRealDb();
var historyItem = Builder<History>
.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.Build();
Db.InsertMany(historyItem);
//Act
Db.Fetch<History>().Should().HaveCount(10);
Mocker.Resolve<HistoryProvider>().Purge();
//Assert
Db.Fetch<History>().Should().HaveCount(0);
}
[Test]
public void Trim_Items()
{
WithRealDb();
var historyItem = Builder<History>.CreateListOfSize(30)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.TheFirst(10).With(c => c.Date = DateTime.Now)
.TheNext(20).With(c => c.Date = DateTime.Now.AddDays(-31))
.Build();
Db.InsertMany(historyItem);
//Act
Db.Fetch<History>().Should().HaveCount(30);
Mocker.Resolve<HistoryProvider>().Trim();
//Assert
var result = Db.Fetch<History>();
result.Should().HaveCount(10);
result.Should().OnlyContain(s => s.Date > DateTime.Now.AddDays(-30));
}
[Test]
public void GetBestQualityInHistory_no_result()
{
WithRealDb();
Mocker.Resolve<HistoryProvider>().GetBestQualityInHistory(12, 12, 12).Should().Be(null);
}
[Test]
public void GetBestQualityInHistory_single_result()
{
WithRealDb();
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
var historyEpisode = episodes[6];
var history = Builder<History>.CreateNew()
.With(h => h.Quality = QualityTypes.Bluray720p)
.With(h => h.IsProper = true)
.With(h => h.EpisodeId = historyEpisode.OID)
.Build();
Db.Insert(history);
Db.InsertMany(episodes);
//Act
var result = Mocker.Resolve<HistoryProvider>()
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
//Assert
result.Should().NotBeNull();
result.Quality.Should().Be(QualityTypes.Bluray720p);
result.Proper.Should().BeTrue();
}
[Test]
public void GetBestQualityInHistory_should_return_highest_result()
{
WithRealDb();
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
var historyEpisode = episodes[6];
var history = Builder<History>
.CreateListOfSize(5)
.All()
.With(h => h.EpisodeId = historyEpisode.OID)
.With(h => h.SeriesId = historyEpisode.SeriesId)
.TheFirst(1)
.With(h => h.Quality = QualityTypes.DVD)
.With(h => h.IsProper = true)
.TheNext(1)
.With(h => h.Quality = QualityTypes.Bluray720p)
.With(h => h.IsProper = false)
.TheNext(1)
.With(h => h.Quality = QualityTypes.Bluray720p)
.With(h => h.IsProper = true)
.TheNext(1)
.With(h => h.Quality = QualityTypes.Bluray720p)
.With(h => h.IsProper = false)
.TheNext(1)
.With(h => h.Quality = QualityTypes.SDTV)
.With(h => h.IsProper = true)
.Build();
Db.InsertMany(history);
Db.InsertMany(episodes);
//Act
var result = Mocker.Resolve<HistoryProvider>()
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
//Assert
result.Should().NotBeNull();
result.Quality.Should().Be(QualityTypes.Bluray720p);
result.Proper.Should().BeTrue();
}
[Test]
public void GetBestQualityInHistory_should_return_highest_weighted_result()
{
WithRealDb();
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
var historyEpisode = episodes[6];
var history = Builder<History>
.CreateListOfSize(5)
.All()
.With(h => h.EpisodeId = historyEpisode.OID)
.With(h => h.SeriesId = historyEpisode.SeriesId)
.TheFirst(1)
.With(h => h.Quality = QualityTypes.DVD)
.With(h => h.IsProper = true)
.TheNext(1)
.With(h => h.Quality = QualityTypes.WEBDL720p)
.With(h => h.IsProper = false)
.TheNext(1)
.With(h => h.Quality = QualityTypes.WEBDL720p)
.With(h => h.IsProper = true)
.TheNext(1)
.With(h => h.Quality = QualityTypes.WEBDL1080p)
.With(h => h.IsProper = false)
.TheNext(1)
.With(h => h.Quality = QualityTypes.SDTV)
.With(h => h.IsProper = true)
.Build();
Db.InsertMany(history);
Db.InsertMany(episodes);
//Act
var result = Mocker.Resolve<HistoryProvider>()
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
//Assert
result.Should().NotBeNull();
result.Quality.Should().Be(QualityTypes.WEBDL1080p);
result.Proper.Should().BeFalse();
}
[Test]
public void add_item()
{
WithRealDb();
var episode = Builder<Episode>.CreateNew().Build();
QualityTypes quality = QualityTypes.HDTV720p;
const bool proper = true;
var history = new History
{
Date = DateTime.Now,
EpisodeId = episode.OID,
SeriesId = episode.SeriesId,
NzbTitle = "my title",
Indexer = "Fake Indexer",
Quality = quality,
IsProper = proper
};
//Act
Mocker.Resolve<HistoryProvider>().Add(history);
//Assert
var storedHistory = Db.Fetch<History>();
storedHistory.Should().HaveCount(1);
history.Date.Should().BeWithin(TimeSpan.FromMinutes(1)).Before(storedHistory.First().Date);
history.EpisodeId.Should().Be(storedHistory.First().EpisodeId);
history.SeriesId.Should().Be(storedHistory.First().SeriesId);
history.NzbTitle.Should().Be(storedHistory.First().NzbTitle);
history.Indexer.Should().Be(storedHistory.First().Indexer);
history.Quality.Should().Be(storedHistory.First().Quality);
history.IsProper.Should().Be(storedHistory.First().IsProper);
}
}
}

View File

@ -1,8 +1,10 @@
using System.Linq;
using System.Diagnostics;
using System.Linq;
using Newtonsoft.Json;
namespace NzbDrone.Core.Datastore
{
[DebuggerDisplay("ID = {OID}")]
public abstract class ModelBase
{
[PetaPoco.Ignore]

View File

@ -1,5 +1,6 @@
using System.Linq;
using NLog;
using NzbDrone.Core.History;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers;
@ -9,14 +10,14 @@ namespace NzbDrone.Core.DecisionEngine
public class UpgradeHistorySpecification
{
private readonly IEpisodeService _episodeService;
private readonly HistoryProvider _historyProvider;
private readonly HistoryService _historyService;
private readonly QualityUpgradeSpecification _qualityUpgradeSpecification;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public UpgradeHistorySpecification(IEpisodeService episodeService, HistoryProvider historyProvider, QualityUpgradeSpecification qualityUpgradeSpecification)
public UpgradeHistorySpecification(IEpisodeService episodeService, HistoryService historyService, QualityUpgradeSpecification qualityUpgradeSpecification)
{
_episodeService = episodeService;
_historyProvider = historyProvider;
_historyService = historyService;
_qualityUpgradeSpecification = qualityUpgradeSpecification;
}
@ -29,7 +30,7 @@ namespace NzbDrone.Core.DecisionEngine
{
foreach (var episode in subject.Episodes)
{
var bestQualityInHistory = _historyProvider.GetBestQualityInHistory(subject.Series.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
var bestQualityInHistory = _historyService.GetBestQualityInHistory(subject.Series.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
if (bestQualityInHistory != null)
{
logger.Trace("Comparing history quality with report. History is {0}", bestQualityInHistory);

View File

@ -0,0 +1,19 @@
using System.Linq;
using System;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.History
{
public class History : ModelBase
{
public string NzbTitle { get; set; }
public QualityModel Quality { get; set; }
public DateTime Date { get; set; }
public string Indexer { get; set; }
public string NzbInfoUrl { get; set; }
public string ReleaseGroup { get; set; }
public Episode Episode { get; set; }
}
}

View File

@ -0,0 +1,41 @@
using System;
using System.Linq;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.History
{
public interface IHistoryRepository : IBasicRepository<History>
{
void Trim();
QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber);
}
public class HistoryRepository : BasicRepository<History>, IHistoryRepository
{
public HistoryRepository(IObjectDatabase objectDatabase)
: base(objectDatabase)
{
}
public void Trim()
{
var oldIds = Queryable.Where(c => c.Date < DateTime.Now.AddDays(-30).Date).Select(c => c.OID);
DeleteMany(oldIds);
}
public QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
{
var history = Queryable.OrderByDescending(c => c.Quality).FirstOrDefault(c => c.Episode.Series.SeriesId == seriesId && c.Episode.SeasonNumber == seasonNumber &&
c.Episode.EpisodeNumber == episodeNumber);
if (history != null)
{
return history.Quality;
}
return null;
}
}
}

View File

@ -0,0 +1,47 @@
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.History
{
public class HistoryService
{
private readonly IHistoryRepository _historyRepository;
private readonly Logger _logger;
public HistoryService(IHistoryRepository historyRepository, Logger logger)
{
_historyRepository = historyRepository;
_logger = logger;
}
public List<History> All()
{
return _historyRepository.All().ToList();
}
public void Purge()
{
_historyRepository.Purge();
}
public virtual void Trim()
{
_historyRepository.Trim();
}
public void Add(History item)
{
}
public virtual QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
{
return _historyRepository.GetBestQualityInHistory(seriesId, seasonNumber, episodeNumber);
}
}
}

View File

@ -1,27 +0,0 @@
using System;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality;
using PetaPoco;
namespace NzbDrone.Core.Model
{
public class HistoryQueryModel
{
public int HistoryId { get; set; }
public int EpisodeId { get; set; }
public int SeriesId { get; set; }
public string NzbTitle { get; set; }
public QualityTypes Quality { get; set; }
public DateTime Date { get; set; }
public bool IsProper { get; set; }
public string Indexer { get; set; }
public string NzbInfoUrl { get; set; }
public string ReleaseGroup { get; set; }
public string EpisodeTitle { get; set; }
public int SeasonNumber { get; set; }
public int EpisodeNumber { get; set; }
public string EpisodeOverview { get; set; }
public string SeriesTitle { get; set; }public int Id { get; set; }
}
}

View File

@ -131,10 +131,6 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Autofac.3.0.1\lib\net40\Autofac.Configuration.dll</HintPath>
</Reference>
<Reference Include="DataTables.Mvc.Core, Version=0.1.0.85, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\DataTables.Mvc.Core.0.1.0.85\lib\DataTables.Mvc.Core.dll</HintPath>
</Reference>
<Reference Include="DeskMetrics.NET">
<HintPath>..\Libraries\DeskMetrics\DeskMetrics.NET.dll</HintPath>
</Reference>
@ -268,6 +264,7 @@
<Compile Include="Helpers\SortHelper.cs" />
<Compile Include="Helpers\SabnzbdPriorityTypeConverter.cs" />
<Compile Include="Helpers\XElementHelper.cs" />
<Compile Include="History\HistoryRepository.cs" />
<Compile Include="Indexers\IndexerRepository.cs" />
<Compile Include="Indexers\NewznabRepository.cs" />
<Compile Include="Instrumentation\LogInjectionModule.cs" />
@ -282,7 +279,6 @@
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
<Compile Include="Jobs\SearchHistoryCleanupJob.cs" />
<Compile Include="Lifecycle\IInitializable.cs" />
<Compile Include="Model\HistoryQueryModel.cs" />
<Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Instrumentation\LogService.cs" />
<Compile Include="Instrumentation\DatabaseTarget.cs" />
@ -491,7 +487,7 @@
<Compile Include="Providers\GrowlProvider.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Providers\HistoryProvider.cs">
<Compile Include="History\HistoryService.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Indexers\IndexerService.cs">
@ -592,7 +588,7 @@
<Compile Include="Model\Notification\ProgressNotification.cs" />
<Compile Include="Tv\Episode.cs" />
<Compile Include="Instrumentation\Log.cs" />
<Compile Include="Repository\History.cs" />
<Compile Include="History\History.cs" />
<Compile Include="Repository\Config.cs" />
<Compile Include="Repository\Quality\QualityType.cs" />
<Compile Include="Repository\Quality\QualityProfile.cs" />

View File

@ -3,6 +3,7 @@ using System.IO;
using System.Linq;
using NLog;
using NzbDrone.Common;
using NzbDrone.Core.History;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.DecisionEngine;
@ -15,7 +16,7 @@ namespace NzbDrone.Core.Providers.DownloadClients
private readonly HttpProvider _httpProvider;
private readonly DiskProvider _diskProvider;
private readonly UpgradeHistorySpecification _upgradeHistorySpecification;
private readonly HistoryProvider _historyProvider;
private readonly HistoryService _historyService;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Core.History;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core;
@ -13,7 +14,7 @@ namespace NzbDrone.Core.Providers
public class DownloadProvider
{
private readonly SabProvider _sabProvider;
private readonly HistoryProvider _historyProvider;
private readonly HistoryService _historyService;
private readonly IEpisodeService _episodeService;
private readonly ExternalNotificationProvider _externalNotificationProvider;
private readonly ConfigProvider _configProvider;
@ -24,14 +25,14 @@ namespace NzbDrone.Core.Providers
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider,
public DownloadProvider(SabProvider sabProvider, HistoryService historyService,
IEpisodeService episodeService, ExternalNotificationProvider externalNotificationProvider,
ConfigProvider configProvider, BlackholeProvider blackholeProvider,
SignalRProvider signalRProvider, PneumaticProvider pneumaticProvider,
NzbgetProvider nzbgetProvider)
{
_sabProvider = sabProvider;
_historyProvider = historyProvider;
_historyService = historyService;
_episodeService = episodeService;
_externalNotificationProvider = externalNotificationProvider;
_configProvider = configProvider;
@ -59,20 +60,18 @@ namespace NzbDrone.Core.Providers
foreach (var episode in parseResult.Episodes)
{
var history = new History
var history = new History.History
{
Date = DateTime.Now,
Indexer = parseResult.Indexer,
IsProper = parseResult.Quality.Proper,
Quality = parseResult.Quality.Quality,
Quality = parseResult.Quality,
NzbTitle = parseResult.OriginalString,
EpisodeId = episode.OID,
SeriesId = episode.SeriesId,
Episode = episode,
NzbInfoUrl = parseResult.NzbInfoUrl,
ReleaseGroup = parseResult.ReleaseGroup,
};
_historyProvider.Add(history);
_historyService.Add(history);
_episodeService.MarkEpisodeAsFetched(episode.OID);
_signalRProvider.UpdateEpisodeStatus(episode.OID, EpisodeStatusType.Downloading, null);

View File

@ -1,118 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using DataTables.Mvc.Core.Helpers;
using DataTables.Mvc.Core.Models;
using NLog;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality;
using PetaPoco;
namespace NzbDrone.Core.Providers
{
public class HistoryProvider
{
private readonly IDatabase _database;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public HistoryProvider(IDatabase database)
{
_database = database;
}
public HistoryProvider()
{
}
public virtual List<History> AllItems()
{
return _database.Fetch<History>("");
}
public virtual List<History> AllItemsWithRelationships()
{
return _database.Fetch<History, Episode>(@"
SELECT History.*, Series.Title as SeriesTitle, Episodes.* FROM History
INNER JOIN Series ON History.SeriesId = Series.SeriesId
INNER JOIN Episodes ON History.EpisodeId = Episodes.EpisodeId
");
}
public virtual void Purge()
{
_database.Delete<History>("");
logger.Info("History has been Purged");
}
public virtual void Trim()
{
_database.Delete<History>("WHERE Date < @0", DateTime.Now.AddDays(-30).Date);
logger.Info("History has been trimmed, items older than 30 days have been removed");
}
public virtual void Add(History item)
{
_database.Insert(item);
logger.Debug("Item added to history: {0}", item.NzbTitle);
}
public virtual QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
{
var quality = _database.Fetch<QualityModel>(@"SELECT History.Quality , History.IsProper as Proper FROM History
INNER JOIN Episodes ON History.EpisodeId = Episodes.EpisodeId
WHERE Episodes.seriesId = @0 AND
Episodes.SeasonNumber = @1 AND
Episodes.EpisodeNumber = @2"
, seriesId, seasonNumber, episodeNumber);
var best = quality.OrderByDescending(q => q).FirstOrDefault();
return best;
}
public virtual void Delete(int historyId)
{
_database.Delete<History>(historyId);
}
public virtual Page<HistoryQueryModel> GetPagedItems(DataTablesPageRequest pageRequest)
{
var query = Sql.Builder
.Select(@"History.*, Series.Title as SeriesTitle, Episodes.Title as EpisodeTitle,
Episodes.SeasonNumber as SeasonNumber, Episodes.EpisodeNumber as EpisodeNumber,
Episodes.Overview as EpisodeOverview")
.From("History")
.InnerJoin("Series")
.On("History.SeriesId = Series.SeriesId")
.InnerJoin("Episodes")
.On("History.EpisodeId = Episodes.EpisodeId");
var startPage = (pageRequest.DisplayLength == 0) ? 1 : pageRequest.DisplayStart / pageRequest.DisplayLength + 1;
if (!string.IsNullOrEmpty(pageRequest.Search))
{
var whereClause = string.Join(" OR ", SqlBuilderHelper.GetSearchClause(pageRequest));
if (!string.IsNullOrEmpty(whereClause))
query.Append("WHERE " + whereClause, "%" + pageRequest.Search + "%");
}
var orderBy = string.Join(",", SqlBuilderHelper.GetOrderByClause(pageRequest));
if (!string.IsNullOrEmpty(orderBy))
{
query.Append("ORDER BY " + orderBy);
}
return _database.Page<HistoryQueryModel>(startPage, pageRequest.DisplayLength, query);
}
public virtual long Count()
{
return _database.Single<long>(@"SELECT COUNT(*) from History");
}
}
}

View File

@ -26,7 +26,7 @@ namespace NzbDrone.Core.Providers
{
var series = _database.Fetch<Series>();
var episodes = _database.Fetch<Episode>();
var history = _database.Fetch<History>("WHERE Date >= @0", DateTime.Today.AddDays(-30));
var history = _database.Fetch<History.History>("WHERE Date >= @0", DateTime.Today.AddDays(-30));
var stats = new StatsModel();
stats.SeriesTotal = series.Count;

View File

@ -1,29 +0,0 @@
using System;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Repository.Quality;
using PetaPoco;
namespace NzbDrone.Core.Repository
{
[PrimaryKey("HistoryId")]
public class History
{
public int HistoryId { get; set; }
public int EpisodeId { get; set; }
public int SeriesId { get; set; }
public string NzbTitle { get; set; }
public QualityTypes Quality { get; set; }
public DateTime Date { get; set; }
public bool IsProper { get; set; }
public string Indexer { get; set; }
public string NzbInfoUrl { get; set; }
public string ReleaseGroup { get; set; }
[ResultColumn]
public Episode Episode { get; set; }
[ResultColumn]
public string SeriesTitle { get; set; }
}
}

View File

@ -10,7 +10,10 @@ namespace NzbDrone.Core.Tv
public Boolean Proper { get; set; }
public QualityModel() { }
public QualityModel():this(QualityTypes.Unknown, false)
{
}
public QualityModel(QualityTypes quality, Boolean proper)
{

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Autofac" version="3.0.1" targetFramework="net40" />
<package id="DataTables.Mvc.Core" version="0.1.0.85" />
<package id="DotNetZip" version="1.9.1.8" />
<package id="Growl" version="0.6" />
<package id="MediaInfoNet" version="0.3" targetFramework="net40" />