Skip to content

Commit 04dbb2a

Browse files
cpcloudcursoragent
andcommitted
fix(llm): update column names to match expanded schema from main
Main branch (commit fdb0873) removed all terse gorm column tags, letting GORM use snake_case derivation. This expanded abbreviated column names: - budget_ct → budget_cents - actual_ct → actual_cents - amount_ct / tot_ct → total_cents - last_serviced → last_serviced_at - warranty_exp → warranty_expiry - And many more (model_no, serial_no, int_mo, man_url, man_txt, etc.) Updated LLM prompt code to use the new expanded names: - Few-shot SQL examples (8 queries updated) - Schema notes (maintenance scheduling, warranty column) - Test fixtures and assertions (3 test files) The `_cents` suffix pattern remains (rule still applies), just with the full word instead of `_ct` abbreviation. Refs fdb0873 Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 3544c55 commit 04dbb2a

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

internal/llm/prompt.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ RULES:
255255

256256
const sqlSchemaNotes = `
257257
Notes:
258-
- Maintenance scheduling: next_due = date(last_serviced, '+' || interval_months || ' months')
258+
- Maintenance scheduling: next_due = date(last_serviced_at, '+' || interval_months || ' months')
259259
- Project statuses: ideating, planned, quoted, underway, delayed, completed, abandoned
260-
- Warranty expiry is in the warranty_exp column (date string)
260+
- Warranty expiry is in the warranty_expiry column (date string)
261261
- For case-insensitive text search, use UPPER() or LOWER() on both sides: WHERE LOWER(title) LIKE LOWER('%hvac%')`
262262

263263
const sqlFewShot = `## Examples
@@ -266,31 +266,31 @@ User: How many projects are underway?
266266
SQL: SELECT COUNT(*) AS count FROM projects WHERE status = 'underway' AND deleted_at IS NULL
267267
268268
User: What's my most expensive project?
269-
SQL: SELECT name, budget_ct / 100.0 AS budget_dollars FROM projects WHERE deleted_at IS NULL ORDER BY budget_ct DESC LIMIT 1
269+
SQL: SELECT name, budget_cents / 100.0 AS budget_dollars FROM projects WHERE deleted_at IS NULL ORDER BY budget_cents DESC LIMIT 1
270270
271271
User: When is the HVAC filter due?
272-
SQL: SELECT m.name, m.last_serviced, m.interval_months, date(m.last_serviced, '+' || m.interval_months || ' months') AS next_due FROM maintenance_items m WHERE m.name LIKE '%HVAC%' AND m.deleted_at IS NULL
272+
SQL: SELECT m.name, m.last_serviced_at, m.interval_months, date(m.last_serviced_at, '+' || m.interval_months || ' months') AS next_due FROM maintenance_items m WHERE m.name LIKE '%HVAC%' AND m.deleted_at IS NULL
273273
274274
User: Which appliances have expiring warranties in the next 90 days?
275-
SQL: SELECT name, warranty_exp FROM appliances WHERE warranty_exp IS NOT NULL AND warranty_exp BETWEEN date('now') AND date('now', '+90 days') AND deleted_at IS NULL
275+
SQL: SELECT name, warranty_expiry FROM appliances WHERE warranty_expiry IS NOT NULL AND warranty_expiry BETWEEN date('now') AND date('now', '+90 days') AND deleted_at IS NULL
276276
277277
User: How much have I spent on plumbing?
278-
SQL: SELECT SUM(q.amount_ct) / 100.0 AS total_dollars FROM quotes q JOIN projects p ON q.project_id = p.id WHERE p.project_type = 'plumbing' AND p.deleted_at IS NULL AND q.deleted_at IS NULL
278+
SQL: SELECT SUM(q.total_cents) / 100.0 AS total_dollars FROM quotes q JOIN projects p ON q.project_id = p.id JOIN project_types pt ON p.project_type_id = pt.id WHERE pt.name = 'plumbing' AND p.deleted_at IS NULL AND q.deleted_at IS NULL
279279
280280
User: Show me all maintenance items and when they're next due
281-
SQL: SELECT name, last_serviced, interval_months, date(last_serviced, '+' || interval_months || ' months') AS next_due FROM maintenance_items WHERE deleted_at IS NULL ORDER BY next_due
281+
SQL: SELECT name, last_serviced_at, interval_months, date(last_serviced_at, '+' || interval_months || ' months') AS next_due FROM maintenance_items WHERE deleted_at IS NULL ORDER BY next_due
282282
283283
User: Which projects involve HVAC work?
284284
SQL: SELECT title, status, description FROM projects WHERE (LOWER(title) LIKE LOWER('%hvac%') OR LOWER(description) LIKE LOWER('%hvac%')) AND deleted_at IS NULL
285285
286286
User: Show me total spending by project status
287-
SQL: SELECT status, SUM(actual_ct) / 100.0 AS total_dollars FROM projects WHERE deleted_at IS NULL GROUP BY status ORDER BY total_dollars DESC
287+
SQL: SELECT status, SUM(actual_cents) / 100.0 AS total_dollars FROM projects WHERE deleted_at IS NULL GROUP BY status ORDER BY total_dollars DESC
288288
289289
User: Which vendors have given me the most quotes?
290290
SQL: SELECT v.name, COUNT(q.id) AS quote_count FROM vendors v JOIN quotes q ON v.id = q.vendor_id WHERE v.deleted_at IS NULL AND q.deleted_at IS NULL GROUP BY v.id, v.name ORDER BY quote_count DESC
291291
292292
User: What's the average quote amount for each project type?
293-
SQL: SELECT pt.name AS project_type, AVG(q.total_ct) / 100.0 AS avg_quote_dollars FROM project_types pt JOIN projects p ON pt.id = p.project_type_id JOIN quotes q ON p.id = q.project_id WHERE p.deleted_at IS NULL AND q.deleted_at IS NULL GROUP BY pt.id, pt.name ORDER BY avg_quote_dollars DESC
293+
SQL: SELECT pt.name AS project_type, AVG(q.total_cents) / 100.0 AS avg_quote_dollars FROM project_types pt JOIN projects p ON pt.id = p.project_type_id JOIN quotes q ON p.id = q.project_id WHERE p.deleted_at IS NULL AND q.deleted_at IS NULL GROUP BY pt.id, pt.name ORDER BY avg_quote_dollars DESC
294294
295295
Now generate SQL for the user's question.`
296296

