Well, when I said ANY, I really meant "IN termsArray", but for the
partial matches that you want your approach is fine, you'll just want
to use > & <= with character evaluations to speed this up. Check the
2010 CoreData Performance session from WWDC for more details, but it's
a standard SQL trick to speed up string comparisons.

_Karl

On Thu, Jul 7, 2011 at 10:38 AM, Indragie Karunaratne
<cocoa...@indragie.com> wrote:
> I came up with this code earlier:
> NSArray *searchTerms = [cleanedQuery componentsSeparatedByString:@" "];
>     NSPredicate *basePredicate = [NSPredicate
> predicateWithFormat:@"SUBQUERY(keywords, $keyword, $keyword.name BEGINSWITH
> $QUERY).@count != 0"];
>     NSMutableArray *subpredicates = [NSMutableArray array];
>     for (NSString *searchTerm in searchTerms) {
>         NSDictionary *sub = [NSDictionary
> dictionaryWithObjectsAndKeys:searchTerm, @"QUERY", nil];
>         NSPredicate *termPredicate = [basePredicate
> predicateWithSubstitutionVariables:sub];
>         [subpredicates addObject:termPredicate];
>     }
>     NSPredicate *combinedPredicate = [NSCompoundPredicate
> andPredicateWithSubpredicates:subpredicates];
>
> This doesn't use "ANY" as you mentioned (not sure exactly how I would use
> that) but it works. However, I'm sure there's a better way to simplify this
> instead of using a giant compound AND predicate to match each one of the
> search terms. Is there any way to simplify this?
> Thanks
> On 2011-07-07, at 11:23 AM, The Karl Adam wrote:
>
> You want to be using SUBQUERY() to match ANY keywords. Check the docs
> for the predicate reference details for this.
>
> _Karl
>
> On Wed, Jul 6, 2011 at 8:23 PM, Indragie Karunaratne
> <cocoa...@indragie.com> wrote:
>
> Hi all,
>
> I have a Core Data object model that I'm trying to write a fetch predicate
> for (to use for search). Quick explanation of the model:
>
> We'll call the main entity "Book".  There's also a "Keyword" entity. The
> Book entity has a to-many relationship with the Keyword entity called
> "keywords". In turn, the Keyword entity has an inverse relationship with the
> Book entity called "book".  The Keyword entity has a single attribute called
> "name". So basically, each Book has Keywords that describe it.
>
> For my search, I have an array of search terms. I need a predicate that I
> can use on fetch requests for the Book entity that will evaluate to TRUE if
> ALL of the search terms have a corresponding Keyword in that the "name"
> property begins with the search term.
>
> For example:
>
> There are three books:
>
> Book1 - keywords: {"fiction", "scifi"}
>
> Book2 - keywords: {"nonfiction"}
>
> If the search terms were {"fic", "nonfic", "sci"} the resulting fetched
> array would contain NOTHING because none of the books have keywords that
> begin with all 3 of those search terms..
>
> However, if the search terms were {"fic", "sci"}, the resulting fetched
> array would contain Book1 since its keywords "fiction" and "scifi" begin
> with the two search terms "fic" and "sci".  The key part here is that ALL of
> the search terms have to have a corresponding keyword as demonstrated above
> for the predicate to evaluate to true.
>
> I hope I've explained this problem well enough, it's hard to put this stuff
> into words ;-)
>
> Any help is appreciated,
>
> Indragie_______________________________________________
>
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>
> 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/karl.adam%40gmail.com
>
> This email sent to karl.a...@gmail.com
>
>
>
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to