@query-doctor/core 0.8.4 → 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 +6 -0
- package/dist/index.d.cts +3 -2
- package/dist/index.d.mts +3 -2
- package/dist/index.mjs +3 -2
- package/dist/optimizer/dump.cjs +74 -0
- package/dist/optimizer/dump.cjs.map +1 -0
- package/dist/optimizer/dump.d.cts +101 -0
- package/dist/optimizer/dump.d.cts.map +1 -0
- package/dist/optimizer/dump.d.mts +101 -0
- package/dist/optimizer/dump.d.mts.map +1 -0
- package/dist/optimizer/dump.mjs +69 -0
- package/dist/optimizer/dump.mjs.map +1 -0
- package/dist/optimizer/statistics.cjs +110 -109
- package/dist/optimizer/statistics.cjs.map +1 -1
- package/dist/optimizer/statistics.d.cts +3 -2
- package/dist/optimizer/statistics.d.cts.map +1 -1
- package/dist/optimizer/statistics.d.mts +3 -2
- package/dist/optimizer/statistics.d.mts.map +1 -1
- package/dist/optimizer/statistics.mjs +110 -110
- package/dist/optimizer/statistics.mjs.map +1 -1
- package/package.json +1 -1
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"}
|