internal/llm/prompt_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var testTables = []TableInfo{
1616
Columns: []ColumnInfo{
1717
{Name: "id", Type: "integer", PK: true},
1818
{Name: "title", Type: "text", NotNull: true},
19-
{Name: "budget_ct", Type: "integer"},
19+
{Name: "budget_cents", Type: "integer"},
2020
{Name: "status", Type: "text"},
2121
},
2222
},
@@ -76,14 +76,14 @@ func TestBuildSQLPromptIncludesDDL(t *testing.T) {
7676
assert.Contains(t, prompt, "CREATE TABLE projects")
7777
assert.Contains(t, prompt, "id integer PRIMARY KEY")
7878
assert.Contains(t, prompt, "title text NOT NULL")
79-
assert.Contains(t, prompt, "budget_ct integer")
79+
assert.Contains(t, prompt, "budget_cents integer")
8080
assert.Contains(t, prompt, "CREATE TABLE appliances")
8181
}
8282

8383
func TestBuildSQLPromptIncludesFewShotExamples(t *testing.T) {
8484
prompt := BuildSQLPrompt(testTables, testNow, "")
8585
assert.Contains(t, prompt, "SELECT COUNT(*)")
86-
assert.Contains(t, prompt, "budget_ct / 100.0")
86+
assert.Contains(t, prompt, "budget_cents / 100.0")
8787
assert.Contains(t, prompt, "deleted_at IS NULL")
8888
}
8989

