@query-doctor/core 0.8.3 → 0.8.6-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -8,12 +8,16 @@ const require_builder = require("./sql/builder.cjs");
8
8
  const require_pg_identifier = require("./sql/pg-identifier.cjs");
9
9
  const require_genalgo = require("./optimizer/genalgo.cjs");
10
10
  const require_statistics = require("./optimizer/statistics.cjs");
11
+ const require_dump = require("./optimizer/dump.cjs");
11
12
  const require_pss_rewriter = require("./optimizer/pss-rewriter.cjs");
12
13
  const require_sentry = require("./sentry.cjs");
13
14
  exports.Analyzer = require_analyzer.Analyzer;
15
+ exports.CombinedExport = require_dump.CombinedExport;
14
16
  exports.ComputedColumnStats = require_statistics.ComputedColumnStats;
15
17
  exports.ComputedReltuples = require_statistics.ComputedReltuples;
16
18
  exports.ComputedStats = require_statistics.ComputedStats;
19
+ exports.DUMP_STATS_SQL = require_statistics.DUMP_STATS_SQL;
20
+ exports.ExportedQuery = require_dump.ExportedQuery;
17
21
  exports.ExportedStats = require_statistics.ExportedStats;
18
22
  exports.ExportedStatsColumns = require_statistics.ExportedStatsColumns;
19
23
  exports.ExportedStatsIndex = require_statistics.ExportedStatsIndex;
@@ -30,8 +34,10 @@ exports.SKIP = require_genalgo.SKIP;
30
34
  exports.Statistics = require_statistics.Statistics;
31
35
  exports.StatisticsMode = require_statistics.StatisticsMode;
32
36
  exports.StatisticsSource = require_statistics.StatisticsSource;
37
+ exports.combinedDumpSql = require_dump.combinedDumpSql;
33
38
  exports.deriveSentryEnvironment = require_sentry.deriveSentryEnvironment;
34
39
  exports.dropIndex = require_database.dropIndex;
40
+ exports.dumpQueriesSql = require_dump.dumpQueriesSql;
35
41
  exports.ignoredIdentifier = require_analyzer.ignoredIdentifier;
36
42
  exports.isIndexProbablyDroppable = require_indexes.isIndexProbablyDroppable;
37
43
  exports.isIndexSupported = require_indexes.isIndexSupported;
package/dist/index.d.cts CHANGED
@@ -3,11 +3,12 @@
3
3
  import { PgIdentifier } from "./sql/pg-identifier.cjs";
4
4
  import { Parameter, PostgresQueryBuilder, PostgresQueryBuilderCommand } from "./sql/builder.cjs";
5
5
  import { Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, dropIndex } from "./sql/database.cjs";
6
- import { ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOrder, IndexedTable, Path, SerializeResult, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableStats } from "./optimizer/statistics.cjs";
6
+ import { ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOrder, IndexedTable, Path, SerializeResult, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableStats } from "./optimizer/statistics.cjs";
7
7
  import { IndexIdentifier, IndexOptimizer, IndexRecommendation, OptimizeResult, PROCEED, PermutedIndexCandidate, RootIndexCandidate, SKIP } from "./optimizer/genalgo.cjs";
8
8
  import { Nudge, parseNudges } from "./sql/nudges.cjs";
9
9
  import { AnalysisResult, Analyzer, DatabaseDriver, DiscoveredColumnReference, JsonbOperator, Parser, SQLCommenterExtraction, SQLCommenterTag, SortContext, StatementType, TableReference, ignoredIdentifier } from "./sql/analyzer.cjs";
10
10
  import { isIndexProbablyDroppable, isIndexSupported } from "./sql/indexes.cjs";
11
+ import { CombinedExport, ExportedQuery, QuerySource, combinedDumpSql, dumpQueriesSql } from "./optimizer/dump.cjs";
11
12
  import { PssRewriter } from "./optimizer/pss-rewriter.cjs";
12
13
  import { deriveSentryEnvironment } from "./sentry.cjs";
