bhavika24 commited on
Commit
b069287
·
verified ·
1 Parent(s): 65995bf

Upload engine.py

Browse files
Files changed (1) hide show
  1. engine.py +34 -2
engine.py CHANGED
@@ -86,20 +86,34 @@ def resolve_join_path(start_table, end_table):
86
  )
87
 
88
 
 
 
 
 
 
 
 
89
  def resolve_field(field_name, module):
90
  meta = load_metadata()
91
  fields = meta["fields"]
92
 
 
 
 
 
 
93
  if field_name not in fields:
94
  raise ValueError(f"Unknown field: {field_name}")
95
 
96
  field = fields[field_name]
97
 
 
98
  if field["module"] != module:
99
  raise ValueError(
100
  f"Field '{field_name}' does not belong to module '{module}'"
101
  )
102
 
 
103
  if "table" not in field or "column" not in field:
104
  raise ValueError(
105
  f"Field '{field_name}' is missing table/column mapping"
@@ -108,6 +122,7 @@ def resolve_field(field_name, module):
108
  return field
109
 
110
 
 
111
  def build_join_sql(base_table, steps):
112
  sql = []
113
  prev_alias = base_table # alias == table name
@@ -128,8 +143,24 @@ def build_join_sql(base_table, steps):
128
  # =========================
129
 
130
  def parse_intent(question):
 
 
 
 
 
 
 
 
 
 
131
  prompt = f"""
132
- You are a query planner.
 
 
 
 
 
 
133
 
134
  Extract:
135
  - module
@@ -142,7 +173,7 @@ Example:
142
  {{
143
  "module": "employees",
144
  "filters": [
145
- {{ "field": "department", "operator": "equals", "value": "IT" }}
146
  ]
147
  }}
148
 
@@ -158,6 +189,7 @@ User question:
158
 
159
  return json.loads(res.choices[0].message.content)
160
 
 
161
  # =========================
162
  # SQL GENERATOR
163
  # =========================
 
86
  )
87
 
88
 
89
+ FIELD_ALIASES = {
90
+ "join_date": "start_date",
91
+ "joining_date": "start_date",
92
+ "joined": "start_date",
93
+ "hire_date": "start_date"
94
+ }
95
+
96
  def resolve_field(field_name, module):
97
  meta = load_metadata()
98
  fields = meta["fields"]
99
 
100
+ # 🔹 Normalize field name
101
+ field_name = field_name.lower().strip()
102
+ field_name = FIELD_ALIASES.get(field_name, field_name)
103
+
104
+ # 🔹 Validate existence
105
  if field_name not in fields:
106
  raise ValueError(f"Unknown field: {field_name}")
107
 
108
  field = fields[field_name]
109
 
110
+ # 🔹 Validate module
111
  if field["module"] != module:
112
  raise ValueError(
113
  f"Field '{field_name}' does not belong to module '{module}'"
114
  )
115
 
116
+ # 🔹 Validate mapping
117
  if "table" not in field or "column" not in field:
118
  raise ValueError(
119
  f"Field '{field_name}' is missing table/column mapping"
 
122
  return field
123
 
124
 
125
+
126
  def build_join_sql(base_table, steps):
127
  sql = []
128
  prev_alias = base_table # alias == table name
 
143
  # =========================
144
 
145
  def parse_intent(question):
146
+ # 1️⃣ Load metadata
147
+ meta = load_metadata()
148
+
149
+ # 2️⃣ Build schema description for the LLM
150
+ schema_description = "\n".join([
151
+ f"{module}: {', '.join(meta['modules'][module]['fields'])}"
152
+ for module in meta["modules"]
153
+ ])
154
+
155
+ # 3️⃣ Prompt with schema awareness
156
  prompt = f"""
157
+ You are a SQL query planner.
158
+
159
+ You MUST only use fields listed below.
160
+ If a field does not exist, choose the closest valid one.
161
+
162
+ Available schema:
163
+ {schema_description}
164
 
165
  Extract:
166
  - module
 
173
  {{
174
  "module": "employees",
175
  "filters": [
176
+ {{ "field": "start_date", "operator": "greater_or_equal", "value": "2024-01-01" }}
177
  ]
178
  }}
179
 
 
189
 
190
  return json.loads(res.choices[0].message.content)
191
 
192
+
193
  # =========================
194
  # SQL GENERATOR
195
  # =========================