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
Esto es lo que evalúa una subconsulta. (Encontrado a partir de este hilo de la lista de correo , el n. ° 1 de "NSPredicate subquery" en Google). Ese fragmento de documentación también explica cómo se relaciona la sintaxis de la cadena de formato predicado.