Fixed: Performance issues when processing results from indexers (RSS/Search)

This commit is contained in:
Mark McDowall 2014-02-22 00:53:29 -08:00
parent 0a837be9ff
commit 78dacf6850
12 changed files with 47 additions and 44 deletions

View File

@ -21,9 +21,7 @@ namespace NzbDrone.Core.Configuration
public Config Get(string key)
{
return Query.SingleOrDefault(c => c.Key == key);
return Query.Where(c => c.Key == key).SingleOrDefault();
}
}
}

View File

@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Cryptography.X509Certificates;
using Marr.Data;
using Marr.Data.QGen;
using NzbDrone.Core.Datastore.Events;
@ -74,7 +73,7 @@ namespace NzbDrone.Core.Datastore
public TModel Get(int id)
{
var model = DataMapper.Query<TModel>().SingleOrDefault(c => c.Id == id);
var model = Query.Where(c => c.Id == id).SingleOrDefault();
if (model == null)
{

View File

@ -23,7 +23,7 @@ namespace NzbDrone.Core.DecisionEngine
private readonly IParsingService _parsingService;
private readonly Logger _logger;
public DownloadDecisionMaker(IEnumerable<IRejectWithReason> specifications, IParsingService parsingService, Logger logger)
public DownloadDecisionMaker(IEnumerable<IDecisionEngineSpecification> specifications, IParsingService parsingService, Logger logger)
{
_specifications = specifications;
_parsingService = parsingService;
@ -100,13 +100,12 @@ namespace NzbDrone.Core.DecisionEngine
yield return decision;
}
}
}
private DownloadDecision GetDecisionForReport(RemoteEpisode remoteEpisode, SearchCriteriaBase searchCriteria = null)
{
var reasons = _specifications.Select(c => EvaluateSpec(c, remoteEpisode, searchCriteria))
.Where(c => !string.IsNullOrWhiteSpace(c));
.Where(c => !string.IsNullOrWhiteSpace(c));
return new DownloadDecision(remoteEpisode, reasons.ToArray());
}

View File

@ -1,6 +1,5 @@
using NLog;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.DecisionEngine
{

View File

@ -27,7 +27,6 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
public virtual bool IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria)
{
_logger.Trace("Beginning size check for: {0}", subject);
var quality = subject.ParsedEpisodeInfo.Quality.Quality;
@ -45,21 +44,17 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
}
var qualityDefinition = _qualityDefinitionService.Get(quality);
var minSize = qualityDefinition.MinSize.Megabytes();
//Multiply maxSize by Series.Runtime
minSize = minSize * subject.Series.Runtime * subject.Episodes.Count;
//If the parsed size is smaller than minSize we don't want it
if (subject.Release.Size < minSize)
{
var minSize = qualityDefinition.MinSize.Megabytes();
//Multiply maxSize by Series.Runtime
minSize = minSize * subject.Series.Runtime * subject.Episodes.Count;
//If the parsed size is smaller than minSize we don't want it
if (subject.Release.Size < minSize)
{
_logger.Trace("Item: {0}, Size: {1} is smaller than minimum allowed size ({2}), rejecting.", subject, subject.Release.Size, minSize);
return false;
}
_logger.Trace("Item: {0}, Size: {1} is smaller than minimum allowed size ({2}), rejecting.", subject, subject.Release.Size, minSize);
return false;
}
if (qualityDefinition.MaxSize == 0)
{
_logger.Trace("Max size is 0 (unlimited) - skipping check.");
@ -84,10 +79,8 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
return false;
}
}
_logger.Trace("Item: {0}, meets size constraints.", subject);
return true;
}
}
}

View File

@ -23,7 +23,7 @@ namespace NzbDrone.Core.Jobs
public ScheduledTask GetDefinition(Type type)
{
return Query.Single(c => c.TypeName == type.FullName);
return Query.Where(c => c.TypeName == type.FullName).Single();
}
public void SetLastExecutionTime(int id, DateTime executionTime)

View File

@ -56,7 +56,7 @@ namespace NzbDrone.Core.Metadata.Files
public MetadataFile FindByPath(string path)
{
return Query.SingleOrDefault(c => c.RelativePath == path);
return Query.Where(c => c.RelativePath == path).SingleOrDefault();
}
}
}

View File

