VladGeekPro Copilot commited on
Commit
7b59e3d
·
1 Parent(s): 92ce1cc

ChangedTableSchemaAccordingToModelEducation

Browse files

Co-authored-by: Copilot <copilot@github.com>

Files changed (1) hide show
  1. sql_generator.py +19 -86
sql_generator.py CHANGED
@@ -5,81 +5,20 @@ from dataclasses import dataclass
5
  from typing import Any
6
 
7
 
8
- DEFAULT_DB_SCHEMA = """CREATE TABLE \"migrations\" (\"id\" integer primary key autoincrement not null, \"migration\" varchar not null, \"batch\" integer not null);
9
-
10
- CREATE TABLE \"users\" (\"id\" integer primary key autoincrement not null, \"image\" varchar, \"name\" varchar not null, \"email\" varchar not null, \"email_verified_at\" datetime, \"password\" varchar not null, \"widget_preferences\" text, \"remember_token\" varchar, \"created_at\" datetime, \"updated_at\" datetime);
11
-
12
- CREATE UNIQUE INDEX \"users_email_unique\" on \"users\" (\"email\");
13
-
14
- CREATE TABLE \"password_reset_tokens\" (\"email\" varchar not null, \"token\" varchar not null, \"created_at\" datetime, primary key (\"email\"));
15
-
16
- CREATE TABLE \"sessions\" (\"id\" varchar not null, \"user_id\" integer, \"ip_address\" varchar, \"user_agent\" text, \"payload\" text not null, \"last_activity\" integer not null, primary key (\"id\"));
17
-
18
- CREATE INDEX \"sessions_user_id_index\" on \"sessions\" (\"user_id\");
19
-
20
- CREATE INDEX \"sessions_last_activity_index\" on \"sessions\" (\"last_activity\");
21
-
22
- CREATE TABLE \"cache\" (\"key\" varchar not null, \"value\" text not null, \"expiration\" integer not null, primary key (\"key\"));
23
-
24
- CREATE TABLE \"cache_locks\" (\"key\" varchar not null, \"owner\" varchar not null, \"expiration\" integer not null, primary key (\"key\"));
25
-
26
- CREATE TABLE \"jobs\" (\"id\" integer primary key autoincrement not null, \"queue\" varchar not null, \"payload\" text not null, \"attempts\" integer not null, \"reserved_at\" integer, \"available_at\" integer not null, \"created_at\" integer not null);
27
-
28
- CREATE INDEX \"jobs_queue_index\" on \"jobs\" (\"queue\");
29
-
30
- CREATE TABLE \"job_batches\" (\"id\" varchar not null, \"name\" varchar not null, \"total_jobs\" integer not null, \"pending_jobs\" integer not null, \"failed_jobs\" integer not null, \"failed_job_ids\" text not null, \"options\" text, \"cancelled_at\" integer, \"created_at\" integer not null, \"finished_at\" integer, primary key (\"id\"));
31
-
32
- CREATE TABLE \"failed_jobs\" (\"id\" integer primary key autoincrement not null, \"uuid\" varchar not null, \"connection\" text not null, \"queue\" text not null, \"payload\" text not null, \"exception\" text not null, \"failed_at\" datetime not null default CURRENT_TIMESTAMP);
33
-
34
- CREATE UNIQUE INDEX \"failed_jobs_uuid_unique\" on \"failed_jobs\" (\"uuid\");
35
-
36
- CREATE TABLE \"categories\" (\"id\" integer primary key autoincrement not null, \"name\" varchar not null, \"slug\" varchar not null, \"image\" varchar, \"notes\" text not null, \"created_at\" datetime, \"updated_at\" datetime);
37
-
38
- CREATE UNIQUE INDEX \"categories_slug_unique\" on \"categories\" (\"slug\");
39
-
40
- CREATE TABLE \"suppliers\" (\"id\" integer primary key autoincrement not null, \"name\" varchar not null, \"slug\" varchar not null, \"image\" varchar, \"category_id\" integer not null, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"category_id\") references \"categories\"(\"id\") on delete cascade);
41
-
42
- CREATE UNIQUE INDEX \"suppliers_slug_unique\" on \"suppliers\" (\"slug\");
43
-
44
- CREATE TABLE \"expenses\" (\"id\" integer primary key autoincrement not null, \"user_id\" integer not null, \"date\" date not null, \"category_id\" integer not null, \"supplier_id\" integer not null, \"sum\" numeric not null, \"notes\" text, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"user_id\") references \"users\"(\"id\") on delete cascade, foreign key(\"category_id\") references \"categories\"(\"id\") on delete set null, foreign key(\"supplier_id\") references \"suppliers\"(\"id\") on delete set null);
45
-
46
- CREATE INDEX \"expenses_date_index\" on \"expenses\" (\"date\");
47
-
48
- CREATE INDEX \"expenses_user_id_date_index\" on \"expenses\" (\"user_id\", \"date\");
49
-
50
- CREATE TABLE \"overpayments\" (\"id\" integer primary key autoincrement not null, \"user_id\" integer not null, \"sum\" numeric not null, \"notes\" text not null, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"user_id\") references \"users\"(\"id\") on delete cascade);
51
-
52
- CREATE INDEX \"overpayments_created_at_index\" on \"overpayments\" (\"created_at\");
53
-
54
- CREATE TABLE \"debts\" (\"id\" integer primary key autoincrement not null, \"date\" date not null, \"user_id\" integer, \"debt_sum\" numeric not null default '0', \"overpayment_id\" integer, \"notes\" text not null, \"payment_status\" varchar check (\"payment_status\" in ('unpaid', 'partial', 'paid')) not null default 'unpaid', \"partial_sum\" numeric not null default '0', \"date_paid\" date, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"user_id\") references \"users\"(\"id\") on delete cascade, foreign key(\"overpayment_id\") references \"overpayments\"(\"id\") on delete cascade);
55
-
56
- CREATE INDEX \"debts_payment_status_date_index\" on \"debts\" (\"payment_status\", \"date\");
57
-
58
- CREATE UNIQUE INDEX \"debts_date_unique\" on \"debts\" (\"date\");
59
-
60
- CREATE TABLE \"notifications\" (\"id\" varchar not null, \"type\" varchar not null, \"notifiable_type\" varchar not null, \"notifiable_id\" integer not null, \"data\" text not null, \"read_at\" datetime, \"created_at\" datetime, \"updated_at\" datetime, primary key (\"id\"));
61
-
62
- CREATE INDEX \"notifications_notifiable_type_notifiable_id_index\" on \"notifications\" (\"notifiable_type\", \"notifiable_id\");
63
-
64
- CREATE TABLE \"expense_change_requests\" (\"id\" integer primary key autoincrement not null, \"expense_id\" integer, \"user_id\" integer not null, \"action_type\" varchar check (\"action_type\" in ('create', 'edit', 'delete')) not null, \"current_date\" date, \"current_user_id\" integer, \"current_category_id\" integer, \"current_supplier_id\" integer, \"current_sum\" numeric, \"current_notes\" text, \"requested_date\" date, \"requested_user_id\" integer, \"requested_category_id\" integer, \"requested_supplier_id\" integer, \"requested_sum\" numeric, \"requested_notes\" text, \"notes\" text not null, \"status\" varchar check (\"status\" in ('pending', 'rejected', 'completed')) not null default 'pending', \"applied_at\" datetime, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"expense_id\") references \"expenses\"(\"id\") on delete set null, foreign key(\"user_id\") references \"users\"(\"id\") on delete cascade, foreign key(\"current_user_id\") references \"users\"(\"id\") on delete set null, foreign key(\"current_category_id\") references \"categories\"(\"id\") on delete set null, foreign key(\"current_supplier_id\") references \"suppliers\"(\"id\") on delete set null, foreign key(\"requested_user_id\") references \"users\"(\"id\") on delete set null, foreign key(\"requested_category_id\") references \"categories\"(\"id\") on delete set null, foreign key(\"requested_supplier_id\") references \"suppliers\"(\"id\") on delete set null);
65
-
66
- CREATE INDEX \"expense_change_requests_status_created_at_index\" on \"expense_change_requests\" (\"status\", \"created_at\");
67
-
68
- CREATE INDEX \"expense_change_requests_expense_id_status_index\" on \"expense_change_requests\" (\"expense_id\", \"status\");
69
-
70
- CREATE INDEX \"expense_change_requests_user_id_index\" on \"expense_change_requests\" (\"user_id\");
71
-
72
- CREATE TABLE \"expense_change_request_votes\" (\"id\" integer primary key autoincrement not null, \"expense_change_request_id\" integer not null, \"user_id\" integer not null, \"vote\" varchar check (\"vote\" in ('approved', 'rejected')) not null, \"notes\" text, \"created_at\" datetime, \"updated_at\" datetime, foreign key(\"expense_change_request_id\") references \"expense_change_requests\"(\"id\") on delete cascade, foreign key(\"user_id\") references \"users\"(\"id\") on delete cascade);
73
-
74
- CREATE UNIQUE INDEX \"unique_vote_per_user\" on \"expense_change_request_votes\" (\"expense_change_request_id\", \"user_id\");
75
-
76
- CREATE INDEX \"expense_change_request_votes_user_id_vote_index\" on \"expense_change_request_votes\" (\"user_id\", \"vote\");
77
-
78
- CREATE TABLE \"paid_debts\" (\"id\" integer primary key autoincrement not null, \"created_at\" datetime, \"updated_at\" datetime, \"debt_id\" integer not null, \"changed_debt_date\" date not null, \"paid_by_user_id\" integer not null, \"payment_status\" varchar check (\"payment_status\" in ('partial', 'paid')) not null, \"paid_sum\" numeric not null, foreign key(\"debt_id\") references \"debts\"(\"id\") on delete cascade, foreign key(\"paid_by_user_id\") references \"users\"(\"id\") on delete cascade);
79
-
80
- CREATE INDEX \"paid_debts_debt_id_index\" on \"paid_debts\" (\"debt_id\");
81
-
82
- CREATE INDEX \"paid_debts_paid_by_user_id_index\" on \"paid_debts\" (\"paid_by_user_id\");"""
83
 
