Public projection of a DatasetSpec.
Column-level capabilities (sortable/filterable/searchable/...) are
fully published per-column via ColumnDescriptor. These three fields are
the DATASET-level counterpart — without them a client cannot tell which
top-level request fields this dataset actually honours versus silently
ignores; both are the same status code (200) and the same shape of
envelope either way, so there is no other way to find out short of
reading the build SQL.
paginated: governs DatasetQueryRequest.page/size. True means
those fields select which page of rows comes back and
DatasetMeta.total/pages are populated. False means page/size
are IGNORED — the dataset's own SQL renders a plain LIMIT, and every
request returns the same first slice regardless of what page was sent.
time_bounded: governs DatasetQueryRequest.start_date/end_date.
True means those fields scope the query's time window. False means
they are IGNORED — the dataset's source table has no time dimension at
all (a precomputed rollup, where the period IS the table), so every
window requested returns identical rows.
searchable: whether at least one column declares searchable=True.
True tells the client it may render a free-text search box for this
dataset. False means DatasetQueryRequest.search is not silently
ignored — a non-blank value is rejected with 400 — but the client should
not offer the control in the first place.
search_placeholder: end-user copy for the search box, present exactly
when searchable is True. Render it verbatim — it is authored per
dataset precisely so the client does not have to infer the wording from
a column label.
downloadable: mirrors DatasetSpec.downloadable. True means POST /datasets/{name}/export will serve this dataset as a CSV download —
the frontend should render the Download button. False (the default
for every dataset that hasn't opted in) means that same endpoint
refuses with 400 DATASET_NOT_DOWNLOADABLE, so the client should not
render the button in the first place.