Commit ·
e6e7d55
1
Parent(s): 5c74566
הוספת דוקומנטציה מפורטת לכל שדה - משמעות עסקית, דוגמאות, ושימוש בשאילתות
Browse files- app/sql_service.py +95 -18
app/sql_service.py
CHANGED
|
@@ -131,44 +131,121 @@ class SQLFeedbackService:
|
|
| 131 |
if self.df is None:
|
| 132 |
return "No data available"
|
| 133 |
|
| 134 |
-
# Build complete schema with all columns - be very specific about types and
|
| 135 |
-
all_columns_info = "
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
all_columns_info += "-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
|
| 140 |
# Add optional columns if they exist
|
| 141 |
if 'ReferenceNumber' in self.df.columns:
|
| 142 |
-
all_columns_info += "- ReferenceNumber: מספר הפניה של
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
if 'RequestID' in self.df.columns:
|
| 144 |
-
all_columns_info += "- RequestID:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
if 'ProcessID' in self.df.columns:
|
| 146 |
-
all_columns_info += "- ProcessID: מזהה
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
|
| 148 |
# Add info about date/time columns - these are PRE-CALCULATED and MUST be used for time-based queries
|
| 149 |
date_columns = ['יום_בחודש', 'יום_בשבוע', 'שנה', 'חודש', 'שעה', 'יום_לילה']
|
| 150 |
existing_date_columns = [col for col in date_columns if col in self.df.columns]
|
| 151 |
date_columns_info = ""
|
| 152 |
if existing_date_columns:
|
| 153 |
-
date_columns_info = "\n\n⚠️⚠️⚠️ שדות תאריך/זמן מחושבים (כבר מולאו בנתונים - חובה להשתמש בהם לשאילתות זמן!)
|
| 154 |
-
|
| 155 |
-
date_columns_info += "\n- יום_בחודש: יום בחודש (1-31, מספר שלם) - מוכן לשימוש!"
|
| 156 |
-
if 'יום_בשבוע' in existing_date_columns:
|
| 157 |
-
date_columns_info += "\n- יום_בשבוע: יום בשבוע (טקסט: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) - מוכן לשימוש!"
|
| 158 |
if 'שנה' in existing_date_columns:
|
| 159 |
# Get actual year range from data
|
| 160 |
try:
|
| 161 |
year_min = int(self.df['שנה'].min())
|
| 162 |
year_max = int(self.df['שנה'].max())
|
| 163 |
-
|
| 164 |
except:
|
| 165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
if 'חודש' in existing_date_columns:
|
| 167 |
-
date_columns_info += "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
if 'שעה' in existing_date_columns:
|
| 169 |
-
date_columns_info += "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
if 'יום_לילה' in existing_date_columns:
|
| 171 |
-
date_columns_info += "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
|
| 173 |
schema_info = f"""
|
| 174 |
⚠️⚠️⚠️ שם הטבלה: 'Feedback_transformed' (עם אות גדולה F ו-underscore) - זה הקובץ feedback_transformed.csv
|
|
|
|
| 131 |
if self.df is None:
|
| 132 |
return "No data available"
|
| 133 |
|
| 134 |
+
# Build complete schema with all columns - be very specific about types, meanings, business context, and examples
|
| 135 |
+
all_columns_info = ""
|
| 136 |
+
|
| 137 |
+
# ID field
|
| 138 |
+
all_columns_info += "- ID: מזהה ייחודי של כל משוב\n"
|
| 139 |
+
all_columns_info += " * סוג: UUID/טקסט (מזהה ייחודי גלובלי)\n"
|
| 140 |
+
all_columns_info += " * משמעות עסקית: מזהה ייחודי לכל משוב במערכת, מאפשר מעקב אחר משוב ספציפי, קישור בין משובים, ומניעת כפילויות\n"
|
| 141 |
+
all_columns_info += " * דוגמאות: '71BE94CF-A408-47EC-9443-CA2385B6BFCF', '6E36E9B9-45D5-4143-AF24-216C2A889217'\n"
|
| 142 |
+
all_columns_info += " * שימוש בשאילתות: WHERE ID = '...', COUNT(DISTINCT ID), GROUP BY ID\n\n"
|
| 143 |
+
|
| 144 |
+
# ServiceName field
|
| 145 |
+
all_columns_info += "- ServiceName: שם השירות הדיגיטלי\n"
|
| 146 |
+
all_columns_info += " * סוג: טקסט (שם השירות)\n"
|
| 147 |
+
all_columns_info += " * משמעות עסקית: מזהה את השירות הדיגיטלי הממשלתי שעליו ניתן המשוב. מאפשר ניתוח לפי שירות, השוואה בין שירותים, וזיהוי שירותים בעייתיים או מצטיינים\n"
|
| 148 |
+
all_columns_info += " * דוגמאות: '1050_NifAvoda@btl.gov.il', '7112@btl.gov.il', 'שירות דיגיטלי אחר'\n"
|
| 149 |
+
all_columns_info += " * שימוש בשאילתות: WHERE ServiceName = '...', GROUP BY ServiceName, COUNT(*) GROUP BY ServiceName\n\n"
|
| 150 |
+
|
| 151 |
+
# Level field
|
| 152 |
+
all_columns_info += "- Level: הציון שהמשתמש נתן לשירות\n"
|
| 153 |
+
all_columns_info += " * סוג: מספר שלם (1-5)\n"
|
| 154 |
+
all_columns_info += " * משמעות עסקית: מדד שביעות רצון המשתמש מהשירות. 1=גרוע מאוד, 2=גרוע, 3=בינוני, 4=טוב, 5=מעולה. מאפשר מדידת שביעות רצון, זיהוי בעיות, ומעקב אחר שיפורים\n"
|
| 155 |
+
all_columns_info += " * דוגמאות: 1, 2, 3, 4, 5\n"
|
| 156 |
+
all_columns_info += " * שימוש בשאילתות: WHERE Level >= 4 (משובים חיוביים), WHERE Level <= 2 (משובים שליליים), AVG(Level), GROUP BY Level\n\n"
|
| 157 |
+
|
| 158 |
+
# Text field
|
| 159 |
+
all_columns_info += "- Text: הטקסט החופשי שהמשתמש הזין כחלק מהפידבק\n"
|
| 160 |
+
all_columns_info += " * סוג: טקסט (ארוך, יכול להכיל מספר משפטים)\n"
|
| 161 |
+
all_columns_info += " * משמעות עסקית: התוכן המפורט של המשוב - ביקורות, הצעות לשיפור, תלונות, מחמאות. מאפשר ניתוח איכותי של המשובים, זיהוי נושאים חוזרים, וקבלת תובנות עסקיות מעמיקות\n"
|
| 162 |
+
all_columns_info += " * דוגמאות: 'כי זה לא מנפיק את המספר', 'הכל מעולה!', 'במקרה של בעיה אין טלפון לבירורים...'\n"
|
| 163 |
+
all_columns_info += " * שימוש בשאילתות: WHERE Text LIKE '%...%', WHERE Text LIKE '%בעיה%', LENGTH(Text), COUNT(*) WHERE Text IS NOT NULL\n\n"
|
| 164 |
|
| 165 |
# Add optional columns if they exist
|
| 166 |
if 'ReferenceNumber' in self.df.columns:
|
| 167 |
+
all_columns_info += "- ReferenceNumber: מספר הפניה של המשוב\n"
|
| 168 |
+
all_columns_info += " * סוג: מספר שלם (יכול להיות NULL)\n"
|
| 169 |
+
all_columns_info += " * משמעות עסקית: מספר הפניה פנימי של המשוב במערכת. מאפשר קישור למסמכים או בקשות קשורות, מעקב אחר תהליכים, וניהול בקשות\n"
|
| 170 |
+
all_columns_info += " * דוגמאות: 6928, 6938, NULL\n"
|
| 171 |
+
all_columns_info += " * שימוש בשאילתות: WHERE ReferenceNumber = 6928, WHERE ReferenceNumber IS NOT NULL, COUNT(*) WHERE ReferenceNumber IS NULL\n\n"
|
| 172 |
+
|
| 173 |
if 'RequestID' in self.df.columns:
|
| 174 |
+
all_columns_info += "- RequestID: מזהה בקשה\n"
|
| 175 |
+
all_columns_info += " * סוג: UUID/טקסט (יכול להיות NULL)\n"
|
| 176 |
+
all_columns_info += " * משמעות עסקית: מזהה ייחודי של הבקשה המקורית שקשורה למשוב. מאפשר קישור בין בקשות למשובים, מעקב אחר תהליכים, וניתוח הקשר בין בקשה למשוב\n"
|
| 177 |
+
all_columns_info += " * דוגמאות: 'D02E2BB5-079B-44AD-AC35-9D30A22715F9', '463B8D9A-C85B-474C-895D-D73CE067EF27', NULL\n"
|
| 178 |
+
all_columns_info += " * שימוש בשאילתות: WHERE RequestID = '...', COUNT(DISTINCT RequestID), WHERE RequestID IS NOT NULL\n\n"
|
| 179 |
+
|
| 180 |
if 'ProcessID' in self.df.columns:
|
| 181 |
+
all_columns_info += "- ProcessID: מזהה תהליך\n"
|
| 182 |
+
all_columns_info += " * סוג: UUID/טקסט (יכול להיות NULL)\n"
|
| 183 |
+
all_columns_info += " * משמעות עסקית: מזהה ייחודי של התהליך העסקי שקשור למשוב. מאפשר ניתוח לפי תהליכים, זיהוי תהליכים בעייתיים, ומעקב אחר ביצועים של תהליכים ספציפיים\n"
|
| 184 |
+
all_columns_info += " * דוגמאות: UUID או NULL\n"
|
| 185 |
+
all_columns_info += " * שימוש בשאילתות: WHERE ProcessID = '...', COUNT(DISTINCT ProcessID), WHERE ProcessID IS NOT NULL\n\n"
|
| 186 |
|
| 187 |
# Add info about date/time columns - these are PRE-CALCULATED and MUST be used for time-based queries
|
| 188 |
date_columns = ['יום_בחודש', 'יום_בשבוע', 'שנה', 'חודש', 'שעה', 'יום_לילה']
|
| 189 |
existing_date_columns = [col for col in date_columns if col in self.df.columns]
|
| 190 |
date_columns_info = ""
|
| 191 |
if existing_date_columns:
|
| 192 |
+
date_columns_info = "\n\n⚠️⚠️⚠️ שדות תאריך/זמן מחושבים (כבר מולאו בנתונים - חובה להשתמש בהם לשאילתות זמן!):\n"
|
| 193 |
+
|
|
|
|
|
|
|
|
|
|
| 194 |
if 'שנה' in existing_date_columns:
|
| 195 |
# Get actual year range from data
|
| 196 |
try:
|
| 197 |
year_min = int(self.df['שנה'].min())
|
| 198 |
year_max = int(self.df['שנה'].max())
|
| 199 |
+
year_range = f"{year_min}-{year_max}"
|
| 200 |
except:
|
| 201 |
+
year_range = "למשל 2020"
|
| 202 |
+
|
| 203 |
+
date_columns_info += "- שנה: שנה שבה ניתן המשוב\n"
|
| 204 |
+
date_columns_info += " * סוג: מספר שלם\n"
|
| 205 |
+
date_columns_info += f" * טווח: {year_range}\n"
|
| 206 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח מגמות לאורך שנים, השוואה בין שנים, זיהוי שיפורים או הידרדרות, ותכנון אסטרטגי לטווח ארוך\n"
|
| 207 |
+
date_columns_info += f" * דוגמאות: {year_min}, {year_max}\n"
|
| 208 |
+
date_columns_info += " * שימוש בשאילתות: WHERE שנה = 2020, GROUP BY שנה, SELECT שנה, COUNT(*) GROUP BY שנה\n\n"
|
| 209 |
+
|
| 210 |
if 'חודש' in existing_date_columns:
|
| 211 |
+
date_columns_info += "- חודש: חודש בשנה שבו ניתן המשוב\n"
|
| 212 |
+
date_columns_info += " * סוג: מספר שלם (1-12)\n"
|
| 213 |
+
date_columns_info += " * משמעות: 1=ינואר, 2=פברואר, 3=מרץ, 4=אפריל, 5=מאי, 6=יוני, 7=יולי, 8=אוגוסט, 9=ספטמבר, 10=אוקטובר, 11=נובמבר, 12=דצמבר\n"
|
| 214 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח עונתי, זיהוי חודשים בעייתיים או מצטיינים, תכנון משאבים לפי עונות, וזיהוי דפוסים חודשיים\n"
|
| 215 |
+
date_columns_info += " * דוגמאות: 1 (ינואר), 6 (יוני), 12 (דצמבר)\n"
|
| 216 |
+
date_columns_info += " * שימוש בשאילתות: WHERE חודש = 1, GROUP BY חודש, SELECT חודש, COUNT(*) GROUP BY חודש ORDER BY חודש\n\n"
|
| 217 |
+
|
| 218 |
+
if 'יום_בחודש' in existing_date_columns:
|
| 219 |
+
date_columns_info += "- יום_בחודש: יום בחודש שבו ניתן המשוב\n"
|
| 220 |
+
date_columns_info += " * סוג: מספר שלם (1-31)\n"
|
| 221 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי ימים בחודש, זיהוי ימים בעייתיים (למשל סוף חודש), וניתוח דפוסים יומיים\n"
|
| 222 |
+
date_columns_info += " * דוגמאות: 1, 15, 31\n"
|
| 223 |
+
date_columns_info += " * שימוש בשאילתות: WHERE יום_בחודש = 1, GROUP BY יום_בחודש, SELECT יום_בחודש, COUNT(*) GROUP BY יום_בחודש\n\n"
|
| 224 |
+
|
| 225 |
+
if 'יום_בשבוע' in existing_date_columns:
|
| 226 |
+
date_columns_info += "- יום_בשבוע: יום בשבוע שבו ניתן המשוב\n"
|
| 227 |
+
date_columns_info += " * סוג: טקסט (אנגלית)\n"
|
| 228 |
+
date_columns_info += " * ערכים אפשריים: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday\n"
|
| 229 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי ימי השבוע, זיהוי ימים בעייתיים (למשל ראשון), תכנון כוח אדם, וזיהוי דפוסים שבועיים\n"
|
| 230 |
+
date_columns_info += " * דוגמאות: 'Monday', 'Wednesday', 'Friday'\n"
|
| 231 |
+
date_columns_info += " * שימוש בשאילתות: WHERE יום_בשבוע = 'Monday', GROUP BY יום_בשבוע, SELECT יום_בשבוע, COUNT(*) GROUP BY יום_בשבוע\n\n"
|
| 232 |
+
|
| 233 |
if 'שעה' in existing_date_columns:
|
| 234 |
+
date_columns_info += "- שעה: שעה ביום שבה ניתן המשוב\n"
|
| 235 |
+
date_columns_info += " * סוג: מספר שלם (0-23)\n"
|
| 236 |
+
date_columns_info += " * משמעות: 0=חצות (00:00), 12=צהריים (12:00), 23=23:00\n"
|
| 237 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי שעות היום, זיהוי שעות שיא, תכנון זמינות שירות, וזיהוי דפוסים יומיים (למשל שעות בוקר מול ערב)\n"
|
| 238 |
+
date_columns_info += " * דוגמאות: 0 (חצות), 9 (9 בבוקר), 14 (2 בצהריים), 18 (6 בערב), 23 (11 בלילה)\n"
|
| 239 |
+
date_columns_info += " * שימוש בשאילתות: WHERE שעה >= 9 AND שעה <= 17 (שעות עבודה), GROUP BY שעה, SELECT שעה, COUNT(*) GROUP BY שעה ORDER BY שעה\n\n"
|
| 240 |
+
|
| 241 |
if 'יום_לילה' in existing_date_columns:
|
| 242 |
+
date_columns_info += "- יום_לילה: האם המשוב ניתן בשעות היום או הלילה\n"
|
| 243 |
+
date_columns_info += " * סוג: טקסט\n"
|
| 244 |
+
date_columns_info += " * ערכים אפשריים: 'יום' או 'לילה'\n"
|
| 245 |
+
date_columns_info += " * הגדרה: יום=6:00-18:00, לילה=18:00-6:00\n"
|
| 246 |
+
date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי שעות פעילות, זיהוי הבדלים בין יום ללילה, תכנון זמינות שירות, וזיהוי בעיות בשעות מסוימות\n"
|
| 247 |
+
date_columns_info += " * דוגמאות: 'יום', 'לילה'\n"
|
| 248 |
+
date_columns_info += " * שימוש בשאילתות: WHERE יום_לילה = 'יום', GROUP BY יום_לילה, SELECT יום_לילה, COUNT(*) GROUP BY יום_לילה\n\n"
|
| 249 |
|
| 250 |
schema_info = f"""
|
| 251 |
⚠️⚠️⚠️ שם הטבלה: 'Feedback_transformed' (עם אות גדולה F ו-underscore) - זה הקובץ feedback_transformed.csv
|