84
  _SQL_GENERATOR: Any | None = None
85
 
@@ -108,16 +47,10 @@ def _get_sql_generator() -> Any:
108
 
109
 
110
  def _build_prompt(payload: SqlGenerationRequest) -> str:
111
- return (
112
- "Task: generate one SQLite SQL query for the question. "
113
- "Return only SQL, no markdown and no explanation. "
114
- "Use only schema objects provided below. "
115
- "Never generate non-SELECT statements.\n\n"
116
- f"Question: {payload.question}\n"
117
- f"Schema: {DEFAULT_DB_SCHEMA}\n"
118
- f"Constraints: output must start with SELECT; apply LIMIT {payload.limit} when not aggregate.\n"
119
- "SQL:"
120
- )
121
 
122
 
123
  def _normalize_sql(raw_sql: str, limit: int) -> str:
@@ -168,7 +101,7 @@ def generate_sql(question: str, limit: int = 200) -> str:
168
  prompt = _build_prompt(payload)
169
  result = generator(
170
  prompt,
171
- max_new_tokens=256,
172
  do_sample=False,
173
  num_beams=4,
174
  truncation=True,
 
5
  from typing import Any
6
 
7
 
8
+ # Compact Spider-style schema: only business tables, no Laravel internals.
9
+ # Format: table col type , col type | table2 col type , col type
10
+ # Foreign keys annotated inline for model guidance.
11
+ DEFAULT_DB_SCHEMA = (
12
+ "users : id int , name varchar , email varchar , created_at datetime , updated_at datetime | "
13
+ "categories : id int , name varchar , slug varchar , notes text , created_at datetime , updated_at datetime | "
14
+ "suppliers : id int , name varchar , slug varchar , category_id int , created_at datetime , updated_at datetime | "
15
+ "expenses : id int , user_id int , date date , category_id int , supplier_id int , sum numeric , notes text , created_at datetime , updated_at datetime | "
16
+ "debts : id int , date date , user_id int , debt_sum numeric , overpayment_id int , notes text , payment_status varchar , partial_sum numeric , date_paid date , created_at datetime , updated_at datetime | "
17
+ "overpayments : id int , user_id int , sum numeric , notes text , created_at datetime , updated_at datetime | "
18
+ "paid_debts : id int , debt_id int , changed_debt_date date , paid_by_user_id int , payment_status varchar , paid_sum numeric , created_at datetime , updated_at datetime | "
19
+ "expense_change_requests : id int , expense_id int , user_id int , action_type varchar , current_date date , current_user_id int , current_category_id int , current_supplier_id int , current_sum numeric , requested_date date , requested_user_id int , requested_category_id int , requested_supplier_id int , requested_sum numeric , notes text , status varchar , applied_at datetime , created_at datetime , updated_at datetime | "
20
+ "expense_change_request_votes : id int , expense_change_request_id int , user_id int , vote varchar , notes text , created_at datetime , updated_at datetime"
21
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  _SQL_GENERATOR: Any | None = None
24
 
 
47
 
48
 
49
  def _build_prompt(payload: SqlGenerationRequest) -> str:
50
+ # gaussalgo/T5-LM-Large-text2sql-spider is trained on Spider benchmark.
51
+ # Expected format: "Question: {q} | {compact_schema}"
52
+ # where schema uses pipe-separator between tables and " : " between table name and columns.
53
+ return f"Question: {payload.question} | {DEFAULT_DB_SCHEMA}"
 
 
 
 
 
 
54
 
55
 
56
  def _normalize_sql(raw_sql: str, limit: int) -> str:
 
101
  prompt = _build_prompt(payload)
102
  result = generator(
103
  prompt,
104
+ max_new_tokens=512,
105
  do_sample=False,
106
  num_beams=4,
107
  truncation=True,