Re: NSPredicate for a ANY match based on two properties at once
On Fri, Jun 20, 2008 at 10:56 AM, Jesse Grosjean [EMAIL PROTECTED] wrote: I'm having a hard time figuring out how to construct a query. The objects involved are: Entry - has many tags Tag - name (string) - value (string) I want to construct searches such as: - find all entries that have a the tag named priority with the value 1. I can use [NSPredicate predicateWithFormat:@ANY tags.name = %@, tag.name] to find all entries that have a particular tag... but I don't know how to also figure in the value. I don't need this predicate to work with a database, these queries are all just being run in memory, with my own custom model objects (not using Core Data). If there is no way to do this in a format string, is there some way to do it by directly constructing a predicate object? Thanks, Jesse ___ Jesse, I'm thinking NSCompoundPredicate is what you're looking for. You should be able to do something like this: NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:@ANY tags.name = %@, tag.name]; NSPredicate *valuePredicate = [NSPredicate predicateWithFormat:@ANY tags.value = %@, tag.value]; NSPredicate *combinedPredicate = [NSComparisonPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:tagPredicate, valuePredicate,nil]]; If the simple predicateWithFormat: predicates don't work, NSComparisonPredicates will definitely do what you need (I've never tried creating a compound predicate with predicateWithFormat: predicates) -- Jim http://nukethemfromorbit.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 [EMAIL PROTECTED]
Re: NSPredicate for a ANY match based on two properties at once
I want to construct searches such as: - find all entries that have a the tag named priority with the value 1. NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:@ANY tags.name = %@, tag.name]; NSPredicate *valuePredicate = [NSPredicate predicateWithFormat:@ANY tags.value = %@, tag.value]; NSPredicate *combinedPredicate = [NSComparisonPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:tagPredicate, valuePredicate,nil]]; Thanks, but I don't think this quite works. The problem is that the two ANY predicates aren't forced to match against the same tag. So if the potential matching entry has multiple tags this query will match if any of those tags match the tag name, and if any of the tags values match the tag name, but there's no constraint that a the same tag value pair matches both constraints. Jesse ___ 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 [EMAIL PROTECTED]
Re: NSPredicate for a ANY match based on two properties at once
On Fri, Jun 20, 2008 at 2:06 PM, Jesse Grosjean [EMAIL PROTECTED] wrote: I want to construct searches such as: - find all entries that have a the tag named priority with the value 1. NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:@ANY tags.name = %@, tag.name]; NSPredicate *valuePredicate = [NSPredicate predicateWithFormat:@ANY tags.value = %@, tag.value]; NSPredicate *combinedPredicate = [NSComparisonPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:tagPredicate, valuePredicate,nil]]; Thanks, but I don't think this quite works. The problem is that the two ANY predicates aren't forced to match against the same tag. So if the potential matching entry has multiple tags this query will match if any of those tags match the tag name, and if any of the tags values match the tag name, but there's no constraint that a the same tag value pair matches both constraints. Jesse You are correct, it doesn't work. And in trying to figure this out, I've come to realize that I've used predicates the hard way in some of my code. Try this instead: NSPredicate *pred = [NSPredicate predicateWithFormat:@(SUBQUERY( tags, $x, $x.name = %@ AND $x.value = %@)[EMAIL PROTECTED] != 0), @aNameToMatch, @aValueToMatch]; Appears that this was a problem in 10.4 and fixed in 10.5. NSExpression's documentation for expressionForSubquery:usingIteratorVariable:predicate: has some discussion about it. -- Jim http://nukethemfromorbit.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 [EMAIL PROTECTED]
Re: NSPredicate for a ANY match based on two properties at once
You are correct, it doesn't work. And in trying to figure this out, I've come to realize that I've used predicates the hard way in some of my code. Try this instead: NSPredicate *pred = [NSPredicate predicateWithFormat:@(SUBQUERY( tags, $x, $x.name = %@ AND $x.value = %@)[EMAIL PROTECTED] != 0), @aNameToMatch, @aValueToMatch]; Wow, that's it! Somehow I missed the whole SUBQUERY possibility. Thank you very much! Jesse ___ 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 [EMAIL PROTECTED]