From 639dd95e936a688f2ab33d14819a474c03d214ac Mon Sep 17 00:00:00 2001 From: Jean-Philippe Sirois Date: Thu, 26 Mar 2026 08:21:27 +0400 Subject: [PATCH 1/2] feat: forward table references to CI payload Thread referencedTables from Analyzer.analyze() through QueryProcessResult and into the CiQueryPayload sent to the Site API. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/reporters/github/github.test.ts | 12 ++++++++---- src/reporters/site-api.ts | 6 ++++++ src/runner.ts | 12 ++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/reporters/github/github.test.ts b/src/reporters/github/github.test.ts index aa3ffab..c676fd3 100644 --- a/src/reporters/github/github.test.ts +++ b/src/reporters/github/github.test.ts @@ -147,7 +147,8 @@ describe("buildViewModel", () => { hash: "new-query-1", query: "SELECT 1", formattedQuery: "SELECT 1", - nudges: [], tags: [], optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, + nudges: [], tags: [], tableReferences: [], + optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, }, ], }), @@ -236,13 +237,15 @@ describe("buildViewModel", () => { hash: "new-1", query: "SELECT 1", formattedQuery: "SELECT 1", - nudges: [], tags: [], optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, + nudges: [], tags: [], tableReferences: [], + optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, }, { hash: "new-2", query: "SELECT 2", formattedQuery: "SELECT 2", - nudges: [], tags: [], optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, + nudges: [], tags: [], tableReferences: [], + optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, }, ], }), @@ -269,7 +272,8 @@ describe("buildViewModel", () => { hash: "new-1", query: "SELECT 1", formattedQuery: "SELECT 1", - nudges: [], tags: [], optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, + nudges: [], tags: [], tableReferences: [], + optimization: { state: "no_improvement_found", cost: 10, indexesUsed: [] }, }, ], }), diff --git a/src/reporters/site-api.ts b/src/reporters/site-api.ts index 599f22e..fb0f03e 100644 --- a/src/reporters/site-api.ts +++ b/src/reporters/site-api.ts @@ -20,6 +20,7 @@ export interface CiQueryPayload { optimization: CiOptimization; nudges: Nudge[]; tags: SQLCommenterTag[]; + tableReferences: Array<{ schema?: string; table: string }>; } export type CiOptimization = @@ -122,6 +123,7 @@ function mapResultToQuery(result: QueryProcessResult): CiQueryPayload | null { formattedQuery: result.recommendation.formattedQuery, nudges: result.nudges, tags: result.tags, + tableReferences: result.referencedTables ?? [], optimization: { state: "improvements_available", cost: result.recommendation.baseCost, @@ -146,6 +148,7 @@ function mapResultToQuery(result: QueryProcessResult): CiQueryPayload | null { formattedQuery: result.formattedQuery, nudges: result.nudges, tags: result.tags, + tableReferences: result.referencedTables ?? [], optimization: { state: "no_improvement_found", cost: result.cost, @@ -161,6 +164,7 @@ function mapResultToQuery(result: QueryProcessResult): CiQueryPayload | null { formattedQuery: result.formattedQuery, nudges: result.nudges, tags: result.tags, + tableReferences: result.referencedTables ?? [], optimization: { state: "no_improvement_found", cost: 0, @@ -176,6 +180,7 @@ function mapResultToQuery(result: QueryProcessResult): CiQueryPayload | null { formattedQuery: result.formattedQuery, nudges: result.nudges, tags: result.tags, + tableReferences: result.referencedTables ?? [], optimization: { state: "error", error: result.error.message, @@ -189,6 +194,7 @@ function mapResultToQuery(result: QueryProcessResult): CiQueryPayload | null { formattedQuery: result.warning.formattedQuery, nudges: result.nudges, tags: result.tags, + tableReferences: result.referencedTables ?? [], optimization: result.warning.optimization ? { state: "no_improvement_found", diff --git a/src/runner.ts b/src/runner.ts index c8e3898..f52238a 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -272,6 +272,7 @@ export class Runner { rawQuery: query, nudges, tags, + referencedTables, warning: { fingerprint: queryFingerprint, formattedQuery, @@ -309,6 +310,7 @@ export class Runner { formattedQuery, nudges, tags, + referencedTables, }; } if (out.kind === "ok") { @@ -342,6 +344,7 @@ export class Runner { existingIndexes: existingIndexesForQuery, nudges, tags, + referencedTables, explainPlan: out.baseExplainPlan, }; } @@ -356,6 +359,7 @@ export class Runner { rawQuery: query, nudges, tags, + referencedTables, indexRecommendations: newIndexRecommendations, recommendation: { fingerprint: queryFingerprint, @@ -384,6 +388,7 @@ export class Runner { rawQuery: query, nudges, tags, + referencedTables, warning: { fingerprint: queryFingerprint, formattedQuery, @@ -407,6 +412,7 @@ export class Runner { existingIndexes: existingIndexesForQuery, nudges, tags, + referencedTables, explainPlan: out.baseExplainPlan, }; } @@ -422,6 +428,7 @@ export class Runner { formattedQuery, nudges, tags, + referencedTables, }; } console.timeEnd(`timing`); @@ -477,6 +484,7 @@ export type QueryProcessResult = rawQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; + referencedTables: Array<{ schema?: string; table: string }>; warning: ReportQueryCostWarning; } | { @@ -484,6 +492,7 @@ export type QueryProcessResult = rawQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; + referencedTables: Array<{ schema?: string; table: string }>; indexRecommendations: IndexRecommendation[]; recommendation: ReportIndexRecommendation; } @@ -496,6 +505,7 @@ export type QueryProcessResult = existingIndexes: string[]; nudges: Nudge[]; tags: SQLCommenterTag[]; + referencedTables: Array<{ schema?: string; table: string }>; explainPlan?: object; } | { kind: "error"; @@ -505,6 +515,7 @@ export type QueryProcessResult = formattedQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; + referencedTables: Array<{ schema?: string; table: string }>; } | { kind: "zero_cost_plan"; @@ -514,4 +525,5 @@ export type QueryProcessResult = formattedQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; + referencedTables: Array<{ schema?: string; table: string }>; }; From cb2606c39051dfa9b2e4793d802eae10e46b67cb Mon Sep 17 00:00:00 2001 From: Jean-Philippe Sirois Date: Thu, 26 Mar 2026 11:12:54 +0400 Subject: [PATCH 2/2] refactor: use TableReference type instead of inline shape Co-Authored-By: Claude Opus 4.6 (1M context) --- src/reporters/site-api.ts | 4 ++-- src/runner.ts | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/reporters/site-api.ts b/src/reporters/site-api.ts index fb0f03e..7ac4bb3 100644 --- a/src/reporters/site-api.ts +++ b/src/reporters/site-api.ts @@ -1,5 +1,5 @@ import * as github from "@actions/github"; -import type { IndexRecommendation, Nudge, SQLCommenterTag } from "@query-doctor/core"; +import type { IndexRecommendation, Nudge, SQLCommenterTag, TableReference } from "@query-doctor/core"; import { DEFAULT_CONFIG, type AnalyzerConfig } from "../config.ts"; import type { QueryProcessResult } from "../runner.ts"; @@ -20,7 +20,7 @@ export interface CiQueryPayload { optimization: CiOptimization; nudges: Nudge[]; tags: SQLCommenterTag[]; - tableReferences: Array<{ schema?: string; table: string }>; + tableReferences: TableReference[]; } export type CiOptimization = diff --git a/src/runner.ts b/src/runner.ts index f52238a..111c31c 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -15,6 +15,7 @@ import { type IndexRecommendation, type Nudge, type SQLCommenterTag, + type TableReference, OptimizeResult, type Postgres, PostgresQueryBuilder, @@ -484,7 +485,7 @@ export type QueryProcessResult = rawQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; - referencedTables: Array<{ schema?: string; table: string }>; + referencedTables: TableReference[]; warning: ReportQueryCostWarning; } | { @@ -492,7 +493,7 @@ export type QueryProcessResult = rawQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; - referencedTables: Array<{ schema?: string; table: string }>; + referencedTables: TableReference[]; indexRecommendations: IndexRecommendation[]; recommendation: ReportIndexRecommendation; } @@ -505,7 +506,7 @@ export type QueryProcessResult = existingIndexes: string[]; nudges: Nudge[]; tags: SQLCommenterTag[]; - referencedTables: Array<{ schema?: string; table: string }>; + referencedTables: TableReference[]; explainPlan?: object; } | { kind: "error"; @@ -515,7 +516,7 @@ export type QueryProcessResult = formattedQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; - referencedTables: Array<{ schema?: string; table: string }>; + referencedTables: TableReference[]; } | { kind: "zero_cost_plan"; @@ -525,5 +526,5 @@ export type QueryProcessResult = formattedQuery: string; nudges: Nudge[]; tags: SQLCommenterTag[]; - referencedTables: Array<{ schema?: string; table: string }>; + referencedTables: TableReference[]; };