root/branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireMovie.m @ 840

Revision 840, 19.1 KB (checked in by gbooker, 16 months ago)

Delete unused objects as they become unused so as to not need the prune call later. This will help accelerate things later. Also, handled XML a bit better.

Line 
1#import "SapphireMovie.h"
2#import "SapphireGenre.h"
3#import "SapphireCast.h"
4#import "SapphireDirector.h"
5#import "CoreDataSupportFunctions.h"
6#import "SapphireMetaDataSupport.h"
7#import "SapphireFileMetaData.h"
8#import "SapphireApplianceController.h"
9#import "SapphireXMLData.h"
10#import "NSString-Extensions.h"
11#import "SapphireMovieTranslation.h"
12
13NSString *FILE_DID_CHANGE_MOVIE_NOTIFICATION = @"FileDidChangeMovie";
14NSString *MOVIE_DID_CHANGE_PREDICATE_MATCHING = @"MovieDidChangePredicateMatching";
15
16#define ORDERED_CAST_KEY                        @"orderedCast"
17#define ORDERED_CAST_DATA                       @"orderedCastData"
18#define OVERRIDDEN_CAST_DATA            @"overriddenCastData"
19#define ORDERED_DIRECTOR_KEY            @"orderedDirectors"
20#define ORDERED_DIRECTOR_DATA           @"orderedDirectorsData"
21#define OVERRIDDEN_DIRECTOR_DATA        @"overriddenDirectorsData"
22#define ORDERED_GENRES_KEY                      @"orderedGenres"
23#define ORDERED_GENRES_DATA                     @"orderedGenresData"
24#define OVERRIDDEN_GENRES_DATA          @"overriddenGenresData"
25
26
27@implementation SapphireMovie
28
29+ (SapphireMovie *)movieWithIMDB:(int)imdbNumber inContext:(NSManagedObjectContext *)moc
30{
31        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"imdbNumber == %d", imdbNumber];
32        return (SapphireMovie *)doSingleFetchRequest(SapphireMovieName, moc, predicate);
33}
34       
35+ (SapphireMovie *)createMovieWithIMDB:(int)imdbNumber inContext:(NSManagedObjectContext *)moc
36{
37        SapphireMovie *ret = [SapphireMovie movieWithIMDB:imdbNumber inContext:moc];
38        if(ret != nil)
39                return ret;
40       
41        ret = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:moc];
42        ret.imdbNumber = [NSNumber numberWithInt:imdbNumber];
43        return ret;
44}
45
46+ (SapphireMovie *)movieWithTitle:(NSString *)title inContext:(NSManagedObjectContext *)moc
47{
48        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"imdbNumber == nil && title == %@", title];
49        return (SapphireMovie *)doSingleFetchRequest(SapphireMovieName, moc, predicate);
50}
51
52+ (SapphireMovie *)createMovieWithTitle:(NSString *)title inContext:(NSManagedObjectContext *)moc
53{
54        SapphireMovie *ret = [SapphireMovie movieWithTitle:title inContext:moc];
55        if(ret != nil)
56                return ret;
57       
58        ret = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:moc];
59        ret.title = title;
60        ret.imdbNumber = nil;
61        return ret;
62}
63
64+ (SapphireMovie *)movieWithDictionary:(NSDictionary *)dict inContext:(NSManagedObjectContext *)moc
65{
66        return [self movieWithDictionary:dict inContext:moc lookup:nil];
67}
68
69+ (SapphireMovie *)movieWithDictionary:(NSDictionary *)dict inContext:(NSManagedObjectContext *)moc lookup:(NSDictionary *)lookup
70{
71        NSString *imdbStr = [dict objectForKey:META_MOVIE_IDENTIFIER_KEY];
72        int imdbNumber = [SapphireMovie imdbNumberFromString:imdbStr];
73        if(imdbNumber == 0)
74                return nil;
75       
76        SapphireMovie *ret = [SapphireMovie createMovieWithIMDB:imdbNumber inContext:moc];
77        ret.title = [dict objectForKey:META_MOVIE_TITLE_KEY];
78        ret.releaseDate = [dict objectForKey:META_MOVIE_RELEASE_DATE_KEY];
79        ret.MPAARating = [dict objectForKey:META_MOVIE_MPAA_RATING_KEY];
80        ret.imdbRating = [dict objectForKey:META_MOVIE_IMDB_RATING_KEY];
81        ret.plot = [dict objectForKey:META_MOVIE_PLOT_KEY];
82        id value = [dict objectForKey:META_MOVIE_IMDB_250_KEY];
83        int i;
84        if((i = [value intValue]) != 0)
85                ret.imdbTop250RankingValue = i;
86        value = [dict objectForKey:META_MOVIE_OSCAR_KEY];
87        if((i = [value intValue]) != 0)
88                ret.oscarsWonValue = i;
89        NSMutableArray *genreArray = [NSMutableArray array];
90        NSEnumerator *genreEnum = [[dict objectForKey:META_MOVIE_GENRES_KEY] objectEnumerator];
91        NSString *genre;
92        while((genre = [genreEnum nextObject]) != nil)
93                [genreArray addObject:[SapphireGenre createGenre:genre inContext:moc]];
94        ret.orderedGenres = genreArray;
95       
96        NSMutableDictionary *directorLookup = [lookup objectForKey:@"Directors"];
97        NSMutableArray *dirArray = [NSMutableArray array];
98        NSEnumerator *directorEnum = [[dict objectForKey:META_MOVIE_DIRECTOR_KEY] objectEnumerator];
99        if(directorLookup == nil)
100        {
101                NSString *director;
102                while((director = [directorEnum nextObject]) != nil)
103                        [dirArray addObject:[SapphireDirector createDirector:director inContext:moc]];
104        }
105        else
106        {
107                NSString *director;
108                while((director = [directorEnum nextObject]) != nil)
109                {
110                        SapphireDirector *cached = [directorLookup objectForKey:director];
111                        if(cached == nil)
112                        {
113                                cached = [SapphireDirector createDirector:director inContext:moc];
114                                [directorLookup setObject:cached forKey:director];
115                        }
116                        [dirArray addObject:cached];
117                }
118        }
119        ret.orderedDirectors = dirArray;
120
121        NSMutableDictionary *castLookup = [lookup objectForKey:@"Cast"];
122        NSMutableArray *castArray = [NSMutableArray array];
123        NSEnumerator *castEnum = [[dict objectForKey:META_MOVIE_CAST_KEY] objectEnumerator];
124        NSString *cast;
125        if(castLookup == nil)
126        {
127                while((cast = [castEnum nextObject]) != nil)
128                        [castArray addObject:[SapphireCast createCast:cast inContext:moc]];
129        }
130        else
131        {
132                while((cast = [castEnum nextObject]) != nil)
133                {
134                        SapphireCast *cached = [castLookup objectForKey:cast];
135                        if(cached == nil)
136                        {
137                                cached = [SapphireCast createCast:cast inContext:moc];
138                                [castLookup setObject:cached forKey:cast];
139                        }
140                        [castArray addObject:cached];
141                }
142        }
143        ret.orderedCast = castArray;
144        return ret;
145}
146
147+ (int)imdbNumberFromString:(NSString *)imdbStr
148{
149        int imdbNumber = 0;
150        if(imdbStr != nil)
151        {
152                NSScanner *scanner = [NSScanner scannerWithString:imdbStr];
153                [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
154                [scanner scanInt:&imdbNumber];
155        }
156        return imdbNumber;
157}
158
159+ (NSDictionary *)upgradeV1MoviesFromContext:(NSManagedObjectContext *)oldMoc toContext:(NSManagedObjectContext *)newMoc withCast:(NSDictionary *)cast directors:(NSDictionary *)directors genres:(NSDictionary *)genres
160{
161        NSMutableDictionary *lookup = [NSMutableDictionary dictionary];
162        NSArray *oldMovies = doFetchRequest(SapphireMovieName, oldMoc, nil);
163        NSEnumerator *movieEnum = [oldMovies objectEnumerator];
164        NSManagedObject *oldMovie;
165        while((oldMovie = [movieEnum nextObject]) != nil)
166        {
167                SapphireMovie *newMovie = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:newMoc];
168                NSNumber *imdbNumber = [oldMovie valueForKey:@"imdbNumber"];
169                newMovie.imdbNumber = imdbNumber;
170                newMovie.imdbRating = [oldMovie valueForKey:@"imdbRating"];
171                newMovie.imdbTop250Ranking = [oldMovie valueForKey:@"imdbTop250Ranking"];
172                newMovie.MPAARating = [oldMovie valueForKey:@"MPAARating"];
173                newMovie.oscarsWon = [oldMovie valueForKey:@"oscarsWon"];
174                newMovie.plot = [oldMovie valueForKey:@"plot"];
175                newMovie.releaseDate = [oldMovie valueForKey:@"releaseDate"];
176                newMovie.title = [oldMovie valueForKey:@"title"];
177               
178                NSData *propData = [oldMovie valueForKey:@"orderedCastData"];
179                NSArray *castNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
180                NSEnumerator *castEnum = [castNames objectEnumerator];
181                NSString *name;
182                NSMutableArray *objArray = [NSMutableArray array];
183                while((name = [castEnum nextObject]) != nil)
184                {
185                        [objArray addObject:[cast objectForKey:name]];
186                }
187                newMovie.orderedCast = objArray;
188               
189                propData = [oldMovie valueForKey:@"orderedDirectorsData"];
190                NSArray *directorNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
191                NSEnumerator *directorEnum = [directorNames objectEnumerator];
192                objArray = [NSMutableArray array];
193                while((name = [directorEnum nextObject]) != nil)
194                {
195                        [objArray addObject:[directors objectForKey:name]];
196                }
197                newMovie.orderedDirectors = objArray;
198               
199                propData = [oldMovie valueForKey:@"orderedGenresData"];
200                NSArray *genreNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
201                NSEnumerator *genreEnum = [genreNames objectEnumerator];
202                objArray = [NSMutableArray array];
203                while((name = [genreEnum nextObject]) != nil)
204                {
205                        [objArray addObject:[genres objectForKey:name]];
206                }
207                newMovie.orderedGenres = objArray;
208               
209                NSEnumerator *translationEnum = [[oldMovie valueForKey:@"translations"] objectEnumerator];
210                NSManagedObject *translation;
211                while((translation = [translationEnum nextObject]) != nil)
212                {
213                        [SapphireMovieTranslation upgradeV1MovieTranslation:translation toMovie:newMovie];
214                }
215                [lookup setObject:newMovie forKey:imdbNumber];
216        }
217        return lookup;
218}
219
220- (NSComparisonResult)releaseDateCompare:(SapphireMovie *)other
221{
222        return [self.releaseDate compare:other.releaseDate];
223}
224
225- (NSComparisonResult)titleCompare:(SapphireMovie *)other
226{
227        return [self.title nameCompare:other.title];
228}
229
230- (NSComparisonResult)imdbTop250RankingCompare:(SapphireMovie *)other
231{
232        return [self.imdbTop250Ranking compare:other.imdbTop250Ranking];
233}
234
235- (NSComparisonResult)oscarsWonCompare:(SapphireMovie *)other
236{
237        return [self.oscarsWon compare:other.oscarsWon];
238}
239
240- (NSComparisonResult)imdbRatingCompare:(SapphireMovie *)other
241{
242        NSNumber *otherNum = other.imdbRating;
243        NSNumber *myNum = self.imdbRating;
244        if(myNum != nil)
245                if(otherNum != nil)
246                        return [myNum compare:otherNum];
247                else
248                        return NSOrderedDescending;
249        else if(otherNum != nil)
250                return NSOrderedAscending;
251        return NSOrderedSame;
252}
253
254- (NSArray *)orderedCast
255{
256        [self willAccessValueForKey:ORDERED_CAST_KEY];
257        NSArray *ret = [self primitiveValueForKey:ORDERED_CAST_KEY];
258        [self didAccessValueForKey:ORDERED_CAST_KEY];
259        if(ret == nil)
260        {
261                NSData *propData = [self valueForKey:OVERRIDDEN_CAST_DATA];
262                if(propData == nil)
263                        propData = [self valueForKey:ORDERED_CAST_DATA];
264                if(propData != nil)
265                {
266                        NSArray *names = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
267                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[names count]];
268                        NSManagedObjectContext *moc = [self managedObjectContext];
269                        NSEnumerator *nameEnum = [names objectEnumerator];
270                        NSString *name;
271                        while((name = [nameEnum nextObject]) != nil)
272                        {
273                                SapphireCast *aCast = [SapphireCast createCast:name inContext:moc];
274                                if(aCast != nil)
275                                        [mutRet addObject:aCast];
276                        }
277                        ret = [NSArray arrayWithArray:mutRet];
278                        [self setPrimitiveValue:ret forKey:ORDERED_CAST_KEY];
279                }
280        }
281       
282        return ret;
283}
284
285- (void)setOrderedCast:(NSArray *)ordered
286{
287        [self willChangeValueForKey:ORDERED_CAST_KEY];
288        [self setPrimitiveValue:ordered forKey:ORDERED_CAST_KEY];
289        [self didChangeValueForKey:ORDERED_CAST_KEY];
290        NSArray *arc = [ordered valueForKey:@"name"];
291        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_CAST_DATA];
292        [self setValue:[NSSet setWithArray:ordered] forKey:@"cast"];
293        int i, count=[ordered count];
294        if(count > 10)
295                count = 10;
296        for(i=0; i<count; i++)
297        {
298                ((SapphireCast *)[ordered objectAtIndex:i]).hasMajorRoleValue = YES;
299        }       
300}
301
302- (NSArray *)orderedGenres
303{
304        [self willAccessValueForKey:ORDERED_GENRES_KEY];
305        NSArray *ret = [self primitiveValueForKey:ORDERED_GENRES_KEY];
306        [self didAccessValueForKey:ORDERED_GENRES_KEY];
307        if(ret == nil)
308        {
309                NSData *propData = [self valueForKey:OVERRIDDEN_GENRES_DATA];
310                if(propData == nil)
311                        propData = [self valueForKey:ORDERED_GENRES_DATA];
312                if(propData != nil)
313                {
314                        NSArray *genres = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
315                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[genres count]];
316                        NSManagedObjectContext *moc = [self managedObjectContext];
317                        NSEnumerator *genreEnum = [genres objectEnumerator];
318                        NSString *genre;
319                        while((genre = [genreEnum nextObject]) != nil)
320                        {
321                                SapphireGenre *aGenre = [SapphireGenre createGenre:genre inContext:moc];
322                                if(aGenre != nil)
323                                        [mutRet addObject:aGenre];
324                        }
325                        ret = [NSArray arrayWithArray:mutRet];
326                        [self setPrimitiveValue:ret forKey:ORDERED_GENRES_KEY];
327                }
328        }
329       
330        return ret;
331}
332
333- (void)setOrderedGenres:(NSArray *)ordered
334{
335        [self willChangeValueForKey:ORDERED_GENRES_KEY];
336        [self setPrimitiveValue:ordered forKey:ORDERED_GENRES_KEY];
337        [self didChangeValueForKey:ORDERED_GENRES_KEY];
338        NSArray *arc = [ordered valueForKey:@"name"];
339        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_GENRES_DATA];
340        [self setValue:[NSSet setWithArray:ordered] forKey:@"genres"];
341}
342
343- (NSArray *)orderedDirectors
344{
345        [self willAccessValueForKey:ORDERED_DIRECTOR_KEY];
346        NSArray *ret = [self primitiveValueForKey:ORDERED_DIRECTOR_KEY];
347        [self didAccessValueForKey:ORDERED_DIRECTOR_KEY];
348        if(ret == nil)
349        {
350                NSData *propData = [self valueForKey:OVERRIDDEN_DIRECTOR_DATA];
351                if(propData == nil)
352                        propData = [self valueForKey:ORDERED_DIRECTOR_DATA];
353                if(propData != nil)
354                {
355                        NSArray *names = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
356                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[names count]];
357                        NSManagedObjectContext *moc = [self managedObjectContext];
358                        NSEnumerator *nameEnum = [names objectEnumerator];
359                        NSString *name;
360                        while((name = [nameEnum nextObject]) != nil)
361                        {
362                                SapphireDirector *aDir = [SapphireDirector createDirector:name inContext:moc];
363                                if(aDir != nil)
364                                        [mutRet addObject:aDir];
365                        }
366                        ret = [NSArray arrayWithArray:mutRet];
367                        [self setPrimitiveValue:ret forKey:ORDERED_DIRECTOR_KEY];
368                }
369        }
370       
371        return ret;
372}
373
374- (void)setOrderedDirectors:(NSArray *)ordered
375{
376        [self willChangeValueForKey:ORDERED_DIRECTOR_KEY];
377        [self setPrimitiveValue:ordered forKey:ORDERED_DIRECTOR_KEY];
378        [self didChangeValueForKey:ORDERED_DIRECTOR_KEY];
379        NSArray *arc = [ordered valueForKey:@"name"];
380        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_DIRECTOR_DATA];
381        [self setValue:[NSSet setWithArray:ordered] forKey:@"directors"];
382}
383
384#define checkOrderedData(property, overridden) \
385{ \
386        NSEnumerator *xmlEnum = [self.xmlSet objectEnumerator]; \
387        SapphireXMLData *xml; \
388        while([overridden count] == 0 && (xml = [xmlEnum nextObject]) != nil) \
389                overridden = xml.property; \
390}
391
392- (void)checkOrderedCast
393{
394        NSArray *overridden = nil;
395        checkOrderedData(orderedCast, overridden);
396        if(![overridden count])
397                self.overriddenCastData = nil;
398        else
399        {
400                NSArray *names = [overridden valueForKey:@"name"];
401                self.overriddenCastData = [NSKeyedArchiver archivedDataWithRootObject:names];
402        }
403        [self setPrimitiveValue:nil forKey:ORDERED_CAST_KEY];
404        [self setValue:[NSSet setWithArray:self.orderedCast] forKey:@"cast"];
405}
406
407- (void)checkOrderedGenres
408{
409        NSArray *overridden = nil;
410        checkOrderedData(orderedGenres, overridden);
411        if(![overridden count])
412                self.overriddenGenresData = nil;
413        else
414        {
415                NSArray *names = [overridden valueForKey:@"name"];
416                self.overriddenGenresData = [NSKeyedArchiver archivedDataWithRootObject:names];
417        }
418        [self setPrimitiveValue:nil forKey:ORDERED_GENRES_KEY];
419        [self setValue:[NSSet setWithArray:self.orderedGenres] forKey:@"genres"];
420}
421
422- (void)checkOrderedDirectors
423{
424        NSArray *overridden = nil;
425        checkOrderedData(orderedDirectors, overridden);
426        if(![overridden count])
427                self.overriddenDirectorsData = nil;
428        else
429        {
430                NSArray *names = [overridden valueForKey:@"name"];
431                self.overriddenDirectorsData = [NSKeyedArchiver archivedDataWithRootObject:names];
432        }
433        [self setPrimitiveValue:nil forKey:ORDERED_DIRECTOR_KEY];
434        [self setValue:[NSSet setWithArray:self.orderedDirectors] forKey:@"directors"];
435}
436
437- (void)checkXMLOverridenSets
438{
439        [self checkOrderedCast];
440        [self checkOrderedGenres];
441        [self checkOrderedDirectors];
442}
443
444- (void)addXml:(NSSet*)addedXMLs
445{
446        [super addXml:addedXMLs];
447        [self checkXMLOverridenSets];
448}
449
450-(void)removeXml:(NSSet*)removedXMLs
451{
452        [super removeXml:removedXMLs];
453        //This can occur during a delete propogation, which appears to have KVO completely broken; workaround
454        [SapphireMetaDataSupport setObjectForPendingDelete:self];
455}
456
457- (void)addXmlObject:(SapphireXMLData*)addedXML
458{
459        [super addXmlObject:addedXML];
460        [self checkXMLOverridenSets];
461}
462
463- (void)removeXmlObject:(SapphireXMLData*)removedXML
464{
465        [super removeXmlObject:removedXML];
466        //This can occur during a delete propogation, which appears to have KVO completely broken; workaround
467        [SapphireMetaDataSupport setObjectForPendingDelete:self];
468}
469
470- (NSString *)title
471{
472        overrideWithXMLForKey(NSString, title);
473        return super.title;
474}
475
476- (NSString *)plot
477{
478        overrideWithXMLForKey(NSString, summary);
479        overrideWithXMLForKey(NSString, contentDescription);
480        return super.plot;
481}
482
483- (BOOL)castMemberHasMajorRoleStatus:(SapphireCast *)cast
484{
485        NSArray *ordered = self.orderedCast;
486        int i, count=[ordered count];
487        if(count > 10)
488                count = 10;
489        for(i=0; i<count; i++)
490        {
491                if([ordered objectAtIndex:i] == cast)
492                        return YES;
493        }
494        return NO;
495}
496
497- (NSString *)path
498{
499        return [@"@MOVIES/Movie" stringByAppendingPathComponent:[self.imdbNumber stringValue]];
500}
501
502- (NSString *)coverArtPath
503{
504        return [NSString stringWithFormat:@"%@/@MOVIES/%@", [SapphireMetaDataSupport collectionArtPath], self.imdbNumber];
505}
506
507- (void)insertDisplayMetaData:(NSMutableDictionary *)dict
508{
509        id value = [self title];
510        if(value != nil)
511                [dict setObject:value forKey:META_MOVIE_TITLE_KEY];
512        value = [self MPAARating];
513        if(value != nil)
514                [dict setObject:value forKey:META_MOVIE_MPAA_RATING_KEY];
515        value = [self imdbRating];
516        if(value != nil)
517                [dict setObject:value forKey:META_MOVIE_IMDB_RATING_KEY];
518        value = [self plot];
519        if(value != nil)
520                [dict setObject:value forKey:META_MOVIE_PLOT_KEY];
521        value = [self releaseDate];
522        if(value != nil)
523                [dict setObject:value forKey:META_MOVIE_RELEASE_DATE_KEY];
524        value = [self imdbTop250Ranking];
525        if(value != nil)
526                [dict setObject:value forKey:META_MOVIE_IMDB_250_KEY];
527        value = [self oscarsWon];
528        if(value != nil)
529                [dict setObject:value forKey:META_MOVIE_OSCAR_KEY];
530        value = [[self orderedDirectors] valueForKey:@"name"];
531        if(value != nil)
532                [dict setObject:value forKey:META_MOVIE_DIRECTOR_KEY];
533        value = [[self orderedCast] valueForKey:@"name"];
534        if(value != nil)
535                [dict setObject:value forKey:META_MOVIE_CAST_KEY];
536        value = [[self orderedGenres] valueForKey:@"name"];
537        if(value != nil)
538                [dict setObject:value forKey:META_MOVIE_GENRES_KEY];
539}
540
541- (NSNumber *)watched
542{
543        NSSet *files = self.filesSet;
544        if([files count] < 2)
545                return [[files anyObject] watched];
546       
547        NSArray *remain = [[files allObjects] filteredArrayUsingPredicate:[SapphireApplianceController unwatchedPredicate]];
548        if([remain count])
549                return [NSNumber numberWithBool:YES];
550        return [NSNumber numberWithBool:NO];
551}
552
553- (NSNumber *)favorite
554{
555        NSSet *files = self.filesSet;
556        if([files count] < 2)
557                return [[files anyObject] favorite];
558       
559        NSArray *remain = [[files allObjects] filteredArrayUsingPredicate:[SapphireApplianceController favoritePredicate]];
560        if([remain count])
561                return [NSNumber numberWithBool:YES];
562        return [NSNumber numberWithBool:NO];
563}
564
565- (void)clearPredicateCache
566{
567        [self.orderedGenres makeObjectsPerformSelector:@selector(clearPredicateCache)];
568        [self.orderedDirectors makeObjectsPerformSelector:@selector(clearPredicateCache)];
569        [self.orderedCast makeObjectsPerformSelector:@selector(clearPredicateCache)];
570        [[NSNotificationCenter defaultCenter] postNotificationName:MOVIE_DID_CHANGE_PREDICATE_MATCHING object:self];
571}
572
573- (void)addFiles:(NSSet*)addedFiles
574{
575        [super addFiles:addedFiles];
576        [self clearPredicateCache];
577}
578
579- (BOOL)shouldDelete
580{
581        if([self.filesSet count] == 0)
582                return YES;
583       
584        [self checkXMLOverridenSets];
585        return NO;
586}
587
588-(void)removeFiles:(NSSet*)removeFiles
589{
590        [super removeFiles:removeFiles];
591        if([self.filesSet count] == 0)
592                [SapphireMetaDataSupport setObjectForPendingDelete:self];
593        else
594                [self clearPredicateCache];
595}
596
597- (void)addFilesObject:(SapphireFileMetaData *)addedFile
598{
599        [super addFilesObject:addedFile];
600        [self clearPredicateCache];
601}
602
603- (void)removeFilesObject:(SapphireFileMetaData *)removeFile
604{
605        [super removeFilesObject:removeFile];
606        if([self.filesSet count] == 0)
607                [SapphireMetaDataSupport setObjectForPendingDelete:self];
608        else
609                [self clearPredicateCache];
610}
611
612@end
Note: See TracBrowser for help on using the browser.