Show
Ignore:
Timestamp:
06/13/08 15:57:37 (4 years ago)
Author:
gbooker
Message:

Changed the filtering method and the check for unwatched/favorite. This new system is far more powerful, and should actually be faster too. Implemented a bit more caching to help speed as well.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireBasicDirectoryFunctions.h

    r585 r588  
    2323 
    2424#ifndef RECURSIVE_FUNCTIONS_ALREADY_DEFINED 
    25 /*Function to invoke a command on all files in a subtree*/ 
    26 - (void)invokeRecursivelyOnFiles:(NSInvocation *)fileInv 
     25- (void)invokeOnAllFiles:(NSInvocation *)fileInv 
    2726{ 
    2827        NSArray *files = [self metaFiles]; 
     
    4342        if(fetchPred != nil) 
    4443        { 
    45                 NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred, fetchPred, nil]]; 
     44                NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:pred, fetchPred, filterPredicate, nil]]; 
    4645                return entityExists(SapphireFileMetaDataName, [self managedObjectContext], final);       
    4746        } 
     
    6160        { 
    6261                id <SapphireDirectory> dir = [self metaDataForDirectory:[dirs objectAtIndex:i]]; 
    63                 if(dir != nil && [dir checkPredicate:pred]) 
     62                if(dir != nil && [dir containsFileMatchingPredicate:pred]) 
    6463                        return YES; 
    6564        } 
     
    8685#endif 
    8786 
    88 - (BOOL)internalWatchedValue 
     87- (BOOL)containsFileMatchingPredicate:(NSPredicate *)pred 
    8988{ 
    90         return ![self checkPredicate:[SapphireApplianceController unwatchedPredicate]]; 
    91 } 
    92  
    93 - (BOOL)watchedValue 
    94 { 
    95         if(watchedCache != nil) 
    96                 return [watchedCache boolValue]; 
    97         BOOL ret = [self internalWatchedValue]; 
    98         watchedCache = [[NSNumber alloc] initWithBool:ret]; 
     89        id key = filterPredicate; 
     90        if(filterPredicate == nil) 
     91                key = [NSNull null]; 
     92        NSMutableDictionary *cacheForFilter = [predicateCache objectForKey:key]; 
     93        if(cacheForFilter == nil) 
     94        { 
     95                cacheForFilter = [[NSMutableDictionary alloc] init]; 
     96                [predicateCache setObject:cacheForFilter forKey:key]; 
     97                [cacheForFilter release]; 
     98        } 
     99        NSNumber *cache = [cacheForFilter objectForKey:pred]; 
     100        if(cache != nil) 
     101                return [cache boolValue]; 
     102         
     103        BOOL ret = [self checkPredicate:pred]; 
     104        [cacheForFilter setObject:[NSNumber numberWithBool:ret] forKey:pred]; 
    99105        return ret; 
    100106} 
    101107 
    102 - (NSNumber *)watched 
     108- (BOOL)containsFileMatchingFilterPredicate:(NSPredicate *)pred 
    103109{ 
    104         if(watchedCache != nil) 
    105                 return watchedCache; 
    106         NSNumber *ret = [NSNumber numberWithBool:[self internalWatchedValue]]; 
    107         watchedCache = [ret retain]; 
     110        NSPredicate *tpred = filterPredicate; 
     111        filterPredicate = nil; 
     112        BOOL ret = [self checkPredicate:pred]; 
     113        filterPredicate = tpred; 
     114         
    108115        return ret; 
    109 } 
    110  
    111 - (void)setWatchedValue:(BOOL)watched 
    112 { 
    113         [self setWatched:[NSNumber numberWithBool:watched]]; 
    114 } 
    115  
    116 - (void)setWatched:(NSNumber *)watched 
    117 { 
    118         SEL select = @selector(setWatched:); 
    119         NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[SapphireFileMetaData class] instanceMethodSignatureForSelector:select]]; 
    120         [inv setSelector:select]; 
    121         [inv setArgument:&watched atIndex:2]; 
    122         [self invokeRecursivelyOnFiles:inv]; 
    123         [SapphireMetaDataSupport save:[self managedObjectContext]]; 
    124         [watchedCache release]; 
    125         watchedCache = [watched retain]; 
    126 } 
    127  
    128 - (BOOL)internalFavoriteValue 
    129 { 
    130         return [self checkPredicate:[SapphireApplianceController favoritePredicate]]; 
    131 } 
    132  
    133 - (BOOL)favoriteValue 
    134 { 
    135         if(favoriteCache != nil) 
    136                 return [favoriteCache boolValue]; 
    137         BOOL ret = [self internalFavoriteValue]; 
    138         favoriteCache = [[NSNumber alloc] initWithBool:ret]; 
    139         return ret; 
    140 } 
    141  
    142 - (NSNumber *)favorite 
    143 { 
    144         if(favoriteCache != nil) 
    145                 return favoriteCache; 
    146         NSNumber *ret = [NSNumber numberWithBool:[self internalFavoriteValue]]; 
    147         favoriteCache = [ret retain]; 
    148         return ret; 
    149 } 
    150  
    151 - (void)setFavoriteValue:(BOOL)favorite 
    152 { 
    153         [self setFavorite:[NSNumber numberWithBool:favorite]]; 
    154 } 
    155  
    156 - (void)setFavorite:(NSNumber *)favorite 
    157 { 
    158         SEL select = @selector(setFavorite:); 
    159         NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[SapphireFileMetaData class] instanceMethodSignatureForSelector:select]]; 
    160         [inv setSelector:select]; 
    161         [inv setArgument:&favorite atIndex:2]; 
    162         [self invokeRecursivelyOnFiles:inv]; 
    163         [SapphireMetaDataSupport save:[self managedObjectContext]]; 
    164         [favoriteCache release]; 
    165         favoriteCache = [favorite retain]; 
    166116} 
    167117 
    168118- (void)clearPredicateCache 
    169119{ 
    170         BOOL report = NO; 
    171120        id <SapphireDirectory> myParentDir = [self parentDirectory]; 
     121        [predicateCache removeAllObjects]; 
     122/*      BOOL report = NO; 
    172123        if(watchedCache != nil) 
    173124        { 
     
    188139                        report = YES; 
    189140        } 
    190         if(report) 
     141        if(report)*/ 
    191142                [myParentDir clearPredicateCache]; 
    192143} 
     
    196147        [filterPredicate release]; 
    197148        filterPredicate = [predicate retain]; 
    198         [self clearPredicateCache]; 
    199149} 
    200150 
     
    234184        NSNumber *num = [NSNumber numberWithInt:mask]; 
    235185        [inv setArgument:&num atIndex:2]; 
    236         [self invokeRecursivelyOnFiles:inv]; 
     186        [self invokeOnAllFiles:inv]; 
    237187        [SapphireMetaDataSupport save:[self managedObjectContext]]; 
    238188} 
     
    243193        NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[SapphireFileMetaData class] instanceMethodSignatureForSelector:select]]; 
    244194        [inv setSelector:select]; 
    245         [self invokeRecursivelyOnFiles:inv]; 
     195        [self invokeOnAllFiles:inv]; 
    246196        [SapphireMetaDataSupport save:[self managedObjectContext]]; 
    247197}