Explicación rápida de SUBQUERY en NSPredicate Expression

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 syntax para que yo pueda usarlo?

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

Gracias

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 syntax de la cadena de formato predicado.

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 

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 …) 🙂