Explication rapide de la sous requête dans L'Expression NSPredicate
Il semble y avoir zéro documentation sur le mot-clé de sous-requête D'Apple et je ne peux pas trouver une explication simple à ce sujet sur SO ou sur Google. C'est une conspiration! ;)
Veuillez, quelqu'un du cercle intérieur pourrait-il simplement fournir une explication rapide de sa syntaxe pour que je puisse l'utiliser?
SUBQUERY(Bs, $x, $x IN %@)
Merci
3 réponses
C'est ce à quoi une sous-requête évalue. (trouvé à partir de Ce thread de liste de diffusion , le hit # 1 pour "NSPredicate subquery" dans Google.) Ce bit de documentation explique également comment la syntaxe de chaîne de format de prédicat s'y rapporte.
Et pour les personnes qui ne comprennent pas tout à fait ce que dit la documentation, un SUBQUERY
est essentiellement ceci:
SUBQUERY(collection, variableName, predicateFormat)
Et pourrait (de manière simpliste) être implémenté comme ceci:
id resultingCollection = ...; //a new collection, either a mutable set or array
NSMutableDictionary * substitutions = [NSMutableDictionary dictionary];
NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat];
for (id variable in collection) {
[substitutions setObject:variable forKey:variableName];
NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions];
if ([filter evaluateWithObject:collection] == YES) {
[resultingCollection addObject:variable];
}
}
return resultingCollection;
Donc, en un mot, un SUBQUERY
prend essentiellement une collection d'objets et filtre divers objets basés sur l'expression de prédicat du SUBQUERY
, et renvoie la collection résultante. (Et le prédicat lui-même peut contenir d'autres SUBQUERY
s)
Exemple:
NSArray * arrayOfArrays = [NSArray arrayWithObjects:
[NSArray arrayWithObjects:....],
[NSArray arrayWithObjects:....],
[NSArray arrayWithObjects:....],
[NSArray arrayWithObjects:....],
[NSArray arrayWithObjects:....],
[NSArray arrayWithObjects:....],
nil];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a.@count > 42)"];
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter];
//"filtered" is an array of arrays
//the only arrays in "filtered" will have at least 42 elements each
Sous-Requête représente un prédicat (troisième argument - $x IN %@
) qui est évaluée sur tous les objets (deuxième argument - $x
- c'est comme un nom de variable dans le foreach) d'une relation (premier argument - Bs
). De même que la requête régulière renvoie une liste d'objets.
Je vois dans de nombreux endroits que les gens utilisent $x
presque dogmatiquement, mais $object
dans objects
la relation a également un sens parfait (ou $city
dans cities
...) :)