Interface: ResolvedCannedReport
Defined in: server/insights/model/define-reporting-model.ts:215
Properties
definition
definition: {
aggregations?: {
alias: string;
field?: string;
fn: "min" | "max" | "count" | "avg" | "sum";
}[];
columns: string[];
filter?: FilterNode;
groupBy?: {
bucket?: "year" | "month" | "day" | "week" | "quarter";
field: string;
}[];
schemaVersion: 1;
sort: {
by: string;
direction: "asc" | "desc";
}[];
subject: string;
timezone: string;
totals?: boolean;
};Defined in: server/insights/model/define-reporting-model.ts:218
aggregations?
optional aggregations?: {
alias: string;
field?: string;
fn: "min" | "max" | "count" | "avg" | "sum";
}[];columns
columns: string[];The SELECT list — and the ONLY source of output columns, for grouped runs
as much as detail runs: the compiler derives its projection from columns
alone and never from groupBy/aggregations. So an empty columns has no
compilable projection at all (not merely a semantically odd one), which
makes it a STRUCTURAL failure and puts the check here rather than in
validateDefinition. Keeping it in the schema also means every surface
that parses a definition — run input, saved-report create/update,
normalizeSavedReportDefinition on read, canned reports in the registry —
fails closed without having to remember a second validation pass.
filter?
optional filter?: FilterNode;groupBy?
optional groupBy?: {
bucket?: "year" | "month" | "day" | "week" | "quarter";
field: string;
}[];schemaVersion
schemaVersion: 1;sort
sort: {
by: string;
direction: "asc" | "desc";
}[];subject
subject: string;timezone
timezone: string;totals?
optional totals?: boolean;key
key: string;Defined in: server/insights/model/define-reporting-model.ts:216
name
name: string;Defined in: server/insights/model/define-reporting-model.ts:217