Changeset 626

Show
Ignore:
Timestamp:
07/05/08 22:26:31 (6 months ago)
Author:
gbooker
Message:

Massive speed increase of the tvshow, cast, director, and genre virtual directories. Some of these are now even faster than the old ones.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/CoreData/SapphireFrappliance/FRAppliance/SapphireApplianceController.m

    r608 r626  
    2727#import "SapphireBrowser.h" 
    2828#import "SapphireDirectoryMetaData.h" 
     29#import "SapphireFileMetaData.h" 
    2930#import "SapphireSettings.h" 
    3031#import "SapphireTheme.h" 
    3132#import "SapphireCollectionDirectory.h" 
     33#import "CoreDataSupportFunctions.h" 
     34#import "SapphireEpisode.h" 
    3235 
    3336#import "SapphireImporterDataMenu.h" 
     
    336339} 
    337340 
     341NSArray *showEntityFetch(NSManagedObjectContext *moc, NSPredicate *filterPredicate) 
     342{ 
     343        NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"tvEpisode != nil"]; 
     344        NSPredicate *finalPred; 
     345        if(filterPredicate == nil) 
     346                finalPred = fetchPredicate; 
     347        else 
     348                finalPred = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:filterPredicate, fetchPredicate, nil]]; 
     349        NSArray *files = doFetchRequest(SapphireFileMetaDataName, moc, finalPred); 
     350 
     351        NSSet *epIds = [NSSet setWithArray:[files valueForKeyPath:@"tvEpisode.objectID"]]; 
     352        NSPredicate *epPred = [NSPredicate predicateWithFormat:@"SELF IN %@", epIds]; 
     353        NSArray *episodes = doFetchRequest(SapphireEpisodeName, moc, epPred); 
     354 
     355        NSSet *showIds = [NSSet setWithArray:[episodes valueForKeyPath:@"tvShow.objectID"]]; 
     356        NSPredicate *showPred = [NSPredicate predicateWithFormat:@"SELF IN %@", showIds]; 
     357 
     358        return doFetchRequest(SapphireTVShowName, moc, showPred); 
     359} 
     360 
    338361- (SapphireBrowser *)tvBrowser 
    339362{ 
    340363        BRTexture *predicateGem = [SapphireApplianceController gemForPredicate:[SapphireApplianceController predicate]]; 
    341         SapphireEntityDirectory *tvDir = [[SapphireEntityDirectory alloc] initWithEntityName:SapphireTVShowName usingFilter:nil inContext:moc]; 
     364        SapphireEntityDirectory *tvDir = [[SapphireEntityDirectory alloc] initWithEntityFetch:showEntityFetch inContext:moc]; 
    342365        [tvDir setMetaFileFetchPredicate:[NSPredicate predicateWithFormat:@"tvEpisode != nil"]]; 
    343366        SapphireBrowser *tvBrowser = [[SapphireBrowser alloc] initWithScene:[self scene] metaData:tvDir]; 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireEntityDirectory.h

    r595 r626  
    2222#import "SapphireBasicDirectoryFunctionsDefines.h" 
    2323 
     24typedef NSArray* (*EntityFetchFunction)(NSManagedObjectContext *context, NSPredicate *filterPredicate); 
     25 
    2426/*! 
    2527 * @brief A directory containing all of a particular managed object class 
     
    2931@interface SapphireEntityDirectory : NSObject <SapphireDirectory> { 
    3032        NSManagedObjectContext                  *moc;                           /*!< @brief The context*/ 
    31         NSString                                               *name;                          /*!< @brief The name of the entity to fetch*/ 
     33        EntityFetchFunction                            fetchFunction;          /*!< @brief The function to fetch entities*/ 
    3234        NSDictionary                                    *entities;                      /*!< @brief The cached entity list*/ 
    3335        NSString                                                *nameKey;                       /*!< @brief The key to fetch the name of an entity*/ 
     
    4244 * @brief Creates a new entity directory 
    4345 * 
    44  * @param entityName The name of the entity to fetch 
     46 * @param fetch The function to fetch entities 
    4547 * @param context The context to use 
    46  * @param filter Filter to filter entity objects 
    4748 * @return The entity directory 
    4849 */ 
    49 - (id)initWithEntityName:(NSString *)entityName usingFilter:(NSPredicate *)filter inContext:(NSManagedObjectContext *)context; 
     50- (id)initWithEntityFetch:(EntityFetchFunction)fetch inContext:(NSManagedObjectContext *)context; 
    5051 
    5152/*! 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireEntityDirectory.m

    r620 r626  
    2525@implementation SapphireEntityDirectory 
    2626 
    27 - (id)initWithEntityName:(NSString *)entityName usingFilter:(NSPredicate *)filter inContext:(NSManagedObjectContext *)context 
     27- (id)initWithEntityFetch:(EntityFetchFunction)fetch inContext:(NSManagedObjectContext *)context; 
    2828{ 
    2929        self = [super init]; 
     
    3131                return self; 
    3232         
    33         name = [entityName retain]
     33        fetchFunction = fetch
    3434        moc = [context retain]; 
    3535        nameKey = [@"name" retain]; 
    36         fetchFilter = [filter retain]; 
    3736        Basic_Directory_Function_Inits 
    3837         
     
    4241- (void) dealloc 
    4342{ 
    44         [name release]; 
    4543        [moc release]; 
    4644        [entities release]; 
     
    5048        [notificationName release]; 
    5149        [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    52         [fetchFilter release]; 
    5350        Basic_Directory_Function_Deallocs 
    5451        [super dealloc]; 
     
    9491- (id <SapphireDirectory>)metaDataForDirectory:(NSString *)directory 
    9592{ 
    96         return [entities objectForKey:directory]; 
     93        id <SapphireDirectory> ret = [entities objectForKey:directory]; 
     94        [ret setFilterPredicate:filterPredicate]; 
     95        return ret; 
    9796} 
    9897 
    9998- (void)reloadDirectoryContents 
    10099{ 
    101         NSArray *objects = doFetchRequest(name, moc, fetchFilter); 
     100        NSArray *objects = fetchFunction(moc, filterPredicate); 
    102101        int i, count = [objects count]; 
    103102        NSMutableDictionary *newData = [[NSMutableDictionary alloc] init]; 
     
    105104        { 
    106105                id obj = [objects objectAtIndex:i]; 
    107                 if(filterPredicate != nil && ![obj containsFileMatchingFilterPredicate:filterPredicate]) 
    108                         continue; 
    109106                NSString *key = [obj valueForKey:nameKey]; 
    110107                if(key != nil) 
    111                 { 
    112                         [obj setFilterPredicate:filterPredicate]; 
    113108                        [newData setObject:obj forKey:key]; 
    114                 } 
    115109        } 
    116110        [entities release]; 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMovieDirectory.m

    r610 r626  
    1919 */ 
    2020 
     21#import <SapphireCompatClasses/SapphireFrontRowCompat.h> 
     22 
    2123#import "SapphireMovieDirectory.h" 
    2224#import "SapphireEntityDirectory.h" 
     
    3133#import "SapphireGenre.h" 
    3234 
     35NSArray *multiMovieEntityFetch(NSString *name, NSString *keyFromMovie, NSManagedObjectContext *moc, NSPredicate *filterPredicate) 
     36{ 
     37        NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"movie != nil"]; 
     38        NSPredicate *finalPred; 
     39        if(filterPredicate == nil) 
     40                finalPred = fetchPredicate; 
     41        else 
     42                finalPred = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:filterPredicate, fetchPredicate, nil]]; 
     43        NSArray *files = doFetchRequest(SapphireFileMetaDataName, moc, finalPred); 
     44        NSSet *movieIds = [NSSet setWithArray:[files valueForKeyPath:@"movie.objectID"]]; 
     45         
     46        NSPredicate *entPred; 
     47        if([SapphireFrontRowCompat usingTakeTwo] || ![SapphireFrontRowCompat usingFrontRow]) 
     48        { 
     49                /*      Damn you Apple for not making take 2 Leopard.  Not only does this make obj C 2 not available, 
     50                        but it also means that I have to content with a crippled and slower core data.  The else block here 
     51                        executes on Leopard at several times the speed, but on Tiger throws the exception: 
     52                        "to-many key not allowed here" even though it can be done through a JOIN in the SQL!!!!!*/ 
     53                NSPredicate *moviePred = [NSPredicate predicateWithFormat:@"SELF IN %@", movieIds]; 
     54                NSArray *movies = doFetchRequest(SapphireMovieName, moc, moviePred); 
     55                NSArray *entSet = [movies valueForKeyPath:[NSString stringWithFormat:@"@distinctUnionOfSets.%@.objectID", keyFromMovie]]; 
     56                 
     57                entPred = [NSPredicate predicateWithFormat:@"SELF IN %@", entSet];               
     58        } 
     59        else 
     60                entPred = [NSPredicate predicateWithFormat:@"ANY movies IN %@", movieIds]; 
     61        return doFetchRequest(name, moc, entPred); 
     62} 
     63 
     64NSArray *castEntityFetch(NSManagedObjectContext *moc, NSPredicate *filterPredicate) 
     65{ 
     66        return multiMovieEntityFetch(SapphireCastName, @"cast", moc, filterPredicate); 
     67} 
     68 
     69NSArray *directorEntityFetch(NSManagedObjectContext *moc, NSPredicate *filterPredicate) 
     70{ 
     71        return multiMovieEntityFetch(SapphireDirectorName, @"directors", moc, filterPredicate); 
     72} 
     73 
     74NSArray *genreEntityFetch(NSManagedObjectContext *moc, NSPredicate *filterPredicate) 
     75{ 
     76        return multiMovieEntityFetch(SapphireGenreName, @"genres", moc, filterPredicate); 
     77} 
     78 
    3379@implementation SapphireMovieDirectory 
    3480 
     
    4288 
    4389        NSPredicate *allPred = [NSPredicate predicateWithFormat:@"movie != nil"]; 
    44         NSPredicate *majorCastPred = [NSPredicate predicateWithFormat:@"hasMajorRole = TRUE"]; 
    4590        SapphireFilteredFileDirectory *all = [[SapphireFilteredFileDirectory alloc] initWithPredicate:allPred Context:moc]; 
    46         SapphireEntityDirectory *cast = [[SapphireEntityDirectory alloc] initWithEntityName:SapphireCastName usingFilter:majorCastPred inContext:moc]; 
    47         SapphireEntityDirectory *director = [[SapphireEntityDirectory alloc] initWithEntityName:SapphireDirectorName usingFilter:nil inContext:moc]; 
    48         SapphireEntityDirectory *genre = [[SapphireEntityDirectory alloc] initWithEntityName:SapphireGenreName usingFilter:nil inContext:moc]; 
     91        SapphireEntityDirectory *cast = [[SapphireEntityDirectory alloc] initWithEntityFetch:castEntityFetch inContext:moc]; 
     92        SapphireEntityDirectory *director = [[SapphireEntityDirectory alloc] initWithEntityFetch:directorEntityFetch inContext:moc]; 
     93        SapphireEntityDirectory *genre = [[SapphireEntityDirectory alloc] initWithEntityFetch:genreEntityFetch inContext:moc]; 
    4994        NSPredicate *top250Pred = [NSPredicate predicateWithFormat:@"movie.imdbTop250Ranking != 0"]; 
    5095        SapphireFilteredFileDirectory *top250 = [[SapphireFilteredFileDirectory alloc] initWithPredicate:top250Pred Context:moc];