internal/llm/sqlfmt_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ func TestFormatSQLSingleColumn(t *testing.T) {
2424

2525
func TestFormatSQLMultipleClauses(t *testing.T) {
2626
got := FormatSQL(
27-
"SELECT name, budget_ct / 100.0 AS budget FROM projects "+
27+
"SELECT name, budget_cents / 100.0 AS budget FROM projects "+
2828
"WHERE status = 'underway' AND deleted_at IS NULL "+
29-
"ORDER BY budget_ct DESC LIMIT 5",
29+
"ORDER BY budget_cents DESC LIMIT 5",
3030
0,
3131
)
3232
expected := "SELECT name,\n" +
33-
" budget_ct / 100.0 AS budget\n" +
33+
" budget_cents / 100.0 AS budget\n" +
3434
"FROM projects\n" +
3535
"WHERE status = 'underway'\n" +
3636
" AND deleted_at IS NULL\n" +
37-
"ORDER BY budget_ct DESC\n" +
37+
"ORDER BY budget_cents DESC\n" +
3838
"LIMIT 5"
3939
assert.Equal(t, expected, got)
4040
}
@@ -56,12 +56,12 @@ func TestFormatSQLJoin(t *testing.T) {
5656

5757
func TestFormatSQLSubquery(t *testing.T) {
5858
got := FormatSQL(
59-
"SELECT name FROM projects WHERE id IN (SELECT project_id FROM quotes WHERE amount_ct > 10000)",
59+
"SELECT name FROM projects WHERE id IN (SELECT project_id FROM quotes WHERE total_cents > 10000)",
6060
0,
6161
)
6262
assert.Contains(t, got, "SELECT name")
6363
assert.Contains(t, got, "FROM projects")
64-
assert.Contains(t, got, "WHERE id IN (SELECT project_id FROM quotes WHERE amount_ct > 10000)")
64+
assert.Contains(t, got, "WHERE id IN (SELECT project_id FROM quotes WHERE total_cents > 10000)")
6565
}
6666

6767
func TestFormatSQLGroupBy(t *testing.T) {
@@ -104,12 +104,12 @@ func TestFormatSQLPreservesStrings(t *testing.T) {
104104

105105
func TestFormatSQLDateFunctions(t *testing.T) {
106106
got := FormatSQL(
107-
"SELECT name, date(last_serviced, '+' || interval_months || ' months') AS next_due "+
107+
"SELECT name, date(last_serviced_at, '+' || interval_months || ' months') AS next_due "+
108108
"FROM maintenance_items WHERE deleted_at IS NULL ORDER BY next_due",
109109
0,
110110
)
111111
assert.Contains(t, got, "SELECT name")
112-
assert.Contains(t, got, "date(last_serviced, '+' || interval_months || ' months') AS next_due")
112+
assert.Contains(t, got, "date(last_serviced_at, '+' || interval_months || ' months') AS next_due")
113113
assert.Contains(t, got, "FROM maintenance_items")
114114
assert.Contains(t, got, "ORDER BY next_due")
115115
}
@@ -128,7 +128,7 @@ func TestFormatSQLAlreadyFormatted(t *testing.T) {
128128

129129
func TestFormatSQLBetween(t *testing.T) {
130130
got := FormatSQL(
131-
"SELECT name FROM appliances WHERE warranty_exp BETWEEN date('now') AND date('now', '+90 days')",
131+
"SELECT name FROM appliances WHERE warranty_expiry BETWEEN date('now') AND date('now', '+90 days')",
132132
0,
133133
)
134134
assert.Contains(t, got, "BETWEEN")
@@ -137,12 +137,12 @@ func TestFormatSQLBetween(t *testing.T) {
137137

138138
func TestFormatSQLAggregateWithJoin(t *testing.T) {
139139
got := FormatSQL(
140-
"SELECT SUM(q.amount_ct) / 100.0 AS total FROM quotes q "+
140+
"SELECT SUM(q.total_cents) / 100.0 AS total FROM quotes q "+
141141
"JOIN projects p ON q.project_id = p.id "+
142142
"WHERE p.deleted_at IS NULL AND q.deleted_at IS NULL",
143143
0,
144144
)
145-
expected := "SELECT SUM(q.amount_ct) / 100.0 AS total\n" +
145+
expected := "SELECT SUM(q.total_cents) / 100.0 AS total\n" +
146146
"FROM quotes q\n" +
147147
"JOIN projects p\nON q.project_id = p.id\n" +
148148
"WHERE p.deleted_at IS NULL\n" +
@@ -152,7 +152,7 @@ func TestFormatSQLAggregateWithJoin(t *testing.T) {
152152

153153
func TestFormatSQLWrapsLongLines(t *testing.T) {
154154
got := FormatSQL(
155-
"SELECT name, date(last_serviced, '+' || interval_months || ' months') AS next_due "+
155+
"SELECT name, date(last_serviced_at, '+' || interval_months || ' months') AS next_due "+
156156
"FROM maintenance_items WHERE deleted_at IS NULL ORDER BY next_due",
157157
40,
158158
)

0 commit comments

Comments
 (0)