objective iphone cocoa cocoa-touch subquery nspredicate

iphone - nspredicate objective c



Explicación rápida de SUBQUERY en NSPredicate Expression (3)

Parece que no hay documentación sobre la palabra clave SUBQUERY de Apple y no puedo encontrar una explicación simple al respecto en SO o en Google. Es una conspiración! ;)

Por favor , podría alguien del círculo interno por favor solo dar una explicación rápida de su sintaxis para que yo pueda usarlo?

SUBQUERY(Bs, $x, $x IN %@)

Gracias


La subconsulta representa un predicado (tercer argumento - $x IN %@ ) que se evalúa en todos los objetos (segundo argumento - $x - es como un nombre de variable en foreach) de una relación (primer argumento - Bs ). De forma similar a la consulta regular, se devuelve una lista de objetos.

Veo en muchos lugares que la gente usa $x casi dogmáticamente, pero la relación $object in objects tiene mucho sentido (o $city en las cities ...) :)


Y para las personas que no obtienen exactamente lo que dice la documentación, una SUBQUERY es esencialmente esta:

SUBQUERY(collection, variableName, predicateFormat)

Y podría (simplísticamente) implementarse así:

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;

En pocas palabras, una SUBQUERY consiste básicamente en tomar una colección de objetos y filtrar varios objetos en función de la expresión de predicado de SUBQUERY y devolver la colección resultante. (Y el predicado mismo puede contener otras SUBQUERY )

Ejemplo:

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