13
- export { AnalysisResult, Analyzer, ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, DatabaseDriver, DiscoveredColumnReference, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexIdentifier, IndexOptimizer, IndexOrder, IndexRecommendation, IndexedTable, JsonbOperator, Nudge, OptimizeResult, PROCEED, Parameter, Parser, Path, PermutedIndexCandidate, PgIdentifier, Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresQueryBuilder, PostgresQueryBuilderCommand, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, PssRewriter, RootIndexCandidate, SKIP, SQLCommenterExtraction, SQLCommenterTag, SerializeResult, SortContext, StatementType, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableReference, TableStats, deriveSentryEnvironment, dropIndex, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
14
+ export { AnalysisResult, Analyzer, ColumnMetadata, CombinedExport, ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, DatabaseDriver, DiscoveredColumnReference, ExportedQuery, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexIdentifier, IndexOptimizer, IndexOrder, IndexRecommendation, IndexedTable, JsonbOperator, Nudge, OptimizeResult, PROCEED, Parameter, Parser, Path, PermutedIndexCandidate, PgIdentifier, Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresQueryBuilder, PostgresQueryBuilderCommand, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, PssRewriter, QuerySource, RootIndexCandidate, SKIP, SQLCommenterExtraction, SQLCommenterTag, SerializeResult, SortContext, StatementType, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableReference, TableStats, combinedDumpSql, deriveSentryEnvironment, dropIndex, dumpQueriesSql, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
package/dist/index.d.mts CHANGED
@@ -3,11 +3,12 @@
3
3
  import { PgIdentifier } from "./sql/pg-identifier.mjs";
4
4
  import { Parameter, PostgresQueryBuilder, PostgresQueryBuilderCommand } from "./sql/builder.mjs";
5
5
  import { Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, dropIndex } from "./sql/database.mjs";
6
- import { ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOrder, IndexedTable, Path, SerializeResult, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableStats } from "./optimizer/statistics.mjs";
6
+ import { ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOrder, IndexedTable, Path, SerializeResult, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableStats } from "./optimizer/statistics.mjs";
7
7
  import { IndexIdentifier, IndexOptimizer, IndexRecommendation, OptimizeResult, PROCEED, PermutedIndexCandidate, RootIndexCandidate, SKIP } from "./optimizer/genalgo.mjs";
8
8
  import { Nudge, parseNudges } from "./sql/nudges.mjs";
9
9
  import { AnalysisResult, Analyzer, DatabaseDriver, DiscoveredColumnReference, JsonbOperator, Parser, SQLCommenterExtraction, SQLCommenterTag, SortContext, StatementType, TableReference, ignoredIdentifier } from "./sql/analyzer.mjs";
10
10
  import { isIndexProbablyDroppable, isIndexSupported } from "./sql/indexes.mjs";
11
+ import { CombinedExport, ExportedQuery, QuerySource, combinedDumpSql, dumpQueriesSql } from "./optimizer/dump.mjs";
11
12
  import { PssRewriter } from "./optimizer/pss-rewriter.mjs";
12
13
  import { deriveSentryEnvironment } from "./sentry.mjs";
13
- export { AnalysisResult, Analyzer, ColumnMetadata, ComputedColumnStats, ComputedReltuples, ComputedStats, DatabaseDriver, DiscoveredColumnReference, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexIdentifier, IndexOptimizer, IndexOrder, IndexRecommendation, IndexedTable, JsonbOperator, Nudge, OptimizeResult, PROCEED, Parameter, Parser, Path, PermutedIndexCandidate, PgIdentifier, Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresQueryBuilder, PostgresQueryBuilderCommand, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, PssRewriter, RootIndexCandidate, SKIP, SQLCommenterExtraction, SQLCommenterTag, SerializeResult, SortContext, StatementType, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableReference, TableStats, deriveSentryEnvironment, dropIndex, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
14
+ export { AnalysisResult, Analyzer, ColumnMetadata, CombinedExport, ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, DatabaseDriver, DiscoveredColumnReference, ExportedQuery, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexIdentifier, IndexOptimizer, IndexOrder, IndexRecommendation, IndexedTable, JsonbOperator, Nudge, OptimizeResult, PROCEED, Parameter, Parser, Path, PermutedIndexCandidate, PgIdentifier, Postgres, PostgresConnectionInput, PostgresExplainResult, PostgresExplainStage, PostgresExplainStageCommon, PostgresExplainStageSchema, PostgresFactory, PostgresQueryBuilder, PostgresQueryBuilderCommand, PostgresStage, PostgresStageId, PostgresTransaction, PostgresVersion, PssRewriter, QuerySource, RootIndexCandidate, SKIP, SQLCommenterExtraction, SQLCommenterTag, SerializeResult, SortContext, StatementType, Statistics, StatisticsMode, StatisticsSource, TableMetadata, TableReference, TableStats, combinedDumpSql, deriveSentryEnvironment, dropIndex, dumpQueriesSql, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
package/dist/index.mjs CHANGED
@@ -6,7 +6,8 @@ import { isIndexProbablyDroppable, isIndexSupported } from "./sql/indexes.mjs";
6
6
  import { PostgresQueryBuilder } from "./sql/builder.mjs";
7
7
  import { PgIdentifier } from "./sql/pg-identifier.mjs";
8
8
  import { IndexOptimizer, PROCEED, SKIP } from "./optimizer/genalgo.mjs";
9
- import { ComputedColumnStats, ComputedReltuples, ComputedStats, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, Statistics, StatisticsMode, StatisticsSource } from "./optimizer/statistics.mjs";
9
+ import { ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, Statistics, StatisticsMode, StatisticsSource } from "./optimizer/statistics.mjs";
10
+ import { CombinedExport, ExportedQuery, combinedDumpSql, dumpQueriesSql } from "./optimizer/dump.mjs";
10
11
  import { PssRewriter } from "./optimizer/pss-rewriter.mjs";
11
12
  import { deriveSentryEnvironment } from "./sentry.mjs";
12
- export { Analyzer, ComputedColumnStats, ComputedReltuples, ComputedStats, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOptimizer, PROCEED, PgIdentifier, PostgresExplainStageSchema, PostgresQueryBuilder, PostgresVersion, PssRewriter, SKIP, Statistics, StatisticsMode, StatisticsSource, deriveSentryEnvironment, dropIndex, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
13
+ export { Analyzer, CombinedExport, ComputedColumnStats, ComputedReltuples, ComputedStats, DUMP_STATS_SQL, ExportedQuery, ExportedStats, ExportedStatsColumns, ExportedStatsIndex, ExportedStatsStatistics, ExportedStatsV1, IndexOptimizer, PROCEED, PgIdentifier, PostgresExplainStageSchema, PostgresQueryBuilder, PostgresVersion, PssRewriter, SKIP, Statistics, StatisticsMode, StatisticsSource, combinedDumpSql, deriveSentryEnvironment, dropIndex, dumpQueriesSql, ignoredIdentifier, isIndexProbablyDroppable, isIndexSupported, parseNudges };
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
3
+ const require_pg_identifier = require("../sql/pg-identifier.cjs");
4
+ const require_statistics = require("./statistics.cjs");
5
+ let zod = require("zod");
6
+ let dedent = require("dedent");
7
+ dedent = require_runtime.__toESM(dedent, 1);
8
+ //#region src/optimizer/dump.ts
9
+ const ExportedQuery = zod.z.object({
10
+ username: zod.z.string(),
11
+ query: zod.z.string(),
12
+ meanTime: zod.z.number(),
13
+ calls: zod.z.coerce.string(),
14
+ rows: zod.z.coerce.string(),
15
+ topLevel: zod.z.boolean()
16
+ });
17
+ const CombinedExport = zod.z.object({
18
+ queries: zod.z.array(ExportedQuery).nullable().transform((v) => v ?? []),
19
+ stats: zod.z.array(require_statistics.ExportedStats)
20
+ });
21
+ function indent(sql, spaces) {
22
+ const pad = " ".repeat(spaces);
23
+ return sql.trim().split("\n").map((line) => pad + line).join("\n");
24
+ }
25
+ function dumpQueriesSql(schema, source = "pg_stat_statements") {
26
+ const quotedSchema = require_pg_identifier.PgIdentifier.fromString(schema).toString();
27
+ if (source === "pg_stat_monitor") return dedent.default`
28
+ SELECT
29
+ COALESCE(username, 'unknown_user') as "username",
30
+ query,
31
+ mean_exec_time as "meanTime",
32
+ calls,
33
+ rows,
34
+ toplevel as "topLevel"
35
+ FROM ${quotedSchema}.pg_stat_monitor
36
+ WHERE query NOT LIKE '%pg_stat_monitor%'
37
+ AND query NOT LIKE '%@qd_introspection%'
38
+ AND query NOT ILIKE 'explain%'
39
+ `;
40
+ return dedent.default`
41
+ SELECT
42
+ 'unknown_user' as "username",
43
+ query,
44
+ mean_exec_time as "meanTime",
45
+ calls,
46
+ rows,
47
+ toplevel as "topLevel"
48
+ FROM ${quotedSchema}.pg_stat_statements
49
+ WHERE query NOT LIKE '%pg_stat_statements%'
50
+ AND query NOT LIKE '%@qd_introspection%'
51
+ AND query != '<insufficient privilege>'
52
+ AND query NOT ILIKE 'explain%'
53
+ `;
54
+ }
55
+ function combinedDumpSql(schema, source = "pg_stat_statements") {
56
+ const statsSql = indent(require_statistics.DUMP_STATS_SQL, 6);
57
+ return [
58
+ "SELECT json_build_object(",
59
+ ` 'queries', (SELECT json_agg(q) FROM (`,
60
+ indent(dumpQueriesSql(schema, source), 8),
61
+ ` ) q),`,
62
+ ` 'stats', (`,
63
+ statsSql,
64
+ ` )`,
65
+ `);`
66
+ ].join("\n");
67
+ }
68
+ //#endregion
69
+ exports.CombinedExport = CombinedExport;
70
+ exports.ExportedQuery = ExportedQuery;
71
+ exports.combinedDumpSql = combinedDumpSql;
72
+ exports.dumpQueriesSql = dumpQueriesSql;
73
+
74
+ //# sourceMappingURL=dump.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump.cjs","names":["z","ExportedStats","PgIdentifier","DUMP_STATS_SQL"],"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 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 `;\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,gBAAgBA,IAAAA,EAAE,OAAO;CACpC,UAAUA,IAAAA,EAAE,QAAQ;CACpB,OAAOA,IAAAA,EAAE,QAAQ;CACjB,UAAUA,IAAAA,EAAE,QAAQ;CACpB,OAAOA,IAAAA,EAAE,OAAO,QAAQ;CACxB,MAAMA,IAAAA,EAAE,OAAO,QAAQ;CACvB,UAAUA,IAAAA,EAAE,SAAS;CACtB,CAAC;AAIF,MAAa,iBAAiBA,IAAAA,EAAE,OAAO;CACrC,SAASA,IAAAA,EACN,MAAM,cAAc,CACpB,UAAU,CACV,WAAW,MAAM,KAAK,EAAE,CAAC;CAC5B,OAAOA,IAAAA,EAAE,MAAMC,mBAAAA,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,eAAeC,sBAAAA,aAAa,WAAW,OAAO,CAAC,UAAU;AAC/D,KAAI,WAAW,kBACb,QAAO,OAAA,OAAM;;;;;;;;aAQJ,aAAa;;;;;AAMxB,QAAO,OAAA,OAAM;;;;;;;;WAQJ,aAAa;;;;;;;AAQxB,SAAgB,gBACd,QACA,SAAsB,sBACd;CACR,MAAM,WAAW,OAAOC,mBAAAA,gBAAgB,EAAE;AAE1C,QAAO;EACL;EACA;EAHiB,OAAO,eAAe,QAAQ,OAAO,EAAE,EAAE;EAK1D;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK"}
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+
3
+ import { z } from "zod";
4
+
5
+ //#region src/optimizer/dump.d.ts
6
+ declare const ExportedQuery: z.ZodObject<{
7
+ username: z.ZodString;
8
+ query: z.ZodString;
9
+ meanTime: z.ZodNumber;
10
+ calls: z.ZodCoercedString<unknown>;
11
+ rows: z.ZodCoercedString<unknown>;
12
+ topLevel: z.ZodBoolean;
13
+ }, z.core.$strip>;
14
+ type ExportedQuery = z.infer<typeof ExportedQuery>;
15
+ declare const CombinedExport: z.ZodObject<{
16
+ queries: z.ZodPipe<z.ZodNullable<z.ZodArray<z.ZodObject<{
17
+ username: z.ZodString;
18
+ query: z.ZodString;
19
+ meanTime: z.ZodNumber;
20
+ calls: z.ZodCoercedString<unknown>;
21
+ rows: z.ZodCoercedString<unknown>;
22
+ topLevel: z.ZodBoolean;
23
+ }, z.core.$strip>>>, z.ZodTransform<{
24
+ username: string;
25
+ query: string;
26
+ meanTime: number;
27
+ calls: string;
28
+ rows: string;
29
+ topLevel: boolean;
30
+ }[], {
31
+ username: string;
32
+ query: string;
33
+ meanTime: number;
34
+ calls: string;
35
+ rows: string;
36
+ topLevel: boolean;
37
+ }[] | null>>;
38
+ stats: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
39
+ tableName: z.ZodString;
40
+ schemaName: z.ZodString;
41
+ relpages: z.ZodNumber;
42
+ reltuples: z.ZodNumber;
43
+ relallvisible: z.ZodNumber;
44
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
45
+ columns: z.ZodDefault<z.ZodArray<z.ZodObject<{
46
+ columnName: z.ZodString;
47
+ attlen: z.ZodNullable<z.ZodNumber>;
48
+ dataType: z.ZodOptional<z.ZodString>;
49
+ stats: z.ZodNullable<z.ZodObject<{
50
+ stawidth: z.ZodNumber;
51
+ stainherit: z.ZodDefault<z.ZodBoolean>;
52
+ stadistinct: z.ZodNumber;
53
+ stanullfrac: z.ZodNumber;
54
+ stakind1: z.ZodNumber;
55
+ stakind2: z.ZodNumber;
56
+ stakind3: z.ZodNumber;
57
+ stakind4: z.ZodNumber;
58
+ stakind5: z.ZodNumber;
59
+ staop1: z.ZodString;
60
+ staop2: z.ZodString;
61
+ staop3: z.ZodString;
62
+ staop4: z.ZodString;
63
+ staop5: z.ZodString;
64
+ stacoll1: z.ZodString;
65
+ stacoll2: z.ZodString;
66
+ stacoll3: z.ZodString;
67
+ stacoll4: z.ZodString;
68
+ stacoll5: z.ZodString;
69
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
70
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
71
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
72
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
73
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
74
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
75
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
76
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
77
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
78
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
79
+ }, z.core.$strip>>;
80
+ }, z.core.$strip>>>;
81
+ indexes: z.ZodArray<z.ZodObject<{
82
+ indexName: z.ZodString;
83
+ amname: z.ZodDefault<z.ZodString>;
84
+ relpages: z.ZodNumber;
85
+ reltuples: z.ZodNumber;
86
+ relallvisible: z.ZodNumber;
87
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
88
+ fillfactor: z.ZodDefault<z.ZodNumber>;
89
+ columns: z.ZodDefault<z.ZodArray<z.ZodObject<{
90
+ attlen: z.ZodNullable<z.ZodNumber>;
91
+ }, z.core.$strip>>>;
92
+ }, z.core.$strip>>;
93
+ }, z.core.$strip>]>>;
94
+ }, z.core.$strip>;
95
+ type CombinedExport = z.infer<typeof CombinedExport>;
96
+ type QuerySource = "pg_stat_statements" | "pg_stat_monitor";
97
+ declare function dumpQueriesSql(schema: string, source?: QuerySource): string;
98
+ declare function combinedDumpSql(schema: string, source?: QuerySource): string;
99
+ //#endregion
100
+ export { CombinedExport, ExportedQuery, QuerySource, combinedDumpSql, dumpQueriesSql };
101
+ //# sourceMappingURL=dump.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump.d.cts","names":[],"sources":["../../src/optimizer/dump.ts"],"mappings":";;;;;cAKa,aAAA,EAAa,CAAA,CAAA,SAAA;;;;;;;;KASd,aAAA,GAAgB,CAAA,CAAE,KAAA,QAAa,aAAA;AAAA,cAE9B,cAAA,EAAc,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAQf,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,KAEhC,WAAA;AAAA,iBAWI,cAAA,CACd,MAAA,UACA,MAAA,GAAQ,WAAA;AAAA,iBAkCM,eAAA,CACd,MAAA,UACA,MAAA,GAAQ,WAAA"}
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+
3
+ import { z } from "zod";
4
+
5
+ //#region src/optimizer/dump.d.ts
6
+ declare const ExportedQuery: z.ZodObject<{
7
+ username: z.ZodString;
8
+ query: z.ZodString;
9
+ meanTime: z.ZodNumber;
10
+ calls: z.ZodCoercedString<unknown>;
11
+ rows: z.ZodCoercedString<unknown>;
12
+ topLevel: z.ZodBoolean;
13
+ }, z.core.$strip>;
14
+ type ExportedQuery = z.infer<typeof ExportedQuery>;
15
+ declare const CombinedExport: z.ZodObject<{
16
+ queries: z.ZodPipe<z.ZodNullable<z.ZodArray<z.ZodObject<{
17
+ username: z.ZodString;
18
+ query: z.ZodString;
19
+ meanTime: z.ZodNumber;
20
+ calls: z.ZodCoercedString<unknown>;
21
+ rows: z.ZodCoercedString<unknown>;
22
+ topLevel: z.ZodBoolean;
23
+ }, z.core.$strip>>>, z.ZodTransform<{
24
+ username: string;
25
+ query: string;
26
+ meanTime: number;
27
+ calls: string;
28
+ rows: string;
29
+ topLevel: boolean;
30
+ }[], {
31
+ username: string;
32
+ query: string;
33
+ meanTime: number;
34
+ calls: string;
35
+ rows: string;
36
+ topLevel: boolean;
37
+ }[] | null>>;
38
+ stats: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
39
+ tableName: z.ZodString;
40
+ schemaName: z.ZodString;
41
+ relpages: z.ZodNumber;
42
+ reltuples: z.ZodNumber;
43
+ relallvisible: z.ZodNumber;
44
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
45
+ columns: z.ZodDefault<z.ZodArray<z.ZodObject<{
46
+ columnName: z.ZodString;
47
+ attlen: z.ZodNullable<z.ZodNumber>;
48
+ dataType: z.ZodOptional<z.ZodString>;
49
+ stats: z.ZodNullable<z.ZodObject<{
50
+ stawidth: z.ZodNumber;
51
+ stainherit: z.ZodDefault<z.ZodBoolean>;
52
+ stadistinct: z.ZodNumber;
53
+ stanullfrac: z.ZodNumber;
54
+ stakind1: z.ZodNumber;
55
+ stakind2: z.ZodNumber;
56
+ stakind3: z.ZodNumber;
57
+ stakind4: z.ZodNumber;
58
+ stakind5: z.ZodNumber;
59
+ staop1: z.ZodString;
60
+ staop2: z.ZodString;
61
+ staop3: z.ZodString;
62
+ staop4: z.ZodString;
63
+ staop5: z.ZodString;
64
+ stacoll1: z.ZodString;
65
+ stacoll2: z.ZodString;
66
+ stacoll3: z.ZodString;
67
+ stacoll4: z.ZodString;
68
+ stacoll5: z.ZodString;
69
+ stanumbers1: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
70
+ stanumbers2: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
71
+ stanumbers3: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
72
+ stanumbers4: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
73
+ stanumbers5: z.ZodNullable<z.ZodArray<z.ZodNumber>>;
74
+ stavalues1: z.ZodNullable<z.ZodArray<z.ZodAny>>;
75
+ stavalues2: z.ZodNullable<z.ZodArray<z.ZodAny>>;
76
+ stavalues3: z.ZodNullable<z.ZodArray<z.ZodAny>>;
77
+ stavalues4: z.ZodNullable<z.ZodArray<z.ZodAny>>;
78
+ stavalues5: z.ZodNullable<z.ZodArray<z.ZodAny>>;
79
+ }, z.core.$strip>>;
80
+ }, z.core.$strip>>>;
81
+ indexes: z.ZodArray<z.ZodObject<{
82
+ indexName: z.ZodString;
83
+ amname: z.ZodDefault<z.ZodString>;
84
+ relpages: z.ZodNumber;
85
+ reltuples: z.ZodNumber;
86
+ relallvisible: z.ZodNumber;
87
+ relallfrozen: z.ZodOptional<z.ZodNumber>;
88
+ fillfactor: z.ZodDefault<z.ZodNumber>;
89
+ columns: z.ZodDefault<z.ZodArray<z.ZodObject<{
90
+ attlen: z.ZodNullable<z.ZodNumber>;
91
+ }, z.core.$strip>>>;
92
+ }, z.core.$strip>>;
93
+ }, z.core.$strip>]>>;
94
+ }, z.core.$strip>;
95
+ type CombinedExport = z.infer<typeof CombinedExport>;
96
+ type QuerySource = "pg_stat_statements" | "pg_stat_monitor";
97
+ declare function dumpQueriesSql(schema: string, source?: QuerySource): string;
98
+ declare function combinedDumpSql(schema: string, source?: QuerySource): string;
99
+ //#endregion
100
+ export { CombinedExport, ExportedQuery, QuerySource, combinedDumpSql, dumpQueriesSql };
101
+ //# sourceMappingURL=dump.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump.d.mts","names":[],"sources":["../../src/optimizer/dump.ts"],"mappings":";;;;;cAKa,aAAA,EAAa,CAAA,CAAA,SAAA;;;;;;;;KASd,aAAA,GAAgB,CAAA,CAAE,KAAA,QAAa,aAAA;AAAA,cAE9B,cAAA,EAAc,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAQf,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,KAEhC,WAAA;AAAA,iBAWI,cAAA,CACd,MAAA,UACA,MAAA,GAAQ,WAAA;AAAA,iBAkCM,eAAA,CACd,MAAA,UACA,MAAA,GAAQ,WAAA"}
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { PgIdentifier } from "../sql/pg-identifier.mjs";
3
+ import { DUMP_STATS_SQL, ExportedStats } from "./statistics.mjs";
4
+ import { z } from "zod";
5
+ import dedent from "dedent";
6
+ //#region src/optimizer/dump.ts
7
+ const ExportedQuery = z.object({
8
+ username: z.string(),
9
+ query: z.string(),
10
+ meanTime: z.number(),
11
+ calls: z.coerce.string(),
12
+ rows: z.coerce.string(),
13
+ topLevel: z.boolean()
14
+ });
15
+ const CombinedExport = z.object({
16
+ queries: z.array(ExportedQuery).nullable().transform((v) => v ?? []),
17
+ stats: z.array(ExportedStats)
18
+ });
19
+ function indent(sql, spaces) {
20
+ const pad = " ".repeat(spaces);
21
+ return sql.trim().split("\n").map((line) => pad + line).join("\n");
22
+ }
23
+ function dumpQueriesSql(schema, source = "pg_stat_statements") {
24
+ const quotedSchema = PgIdentifier.fromString(schema).toString();
25
+ if (source === "pg_stat_monitor") return dedent`
26
+ SELECT
27
+ COALESCE(username, 'unknown_user') as "username",
28
+ query,
29
+ mean_exec_time as "meanTime",
30
+ calls,
31
+ rows,
32
+ toplevel as "topLevel"
33
+ FROM ${quotedSchema}.pg_stat_monitor
34
+ WHERE query NOT LIKE '%pg_stat_monitor%'
35
+ AND query NOT LIKE '%@qd_introspection%'
36
+ AND query NOT ILIKE 'explain%'
37
+ `;
38
+ return dedent`
39
+ SELECT
40
+ 'unknown_user' as "username",
41
+ query,
42
+ mean_exec_time as "meanTime",
43
+ calls,
44
+ rows,
45
+ toplevel as "topLevel"
46
+ FROM ${quotedSchema}.pg_stat_statements
47
+ WHERE query NOT LIKE '%pg_stat_statements%'
48
+ AND query NOT LIKE '%@qd_introspection%'
49
+ AND query != '<insufficient privilege>'
50
+ AND query NOT ILIKE 'explain%'
51
+ `;
52
+ }
53
+ function combinedDumpSql(schema, source = "pg_stat_statements") {
54
+ const statsSql = indent(DUMP_STATS_SQL, 6);
55
+ return [
56
+ "SELECT json_build_object(",
57
+ ` 'queries', (SELECT json_agg(q) FROM (`,
58
+ indent(dumpQueriesSql(schema, source), 8),
59
+ ` ) q),`,
60
+ ` 'stats', (`,
61
+ statsSql,
62
+ ` )`,
63
+ `);`
64
+ ].join("\n");
65
+ }
66
+ //#endregion
67
+ export { CombinedExport, ExportedQuery, combinedDumpSql, dumpQueriesSql };
68
+
69
+ //# sourceMappingURL=dump.mjs.map
@@ -0,0 +1 @@
1
+ {"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 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 `;\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;;;;;;;AAQxB,SAAgB,gBACd,QACA,SAAsB,sBACd;CACR,MAAM,WAAW,OAAO,gBAAgB,EAAE;AAE1C,QAAO;EACL;EACA;EAHiB,OAAO,eAAe,QAAQ,OAAO,EAAE,EAAE;EAK1D;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK"}