{"version":3,"file":"dump.mjs","names":[],"sources":["../../src/optimizer/dump.ts"],"sourcesContent":["import dedent from \"dedent\";\nimport { z } from \"zod\";\nimport { PgIdentifier } from \"../sql/pg-identifier.js\";\nimport { DUMP_STATS_SQL, ExportedStats } from \"./statistics.js\";\n\nexport const ExportedQuery = z.object({\n  username: z.string(),\n  query: z.string(),\n  meanTime: z.number(),\n  calls: z.coerce.string(),\n  rows: z.coerce.string(),\n  topLevel: z.boolean(),\n});\n\nexport type ExportedQuery = z.infer<typeof ExportedQuery>;\n\nexport const CombinedExport = z.object({\n  queries: z\n    .array(ExportedQuery)\n    .nullable()\n    .transform((v) => v ?? []),\n  stats: z.array(ExportedStats),\n});\n\nexport type CombinedExport = z.infer<typeof CombinedExport>;\n\nexport type QuerySource = \"pg_stat_statements\" | \"pg_stat_monitor\";\n\nfunction indent(sql: string, spaces: number): string {\n  const pad = \" \".repeat(spaces);\n  return sql\n    .trim()\n    .split(\"\\n\")\n    .map((line) => pad + line)\n    .join(\"\\n\");\n}\n\nexport function dumpQueriesSql(\n  schema: string,\n  source: QuerySource = \"pg_stat_statements\",\n): string {\n  const quotedSchema = PgIdentifier.fromString(schema).toString();\n  if (source === \"pg_stat_monitor\") {\n    return dedent`\n      SELECT\n        COALESCE(username, 'unknown_user') as \"username\",\n        query,\n        mean_exec_time as \"meanTime\",\n        calls,\n        rows,\n        toplevel as \"topLevel\"\n      FROM ${quotedSchema}.pg_stat_monitor\n      WHERE query NOT LIKE '%pg_stat_monitor%'\n        AND query NOT LIKE '%@qd_introspection%'\n        AND query NOT ILIKE 'explain%'\n    `;\n  }\n  return dedent`\n    SELECT\n      'unknown_user' as \"username\",\n      query,\n      mean_exec_time as \"meanTime\",\n      calls,\n      rows,\n      toplevel as \"topLevel\"\n    FROM ${quotedSchema}.pg_stat_statements\n    JOIN pg_database d ON d.oid = dbid\n    WHERE query NOT LIKE '%pg_stat_statements%'\n      AND query NOT LIKE '%@qd_introspection%'\n      AND query != '<insufficient privilege>'\n      AND query NOT ILIKE 'explain%'\n      AND d.datname = current_database()\n  `;\n}\n\nexport function combinedDumpSql(\n  schema: string,\n  source: QuerySource = \"pg_stat_statements\",\n): string {\n  const statsSql = indent(DUMP_STATS_SQL, 6);\n  const queriesSql = indent(dumpQueriesSql(schema, source), 8);\n  return [\n    \"SELECT json_build_object(\",\n    `  'queries', (SELECT json_agg(q) FROM (`,\n    queriesSql,\n    `  ) q),`,\n    `  'stats', (`,\n    statsSql,\n    `  )`,\n    `);`,\n  ].join(\"\\n\");\n}\n"],"mappings":";;;;;;AAKA,MAAa,gBAAgB,EAAE,OAAO;CACpC,UAAU,EAAE,QAAQ;CACpB,OAAO,EAAE,QAAQ;CACjB,UAAU,EAAE,QAAQ;CACpB,OAAO,EAAE,OAAO,QAAQ;CACxB,MAAM,EAAE,OAAO,QAAQ;CACvB,UAAU,EAAE,SAAS;CACtB,CAAC;AAIF,MAAa,iBAAiB,EAAE,OAAO;CACrC,SAAS,EACN,MAAM,cAAc,CACpB,UAAU,CACV,WAAW,MAAM,KAAK,EAAE,CAAC;CAC5B,OAAO,EAAE,MAAM,cAAc;CAC9B,CAAC;AAMF,SAAS,OAAO,KAAa,QAAwB;CACnD,MAAM,MAAM,IAAI,OAAO,OAAO;AAC9B,QAAO,IACJ,MAAM,CACN,MAAM,KAAK,CACX,KAAK,SAAS,MAAM,KAAK,CACzB,KAAK,KAAK;;AAGf,SAAgB,eACd,QACA,SAAsB,sBACd;CACR,MAAM,eAAe,aAAa,WAAW,OAAO,CAAC,UAAU;AAC/D,KAAI,WAAW,kBACb,QAAO,MAAM;;;;;;;;aAQJ,aAAa;;;;;AAMxB,QAAO,MAAM;;;;;;;;WAQJ,aAAa;;;;;;;;;AAUxB,SAAgB,gBACd,QACA,SAAsB,sBACd;CACR,MAAM,WAAW,OAAO,gBAAgB,EAAE;AAE1C,QAAO;EACL;EACA;EAHiB,OAAO,eAAe,QAAQ,OAAO,EAAE,EAI9C;EACV;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK"}