@ -22,7 +22,7 @@ namespace NzbDrone.Core.Qualities
{
try
{
return Query.Single(q => (int)q.Quality == qualityId);
return Query.Where(q => (int) q.Quality == qualityId).Single();
}
catch (InvalidOperationException e)
{

View File

@ -37,22 +37,31 @@ namespace NzbDrone.Core.Tv
public Episode Find(int seriesId, int season, int episodeNumber)
{
return Query.SingleOrDefault(s => s.SeriesId == seriesId && s.SeasonNumber == season && s.EpisodeNumber == episodeNumber);
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.SeasonNumber == season)
.AndWhere(s => s.EpisodeNumber == episodeNumber)
.SingleOrDefault();
}
public Episode Find(int seriesId, int absoluteEpisodeNumber)
{
return Query.SingleOrDefault(s => s.SeriesId == seriesId && s.AbsoluteEpisodeNumber == absoluteEpisodeNumber);
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.AbsoluteEpisodeNumber == absoluteEpisodeNumber)
.SingleOrDefault();
}
public Episode Get(int seriesId, String date)
{
return Query.Single(s => s.SeriesId == seriesId && s.AirDate == date);
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.AirDate == date)
.Single();
}
public Episode Find(int seriesId, String date)
{
return Query.SingleOrDefault(s => s.SeriesId == seriesId && s.AirDate == date);
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.AirDate == date)
.SingleOrDefault();
}
public List<Episode> GetEpisodes(int seriesId)
@ -62,7 +71,9 @@ namespace NzbDrone.Core.Tv
public List<Episode> GetEpisodes(int seriesId, int seasonNumber)
{
return Query.Where(s => s.SeriesId == seriesId && s.SeasonNumber == seasonNumber).ToList();
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.SeasonNumber == seasonNumber)
.ToList();
}
public List<Episode> GetEpisodeByFileId(int fileId)
@ -88,10 +99,12 @@ namespace NzbDrone.Core.Tv
public Episode FindEpisodeBySceneNumbering(int seriesId, int seasonNumber, int episodeNumber)
{
return Query.SingleOrDefault(s => s.SeriesId == seriesId && s.SceneSeasonNumber == seasonNumber && s.SceneEpisodeNumber == episodeNumber);
return Query.Where(s => s.SeriesId == seriesId)
.AndWhere(s => s.SceneSeasonNumber == seasonNumber)
.AndWhere(s => s.SceneEpisodeNumber == episodeNumber)
.SingleOrDefault();
}
public List<Episode> EpisodesBetweenDates(DateTime startDate, DateTime endDate)
{
return Query.Join<Episode, Series>(JoinType.Inner, e => e.Series, (e, s) => e.SeriesId == s.Id)

View File

@ -103,7 +103,6 @@ namespace NzbDrone.Core.Tv
});
}
public PagingSpec<Episode> EpisodesWithoutFiles(PagingSpec<Episode> pagingSpec)
{
var episodeResult = _episodeRepository.EpisodesWithoutFiles(pagingSpec, false);
@ -139,7 +138,6 @@ namespace NzbDrone.Core.Tv
var episode = GetEpisode(episodeId);
var seasonEpisodes = GetEpisodesBySeason(episode.SeriesId, episode.SeasonNumber);
//Ensure that this is either the first episode
//or is the last episode in a season that has 10 or more episodes
if (seasonEpisodes.First().EpisodeNumber == episode.EpisodeNumber || (seasonEpisodes.Count() >= 10 && seasonEpisodes.Last().EpisodeNumber == episode.EpisodeNumber))

View File

@ -25,28 +25,34 @@ namespace NzbDrone.Core.Tv
public bool SeriesPathExists(string path)
{
return Query.Any(c => c.Path == path);
return Query.Where(c => c.Path == path).Any();
}
public Series FindByTitle(string cleanTitle)
{
return Query.SingleOrDefault(s => s.CleanTitle.Equals(cleanTitle, StringComparison.InvariantCultureIgnoreCase));
cleanTitle = cleanTitle.ToLowerInvariant();
return Query.Where(s => s.CleanTitle == cleanTitle)
.SingleOrDefault();
}
public Series FindByTitle(string cleanTitle, int year)
{
return Query.SingleOrDefault(s => s.CleanTitle.Equals(cleanTitle, StringComparison.InvariantCultureIgnoreCase) &&
s.Year == year);
cleanTitle = cleanTitle.ToLowerInvariant();
return Query.Where(s => s.CleanTitle == cleanTitle)
.AndWhere(s => s.Year == year)
.SingleOrDefault();
}
public Series FindByTvdbId(int tvdbId)
{
return Query.SingleOrDefault(s => s.TvdbId.Equals(tvdbId));
return Query.Where(s => s.TvdbId == tvdbId).SingleOrDefault();
}
public Series FindByTvRageId(int tvRageId)
{
return Query.SingleOrDefault(s => s.TvRageId.Equals(tvRageId));
return Query.Where(s => s.TvRageId == tvRageId).SingleOrDefault();
}
public void SetSeriesType(int seriesId, SeriesTypes seriesType)

View File

@ -98,8 +98,6 @@ namespace NzbDrone.Core.Tv
return FindByTvdbId(tvdbId.Value);
}
var clean = Parser.Parser.CleanSeriesTitle(title);
return _seriesRepository.FindByTitle(Parser.Parser.CleanSeriesTitle(title));
}