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

24
demandé sur János 2010-09-28 12:36:43

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.

19
répondu Peter Hosey 2011-07-04 21:27:51

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 SUBQUERYs)

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
41
répondu Dave DeLong 2010-09-28 17:08:39

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...) :)

0
répondu Maciek Czarnik 2016-12-15 12:45:58