15 · Componer directivas (@filter, @sort, @top, @source, @join)
Qué son y qué no son las directivas
Las directivas (@filter, @sort, @top, @source, @join) viven dentro de un bloque de datos y dan forma al conjunto de filas que el bloque itera. Se evalúan en un orden fijo independientemente del orden de las celdas en el origen:
@source <Name>— elige la fuente sobre la que itera el bloque.@join <Source> on ...— empareja filas primarias con filas de otra fuente.@filter <condicion>— conserva las filas en las que la condición es verdadera.@sort <columna> [asc|desc]— ordena las filas.@top <N>— conserva las primeras N filas tras filtrar y ordenar.
Consejo de autoría: pon las directivas en el orden en que se ejecutan. No lo exige la especificación — pero hace la plantilla legible.
Componerlas
Forma habitual: top 5 de renovaciones de alto valor en Madrid.
{{ @filter [Region] = "Madrid" }}
{{ @filter [Importe] > 1000 }}
{{ @sort [Importe] desc }}
{{ @top 5 }}
{{ [Cliente] }} | {{ [Importe] }}
Orden de evaluación:
- Filtrar Region=Madrid.
- Filtrar Importe>1000 (se combina con AND).
- Ordenar las filas supervivientes por Importe descendente.
- Tomar las 5 primeras.
Varios @filter se combinan con AND
Según ADR-0029, varios @filter en un mismo bloque se combinan con AND. No hay palabra clave OR. Para expresar OR, una de tres:
- Combinar en un único filtro con
IN:{{ @filter [Region] in __lists__[active_regions] }} - Dividir en dos bloques de datos (cada uno en su propia región de la plantilla) y dejar que los conjuntos de filas se unan por el simple hecho de renderizarse ambos.
- Preprocesar en el origen.
Componer @source + @join
{{ @source Renovaciones }}
{{ @join Clientes on Renovaciones[customer_id] = Clientes[id] }}
{{ @filter Clientes[tier] = "A" }}
{{ @sort Renovaciones[amount] desc }}
{{ @top 10 }}
{{ Renovaciones[customer_id] }}
{{ Clientes[name] }}
{{ Renovaciones[amount] }}
Pasos:
- Iterar Renovaciones (por
@source). - Inner-join con Clientes por id; las filas sin coincidencia se descartan.
- Conservar solo las filas unidas donde la categoría de Clientes es "A".
- Ordenar por Renovaciones.amount descendente.
- Tomar las 10 primeras.
@filter puede referenciar columnas de cualquiera de las fuentes; la resolución de columnas usa la fuente del bloque activo para los corchetes "pelados" y la forma explícita Source[Column] para el lado unido.
Composiciones prohibidas
Según ADR-0029:
- Como máximo un
@sourcepor bloque de datos. Los duplicados lanzanxl3/directive/invalid-syntax. - Como máximo un
@joinpor bloque de datos. El multi-join queda fuera del alcance. - Nada de self-join.
@join S on S[a] = S[b]dondeSes la fuente activa lanzaxl3/join/bad-on-clause.
@top tras @sort
{{ @sort [Importe] desc }}
{{ @top 10 }}
Top-N no tiene sentido sin un orden. Si escribes @top sin @sort, obtienes las primeras N filas en orden de origen — puede ser útil, pero rara vez es lo que el autor quiere decir.
Vacío tras filtrar
Si @filter descarta todas las filas, el bloque de datos se expande a cero filas. El estilo y los formatos de la fila plantilla permanecen en la salida, pero no se produce ninguna fila de datos. Las filas de pie por debajo del bloque siguen siendo visibles.
Referencias de especificación
- ADR-0029 — Composición de directivas + semántica de bordes de fuente.
spec/language.md"Filter", "Sort", "Top", "Source", "Join".- Receta 05 para
@filter in __lists__[…]. - Receta 07 para lo básico de
@source+@join. - Receta 09 para lo básico de
@sort+@top.