| import re
|
| import sqlite3
|
| from datetime import datetime
|
| from db.database import Database
|
| from nlp.sql_model import SQLModel
|
|
|
| class QueryProcessor:
|
| def __init__(self, db):
|
| self.db = db
|
| self.sql_model = SQLModel()
|
|
|
| def convert_date(self, date_str):
|
| formats = [
|
| '%d/%m/%Y',
|
| '%d %B %Y',
|
| '%B %Y',
|
| '%b %Y',
|
| '%Y-%m-%d'
|
| ]
|
| for fmt in formats:
|
| try:
|
| return datetime.strptime(date_str, fmt).date()
|
| except ValueError:
|
| continue
|
| raise ValueError('Invalid date format')
|
|
|
| def extract_and_convert_date(self, user_query):
|
| date_pattern = r'\b(\b[0-9]{1,2}[/-]?[0-9]{1,2}[/-]?[0-9]{2,4}\b|\b(?:\b(?:January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b[- ]?[0-9]{1,2}[- ]?[0-9]{2,4}\b|\b[0-9]{2,4}[- ]?(?:January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b)\b)'
|
| match = re.search(date_pattern, user_query, re.I)
|
| if match:
|
| date_str = match.group(0)
|
| try:
|
| return self.convert_date(date_str)
|
| except ValueError:
|
| return None
|
| return None
|
|
|
|
|
| def process_query(self, user_query):
|
| conn = self.db.connect()
|
| if not conn:
|
| return "Failed to connect to the database."
|
|
|
| response = ''
|
| try:
|
|
|
| sql_query = self.sql_model.generate_sql(user_query)
|
|
|
| cursor = self.db.execute_query(sql_query)
|
| if cursor:
|
| results = cursor.fetchall()
|
| if results:
|
| response = f'Results: {results}'
|
| else:
|
| response = 'No results found.'
|
| else:
|
| response = 'Error executing query.'
|
| finally:
|
| self.db.close()
|
| return response |