Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion src/remote/query-optimizer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import EventEmitter from "node:events";
import * as prettier from "prettier";
import prettierPluginSql from "prettier-plugin-sql";
import { OptimizedQuery, QueryHash, RecentQuery } from "../sql/recent-query.ts";
import type { LiveQueryOptimization } from "./optimization.ts";
import { ConnectionManager } from "../sync/connection-manager.ts";
Expand All @@ -17,6 +19,8 @@
PostgresVersion,
Statistics,
StatisticsMode,
evaluateNudgeRewriteCosts,

Check failure on line 22 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Module '"@query-doctor/core"' has no exported member 'evaluateNudgeRewriteCosts'.
bestRewriteImprovement,

Check failure on line 23 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Module '"@query-doctor/core"' has no exported member 'bestRewriteImprovement'.
} from "@query-doctor/core";
import { Connectable } from "../sync/connectable.ts";
import { parse } from "@libpg-query/parser";
Expand Down Expand Up @@ -298,11 +302,52 @@
break;
}
this._validQueriesProcessed++;
const optimization = await this.optimizeQuery(
let optimization = await this.optimizeQuery(
optimized,
this.target,
{ timeoutMs: this.calculateTimeoutRetryDelay(optimized) },
);

// Evaluate rewrite costs and promote optimization state
if (optimized.nudges?.some((n) => n.rewrite) && "cost" in optimization) {

Check failure on line 312 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Property 'rewrite' does not exist on type 'Nudge'.
const updatedNudges = await evaluateNudgeRewriteCosts(
optimized.nudges,
optimization.cost,
(q) => this.target!.optimizer.explainCost(q),

Check failure on line 316 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Property 'explainCost' does not exist on type 'IndexOptimizer'.

Check failure on line 316 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Parameter 'q' implicitly has an 'any' type.
);
if (updatedNudges) {
for (const nudge of updatedNudges) {
if (nudge.rewrite?.query) {
try {
nudge.rewrite.query = await prettier.format(
nudge.rewrite.query,
{
parser: "sql",
plugins: [prettierPluginSql],
language: "postgresql",
keywordCase: "upper",
},
);
} catch {}
}
}
Object.assign(optimized, { nudges: updatedNudges });

const best = bestRewriteImprovement(updatedNudges);
if (best && optimization.state === "no_improvement_found") {
optimization = {

Check failure on line 338 in src/remote/query-optimizer.ts

View workflow job for this annotation

GitHub Actions / release

Type '{ state: "improvements_available"; cost: number; optimizedCost: any; costReductionPercentage: any; indexRecommendations: never[]; indexesUsed: string[]; explainPlan: PostgresExplainStage; }' is not assignable to type '{ state: "waiting"; } | { state: "optimizing"; retries: number; } | { state: "not_supported"; reason: string; } | { state: "improvements_available"; cost: number; optimizedCost: number; costReductionPercentage: number; indexRecommendations: { ...; }[]; indexesUsed: string[]; explainPlan: PostgresExplainStage; optimi...'.
state: "improvements_available",
cost: optimization.cost,
optimizedCost: best.rewrittenCost,
costReductionPercentage: best.percentImprovement,
indexRecommendations: [],
indexesUsed: optimization.indexesUsed,
explainPlan: optimization.explainPlan,
};
}
}
}

this.queriedSinceVacuum++;
if (this.queriedSinceVacuum > QueryOptimizer.vacuumThreshold) {
await this.vacuum();
Expand Down
Loading