Greetings!

I am facing a problem with a complicated predicate I'm building.
it keeps returning multiple instances of the same records.
if every predicate used alone works as a charm, problems occur when they are 
combined together.

my model is constructed as so
------------------------------------
Table 1 contains most descriptive fields.
        name
        description
        additional information.

Table 2 contains the categories
        name for the category
        keyword

Table 3 contains elements
        name of the element
        keyword

table 1 has a to-many relationship to table 2
table 2 has a to many inverse relationship to table 1

table 1 has a to-many relationship to table 3
table 3 has a to many inverse relationship to table 1
        
-one item from table 1 can belong to many categories and one category can be 
assigned to multiple items from table 1
-one item from table 1 can have many elements, and one element can belong to 
many items of table 1;

----------------------------
My search criteria's are as so.
user can enter keywords to search the tiems.
user can select from a list of categories the categories to search for.
user can select fro ma list of elements the elements to include in the search.

The keywords are separated in components and filtered against a StopWord array 
as to keep only the relevant words to build the predicate.
each keyword is OR'd against three search field.
and then AND together as to assure all keywords appear in one particular item 
of table 1

        if ([self.searchText.text length] > 0){
                NSArray * components = [self.searchText.text 
componentsSeparatedByString:@" "];
                for (NSString *component in components){
                        if (!isInFrenchStopWords(component)){
                                NSMutableArray *orSubPredicates = 
[NSMutableArray new];         
                                [orSubPredicates addObject:[NSPredicate 
predicateWithFormat:@"%@ IN[cd] self.name",component]];                         
                                [orSubPredicates addObject:[NSPredicate 
predicateWithFormat:@"%@ IN[cd] self.description",component]];                  
        
                                [orSubPredicates addObject:[NSPredicate 
predicateWithFormat:@"%@ IN[cd] self.addInfo",component]];                      
        
                                // build a OR Predicate for this particular 
keyword.
                                [keywordsSubPredicates 
addObject:[NSCompoundPredicate orPredicateWithSubpredicates:orSubPredicates]];
                                [orSubPredicates release];
                        }
                }
                // keywords are combined in a AND predicate, all keywords must 
have a hit.
                [finalSubPredicates addObject:[NSCompoundPredicate 
andPredicateWithSubpredicates:keywordsSubPredicates]];
        }

Then if there are selected categories these are also predicated as so.
the selected categories ManagedObject are stored in an NSDictionary

A predicate is built for every selected category, because it is a many to many 
relationship.
i've tried using category.name but that did not work.

        if ([self.categoryPredicateDict count]){
                NSArray * components = [self.categoryPredicateDict allValues];
                for (ModelCategory *component in components){
                        [categoriesSubPredicates addObject:[NSPredicate 
predicateWithFormat:@"%@ IN[cd] categories",component]];                        
                
                }
                // or any selected Category
                [finalSubPredicates addObject:[NSCompoundPredicate 
orPredicateWithSubpredicates:categoriesSubPredicates]];
        }

A predicate is built for every selected element, because it is a many to many 
relationship.

        if ([self.elementPredicateDict count]){
                NSArray * components = [self.elementPredicateDict allValues];
                for (ModelElement *component in components){
                        [elementSubPredicates addObject:[NSPredicate 
predicateWithFormat:@"%@ IN[cd] elements",component]];                          
           
                }
                // or any selected elements
                [finalSubPredicates addObject:[NSCompoundPredicate 
orPredicateWithSubpredicates:elementsSubPredicates]];
        }


and then to finalize everything and put it all together.

return [NSCompoundPredicate andPredicateWithSubpredicates:finalSubPredicates];


then this predicate is fed to a fetch Request which in turn is fed to a fetched 
Result Controller.
the fetch is configured to      [fetchRequest setReturnsDistinctResults:YES];

The problem as stated in the introduction this complete predicate returns 
multiple instances of the same record and it should not.
if any of you see a flaw in the logic or anything, please comment, I'm 
currently so deep into it, I cant see it anymore. :)

I hope I have not missed nay details.
Thank you!!!
Sandro.




_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to