diff --git a/src/AggregateSpecsPlugin.ts b/src/AggregateSpecsPlugin.ts index 2d09416..d71f707 100644 --- a/src/AggregateSpecsPlugin.ts +++ b/src/AggregateSpecsPlugin.ts @@ -191,19 +191,42 @@ const AggregateSpecsPlugin: Plugin = (builder) => { const pgAggregateGroupBySpecs: AggregateGroupBySpec[] = [ { - id: "truncated-to-hour", + id: "truncated-to-year", isSuitableType: (pgType) => - /* timestamp or timestamptz */ pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, - sqlWrap: (sqlFrag) => sql.fragment`date_trunc('hour', ${sqlFrag})`, + sqlWrap: (sqlFrag) => sql.fragment`date_trunc('year', ${sqlFrag})`, + }, + { + id: "truncated-to-quarter", + isSuitableType: (pgType) => + pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, + sqlWrap: (sqlFrag) => sql.fragment`date_trunc('quarter', ${sqlFrag})`, + }, + { + id: "truncated-to-month", + isSuitableType: (pgType) => + pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, + sqlWrap: (sqlFrag) => sql.fragment`date_trunc('month', ${sqlFrag})`, + }, + { + id: "truncated-to-week", + isSuitableType: (pgType) => + pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, + sqlWrap: (sqlFrag) => sql.fragment`date_trunc('week', ${sqlFrag})`, }, { id: "truncated-to-day", isSuitableType: (pgType) => - /* timestamp or timestamptz */ pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, sqlWrap: (sqlFrag) => sql.fragment`date_trunc('day', ${sqlFrag})`, }, + // WARNING: grouping by hour or less can easily create high cost queries, returning many rows + { + id: "truncated-to-hour", + isSuitableType: (pgType) => + pgType.id === TIMESTAMP_OID || pgType.id === TIMESTAMPTZ_OID, + sqlWrap: (sqlFrag) => sql.fragment`date_trunc('hour', ${sqlFrag})`, + }, ]; return build.extend(build, {