Cuándo usar select
Usá select cuando el usuario tiene que elegir un valor de un set conocido: un status, una región, una marca, una categoría. El dropdown refleja o bien una lista de opciones estáticas declarada en YAML o una lista dinámica resuelta corriendo una query Malloy en page load.
Recurrí a uno de los filtros de fecha en su lugar cuando el input es una fecha o un date range. Recurrí a cross-filtering cuando se espera que el usuario drillee clickeando un chart en vez de elegir de un dropdown.
Campos requeridos
type: select
O options u options_query tiene que estar presente (y solo uno de los dos).
Campos opcionales
id— identifier interno; también el nombre de parámetro default cuandoparamno está seteado.label— display label arriba del dropdown.param— el nombre del parámetro Malloy al que bindear el valor seleccionado. Default aid.default— valor seleccionado inicial. Tiene que matchear elidde una de las opciones.options— array de objetos{id, label}. Usalo para una lista de opciones estática.options_query— string en formatopath/to/source.mal::QueryName. Looky corre esta query en page load y convierte las filas en opciones.
Opciones estáticas
Declará la lista inline. Mejor para enumeraciones chicas y estables — statuses, toggles on/off, periodicidades.
filters:
- type: select
id: status
label: Status
param: status
default: all
options:
- { id: all, label: All }
- { id: active, label: Active }
- { id: cancelled, label: Cancelled }
- { id: refunded, label: Refunded }
Cada opción tiene que tener un id (el valor mandado a la query) y un label (el texto mostrado en el dropdown). El id es lo que tu model Malloy recibe — diseñá el parámetro del model para aceptar el mismo shape.
Opciones dinámicas (options_query)
Usalo cuando la lista de opciones viene de datos — marcas, clientes, países, cualquier cosa que cambia con el tiempo.
filters:
- type: select
id: brand
label: Brand
param: brand
options_query: "models/ec_revenue.malloy::brand_options"
default: all
La query brand_options tiene que devolver filas con al menos columnas id y label. El lado Malloy típicamente se ve así:
view: brand_options is {
group_by:
id is brand
label is brand
order_by: brand asc
}
Cada fila de la query se vuelve una opción. Looky normaliza cada fila a un {id, label}:
- id — primer non-null de
id,indicator_code,group_code. - label — primer non-null de
label,indicator_label,group_label. - sort key — si una fila tiene
sort_order(oindicator_order/group_order), las opciones se ordenan numéricamente por ese campo; si no, se ordenan alfabéticamente por label.
Las filas a las que les faltan tanto un id como un label se dropean.
Valor default
Si default está seteado, es el valor del parámetro cuando carga la página. El botón de reset restaura este valor. Si no se setea default, el parámetro queda unset hasta que el usuario elija un valor, y la query subyacente tiene que aceptar la ausencia del parámetro (típicamente declarando su propio default).
Para listas de opciones dinámicas, declarar una opción sentinel "all" y usarla como default es un patrón común — tu model Malloy trata "all" como "sin filtro".
Cómo llega el valor a la query Malloy
El id de la opción elegida se manda como el parámetro con nombre — por default con el nombre del id del filtro, o param si lo seteás. El model Malloy declara un parámetro con el nombre matcheante (después de strippear el prefix p_ — mirá Soporte de Malloy) y lo usa en la query.
# en el model Malloy
##! experimental.parameters
source: orders(
p_status::string is "all"
) is bigquery.table('...') extend {
view: detail is {
where:
p_status = "all" or status = p_status
select:
*
}
}
Diferencias entre adapters
Los valores de select son típicamente strings o identifiers cortos; los tres adapters los bindean idéntico. El único edge case es cuando el parámetro del lado del model se declara como date o timestamp — ese patrón sigue las reglas de Diferencias entre adapters de source.
Ejemplos trabajados
Enumeración estática con un sentinel "all":
filters:
- type: select
id: status
label: Status
param: status
default: all
options:
- { id: all, label: All }
- { id: active, label: Active }
- { id: cancelled, label: Cancelled }
Dinámica desde una query, con binding de parámetro custom:
filters:
- type: select
id: brand_filter
label: Brand
param: p_brand
options_query: "models/ec_revenue.malloy::brand_options"
default: all
Múltiples selects en el mismo dashboard, cada uno filtrando una dimension distinta:
filters:
- type: select
id: country
label: Country
options_query: "models/ec_revenue.malloy::country_options"
default: all
- type: select
id: channel
label: Channel
options:
- { id: all, label: All channels }
- { id: organic, label: Organic }
- { id: paid, label: Paid }
- { id: direct, label: Direct }
default: all
Errores comunes
- El valor default no carga. El default tiene que matchear el
idde una de las opciones. Para listas dinámicas, asegurate que el sentinel "all" esté incluido en el resultado de la query (o enoptionsal lado). - El filtro tarda mucho en cargar. El
options_querycorre en page load. Si la query subyacente es lenta, el dropdown va a bloquear. Pre-agregá la lista de opciones en la query Malloy, o cacheala vía un sidecar. - El model Malloy no acepta el parámetro. Declará el parámetro en el model con un default razonable, así la query igual corre cuando el parámetro falta o está seteado a un sentinel.
- Los labels y los ids de opción se desincronizan. Mantené el
labellegible para humanos y elidestable; elides el contrato con la query, no el label. - Mismatch de capitalización entre el id de opción y los datos. El where-clause del model es exact-match por default. O normalizá los dos lados en el model (
lower(status) = lower(p_status)) o alineá los ids de opción con los datos exacto.