Changeset 623

Show
Ignore:
Timestamp:
07/05/08 14:32:17 (6 months ago)
Author:
gbooker
Message:

Optimizations. Use a predicate for fetching files since it can be faster (aggregate SQL accesses)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireCast.m

    r599 r623  
    3030} 
    3131 
    32 - (NSString *)metaFilesValue; 
     32- (NSPredicate *)metaFileFetchPredicate 
    3333{ 
    34         return @"movies.@distinctUnionOfSets.files"; 
     34        NSArray *movieIds = [self.moviesSet valueForKey:@"objectID"]; 
     35        return [NSPredicate predicateWithFormat:@"movie IN %@", movieIds]; 
    3536} 
    3637 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireCategoryDirectory.m

    r622 r623  
    4646} 
    4747 
    48 - (NSString *)metaFilesValue; 
    49 { 
    50         return nil; 
    51 } 
    52  
    5348- (NSPredicate *)metaFileFetchPredicate 
    5449{ 
     
    6863- (NSMutableArray *)internalFileFetch 
    6964{ 
    70         NSString *metaFilesKey = [self metaFilesValue]; 
    71         if(metaFilesKey != nil) 
    72         { 
    73                 //This is the slow method 
    74                 NSMutableArray *files = [[[self valueForKeyPath:metaFilesKey] allObjects] mutableCopy]; 
    75                 if(filterPredicate != nil) 
    76                         [files filterUsingPredicate:filterPredicate]; 
    77                  
    78                 [cachedMetaFiles setArray:files]; 
    79                 return [files autorelease]; 
    80         } 
    8165        NSPredicate *fetchPredicate = [self metaFileFetchPredicate]; 
    8266        if(fetchPredicate == nil) 
     
    234218{ 
    235219        NSPredicate *fetchPred = [self metaFileFetchPredicate]; 
    236         if(fetchPred != nil) 
    237         { 
    238                 NSPredicate *final; 
    239                 if(pred == nil) 
    240                         final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:fetchPred, filterPredicate, nil]]; 
    241                 else 
    242                         final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred, fetchPred, filterPredicate, nil]]; 
    243                 return entityExists(SapphireFileMetaDataName, [self managedObjectContext], final);       
    244         } 
    245          
    246         NSArray *files = cachedMetaFiles; 
    247         if(![files count]) 
    248                 files = [self internalFileFetch]; 
    249         int i, count = [files count]; 
    250         for(i=0; i<count; i++) 
    251                 if([pred evaluateWithObject:[files objectAtIndex:i]]) 
    252                         return YES; 
    253          
    254         return NO; 
     220        if(fetchPred == nil) 
     221                return NO; 
     222        NSPredicate *final; 
     223        if(pred == nil) 
     224                final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:fetchPred, filterPredicate, nil]]; 
     225        else 
     226                final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred, fetchPred, filterPredicate, nil]]; 
     227        return entityExists(SapphireFileMetaDataName, [self managedObjectContext], final);       
    255228} 
    256229 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireDirector.m

    r599 r623  
    2929} 
    3030 
    31 - (NSString *)metaFilesValue; 
     31- (NSPredicate *)metaFileFetchPredicate 
    3232{ 
    33         return @"movies.@distinctUnionOfSets.files"; 
     33        NSArray *movieIds = [self.moviesSet valueForKey:@"objectID"]; 
     34        return [NSPredicate predicateWithFormat:@"movie IN %@", movieIds]; 
    3435} 
    3536 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireDirectoryMetaData.m

    r621 r623  
    88#import "SapphireMetaDataUpgrading.h" 
    99#import "SapphireBasicDirectoryFunctionsImports.h" 
     10#import "SapphireEpisode.h" 
     11#import "SapphireSubEpisode.h" 
     12#import "SapphireMovie.h" 
    1013 
    1114@implementation SapphireDirectoryMetaData 
     
    249252        cachedLookup = [[NSMutableDictionary alloc] init]; 
    250253 
    251         NSMutableSet *files = [[self.metaFilesSet valueForKeyPath:@"path.lastPathComponent"] mutableCopy]; 
    252         NSMutableSet *dirs = [[self.metaDirsSet valueForKeyPath:@"path.lastPathComponent"] mutableCopy]; 
     254        NSSet *fileObjects = self.metaFilesSet; 
     255        NSMutableSet *files; 
     256        if([fileObjects count]) 
     257        { 
     258                NSSet *fileIds = [fileObjects valueForKey:@"objectID"]; 
     259                NSPredicate *fetchPred = [NSPredicate predicateWithFormat:@"SELF IN %@", fileIds]; 
     260                NSArray *fetchedFiles = doFetchRequest(SapphireFileMetaDataName, moc, fetchPred); 
     261                files = [[NSMutableSet alloc] initWithArray:[fetchedFiles valueForKeyPath:@"path.lastPathComponent"]]; 
     262        } 
     263        else 
     264                files = [[NSMutableSet alloc] init]; 
     265        NSSet *dirObjects = self.metaDirsSet; 
     266        NSMutableSet *dirs; 
     267        if([dirObjects count]) 
     268        { 
     269                NSSet *dirIds = [dirObjects valueForKey:@"objectID"]; 
     270                NSPredicate *fetchPred = [NSPredicate predicateWithFormat:@"SELF IN %@", dirIds]; 
     271                NSArray *fetchedDirs = doFetchRequest(SapphireDirectoryMetaDataName, moc, fetchPred); 
     272                dirs = [[NSMutableSet alloc] initWithArray:[fetchedDirs valueForKeyPath:@"path.lastPathComponent"]]; 
     273        } 
     274        else 
     275                dirs = [[NSMutableSet alloc] init]; 
     276        //These are rare; so don't need to prefetch 
    253277        NSMutableSet *linkedFiles = [[self.linkedFilesSet valueForKeyPath:@"path.lastPathComponent"] mutableCopy]; 
    254278        NSMutableSet *linkedDirs = [[self.linkedDirsSet valueForKeyPath:@"path.lastPathComponent"] mutableCopy]; 
     
    366390        [SapphireMetaDataSupport save:moc]; 
    367391         
    368         NSMutableArray *allFiles = [[self.metaFilesSet allObjects] mutableCopy]; 
     392        NSMutableArray *allFiles = [[fileObjects allObjects] mutableCopy]; 
    369393        [allFiles addObjectsFromArray:[self.linkedFilesSet allObjects]]; 
    370394        if(filterPredicate != nil) 
    371395                [allFiles filterUsingPredicate:filterPredicate]; 
     396        if([fileObjects count]) 
     397        { 
     398                NSSet *allEps = [fileObjects valueForKeyPath:@"tvEpisode.objectID"]; 
     399                if([allEps count]) 
     400                { 
     401                        NSPredicate *fetchPred = [NSPredicate predicateWithFormat:@"SELF IN %@", allEps]; 
     402                        NSArray *episodes = doFetchRequest(SapphireEpisodeName, moc, fetchPred); 
     403                        if([episodes count]) 
     404                        { 
     405                                fetchPred = [NSPredicate predicateWithFormat:@"episode IN %@", episodes]; 
     406                                doFetchRequest(SapphireSubEpisodeName, moc, fetchPred); 
     407                        } 
     408                } 
     409                NSSet *allMovies = [fileObjects valueForKeyPath:@"movie.objectID"]; 
     410                if([allMovies count]) 
     411                { 
     412                        NSPredicate *fetchPred = [NSPredicate predicateWithFormat:@"SELF IN %@", allMovies]; 
     413                        doFetchRequest(SapphireMovieName, moc, fetchPred); 
     414                } 
     415        } 
    372416        [allFiles sortUsingFunction:fileAndLinkEpisodeCompare context:nil]; 
    373417        [cachedFiles release]; 
     
    430474                [cachedLookup setObject:dir forKey:name]; 
    431475        } 
    432         [allDirs release];      
     476        [allDirs release]; 
    433477        [delegate directoryContentsChanged]; 
    434478} 
     
    551595- (void)refreshAllObjects 
    552596{ 
     597        if([self isFault]) 
     598                return; 
    553599        NSManagedObjectContext *moc = [self managedObjectContext]; 
    554600        NSEnumerator *objEnum; 
     
    561607        objEnum = [self.metaDirsSet objectEnumerator]; 
    562608        while((obj = [objEnum nextObject]) != nil) 
    563                 [moc refreshObject:obj mergeChanges:NO]; 
     609                [(SapphireDirectoryMetaData *)obj refreshAllObjects]; 
    564610         
    565611        objEnum = [self.linkedFilesSet objectEnumerator]; 
    566612        while((obj = [objEnum nextObject]) != nil) 
    567                 [moc refreshObject:obj mergeChanges:NO]; 
     613        { 
     614                SapphireFileSymLink *link = (SapphireFileSymLink *)obj; 
     615                if(![link isFault]) 
     616                        [moc refreshObject:link.file mergeChanges:NO]; 
     617                [moc refreshObject:link mergeChanges:NO]; 
     618        } 
    568619         
    569620        objEnum = [self.linkedDirsSet objectEnumerator]; 
    570621        while((obj = [objEnum nextObject]) != nil) 
    571                 [moc refreshObject:obj mergeChanges:NO]; 
     622        { 
     623                SapphireDirectorySymLink *link = (SapphireDirectorySymLink *)obj; 
     624                if(![link isFault]) 
     625                        [link.directory refreshAllObjects]; 
     626                [moc refreshObject:link mergeChanges:NO]; 
     627        } 
    572628         
    573629        [moc refreshObject:self mergeChanges:NO]; 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireGenre.m

    r599 r623  
    22#import "CoreDataSupportFunctions.h" 
    33#import "SapphireFileSorter.h" 
     4#import "SapphireMovie.h" 
    45 
    56@implementation SapphireGenre 
     
    2930} 
    3031 
    31 - (NSString *)metaFilesValue; 
     32- (NSPredicate *)metaFileFetchPredicate 
    3233{ 
    33         return @"movies.@distinctUnionOfSets.files"; 
     34        NSArray *movieIds = [self.moviesSet valueForKey:@"objectID"]; 
     35        return [NSPredicate predicateWithFormat:@"movie IN %@", movieIds]; 
    3436} 
    3537