grade as an int

parent dcae36f9
...@@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS students ( ...@@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS students (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
student_id VARCHAR(50) UNIQUE NOT NULL, student_id VARCHAR(50) UNIQUE NOT NULL,
student_name VARCHAR(100), student_name VARCHAR(100),
grade VARCHAR(20), grade INTEGER NOT NULL,
language BOOLEAN, language BOOLEAN,
nationality VARCHAR(20) NOT NULL DEFAULT 'EGYPTIAN' nationality VARCHAR(20) NOT NULL DEFAULT 'EGYPTIAN'
); );
...@@ -26,13 +26,15 @@ CREATE TABLE IF NOT EXISTS chat_history ( ...@@ -26,13 +26,15 @@ CREATE TABLE IF NOT EXISTS chat_history (
CREATE INDEX IF NOT EXISTS idx_chat_history_student_id ON chat_history(student_id); CREATE INDEX IF NOT EXISTS idx_chat_history_student_id ON chat_history(student_id);
CREATE INDEX IF NOT EXISTS idx_chat_history_created_at ON chat_history(created_at); CREATE INDEX IF NOT EXISTS idx_chat_history_created_at ON chat_history(created_at);
CREATE INDEX IF NOT EXISTS idx_students_nationality ON students(nationality); CREATE INDEX IF NOT EXISTS idx_students_nationality ON students(nationality);
CREATE INDEX IF NOT EXISTS idx_students_grade ON students(grade);
CREATE INDEX IF NOT EXISTS idx_students_grade_language ON students(grade, language);
-- Insert dummy data for testing -- Insert dummy data for testing
INSERT INTO students (student_id, student_name, grade, language, nationality) VALUES INSERT INTO students (student_id, student_name, grade, language, nationality) VALUES
('student_001', 'Ahmed Ali', 'prime4', TRUE, 'EGYPTIAN'), ('student_001', 'Ahmed Ali', 4, TRUE, 'EGYPTIAN'),
('student_002', 'Sara Hassan', 'prime6', FALSE, 'SAUDI'), ('student_002', 'Sara Hassan', 6, FALSE, 'SAUDI'),
('student_003', 'Mona Adel', 'prime5', TRUE, 'EGYPTIAN'), ('student_003', 'Mona Adel', 5, TRUE, 'EGYPTIAN'),
('student_004', 'Omar Youssef', 'prime6', FALSE, 'SAUDI') ('student_004', 'Omar Youssef', 6, FALSE, 'SAUDI')
ON CONFLICT (student_id) DO NOTHING; ON CONFLICT (student_id) DO NOTHING;
""" """
...@@ -100,7 +102,7 @@ def setup_database(drop_existing_tables: bool = False): ...@@ -100,7 +102,7 @@ def setup_database(drop_existing_tables: bool = False):
if __name__ == "__main__": if __name__ == "__main__":
# To run with a clean slate, pass True # To run with a clean slate, pass True
# setup_database(drop_existing_tables=True) setup_database(drop_existing_tables=True)
# To run without dropping tables (default) # To run without dropping tables (default)
setup_database() #setup_database()
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -26,7 +26,7 @@ def create_schema_and_table(conn, drop_existing_table: bool): ...@@ -26,7 +26,7 @@ def create_schema_and_table(conn, drop_existing_table: bool):
create_table = """ create_table = """
CREATE TABLE IF NOT EXISTS educational_chunks ( CREATE TABLE IF NOT EXISTS educational_chunks (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
grade TEXT NOT NULL, grade INTEGER NOT NULL,
subject TEXT, subject TEXT,
unit TEXT, unit TEXT,
concept TEXT, concept TEXT,
...@@ -64,6 +64,40 @@ def create_schema_and_table(conn, drop_existing_table: bool): ...@@ -64,6 +64,40 @@ def create_schema_and_table(conn, drop_existing_table: bool):
conn.commit() conn.commit()
cur.close() cur.close()
def extract_grade_number(grade_value) -> int:
"""Extract numeric grade from various formats"""
if pd.isna(grade_value):
return 1 # default
grade_str = str(grade_value).lower().strip()
# Try to extract number directly
if grade_str.isdigit():
return int(grade_str)
# Handle common formats like "grade4", "prime4", "4th grade", etc.
import re
numbers = re.findall(r'\d+', grade_str)
if numbers:
return int(numbers[0])
# Fallback mapping for word-based grades
grade_mapping = {
'one': 1, 'first': 1,
'two': 2, 'second': 2,
'three': 3, 'third': 3,
'four': 4, 'fourth': 4,
'five': 5, 'fifth': 5,
'six': 6, 'sixth': 6,
}
for word, num in grade_mapping.items():
if word in grade_str:
return num
# Final fallback
print(f"Warning: Could not parse grade '{grade_value}', defaulting to 1")
return 1
def insert_chunks_from_csv(csv_file: str): def insert_chunks_from_csv(csv_file: str):
df = pd.read_csv(csv_file) df = pd.read_csv(csv_file)
...@@ -95,8 +129,11 @@ def insert_chunks_from_csv(csv_file: str): ...@@ -95,8 +129,11 @@ def insert_chunks_from_csv(csv_file: str):
for idx, row in df.iterrows(): for idx, row in df.iterrows():
try: try:
embedding = json.loads(row["Embedding"]) embedding = json.loads(row["Embedding"])
# Convert grade to integer
grade_int = extract_grade_number(row["Grade"])
buffer.append(( buffer.append((
str(row["Grade"]), grade_int, # Now properly converted to integer
row["Subject"], row["Subject"],
row.get("Unit"), row.get("Unit"),
row.get("Concept"), row.get("Concept"),
...@@ -161,7 +198,7 @@ def setup_embeddings_database(drop_existing_tables: bool = False): ...@@ -161,7 +198,7 @@ def setup_embeddings_database(drop_existing_tables: bool = False):
if __name__ == "__main__": if __name__ == "__main__":
# To run with a clean slate, pass True # To run with a clean slate, pass True
# setup_embeddings_database(drop_existing_tables=True) setup_embeddings_database(drop_existing_tables=True)
# To run without dropping the table (default) # To run without dropping the table (default)
setup_embeddings_database() #setup_embeddings_database()
\ No newline at end of file \ No newline at end of file
...@@ -43,8 +43,8 @@ class ChatDatabaseService: ...@@ -43,8 +43,8 @@ class ChatDatabaseService:
if result: if result:
return { return {
'student_id': result['student_id'], 'student_id': result['student_id'],
'student_name': result['student_name'], # Added this line 'student_name': result['student_name'],
'grade': result['grade'], 'grade': result['grade'], # This is now an integer
'is_arabic': result['language'], # Convert language boolean to is_arabic 'is_arabic': result['language'], # Convert language boolean to is_arabic
'nationality': result['nationality'] 'nationality': result['nationality']
} }
...@@ -150,7 +150,7 @@ class ChatDatabaseService: ...@@ -150,7 +150,7 @@ class ChatDatabaseService:
) )
self.conn.commit() self.conn.commit()
def create_student(self, student_id: str, student_name: str, grade: str, def create_student(self, student_id: str, student_name: str, grade: int,
language: bool, nationality: str = 'EGYPTIAN'): language: bool, nationality: str = 'EGYPTIAN'):
"""Create a new student record""" """Create a new student record"""
with self.conn.cursor() as cur: with self.conn.cursor() as cur:
......
...@@ -117,33 +117,18 @@ class PGVectorService: ...@@ -117,33 +117,18 @@ class PGVectorService:
) )
return cur.fetchall() return cur.fetchall()
def get_subjects_by_grade_and_language(self, grade: str, is_arabic: bool) -> List[str]: def get_subjects_by_grade_and_language(self, grade: int, is_arabic: bool) -> List[str]:
"""Get available subjects for a specific grade and language""" """Get available subjects for a specific grade and language"""
with self.conn.cursor(cursor_factory=RealDictCursor) as cur: with self.conn.cursor(cursor_factory=RealDictCursor) as cur:
# Extract numeric part from grade string cur.execute(
grade_number = ''.join(filter(str.isdigit, grade)) if grade else None """
SELECT DISTINCT subject
if grade_number: FROM educational_chunks
cur.execute( WHERE grade = %s AND is_arabic = %s
""" ORDER BY subject;
SELECT DISTINCT subject """,
FROM educational_chunks (grade, is_arabic)
WHERE grade = %s AND is_arabic = %s )
ORDER BY subject;
""",
(int(grade_number), is_arabic)
)
else:
# Fallback if grade parsing fails
cur.execute(
"""
SELECT DISTINCT subject
FROM educational_chunks
WHERE is_arabic = %s
ORDER BY subject;
""",
(is_arabic,)
)
return [row['subject'] for row in cur.fetchall()] return [row['subject'] for row in cur.fetchall()]
def close(self): def close(self):
......
...@@ -187,8 +187,8 @@ ...@@ -187,8 +187,8 @@
<script> <script>
// Configuration // Configuration
const Config = { const Config = {
BACKEND_URL: "http://teamtestingdocker.caprover.al-arcade.com:8000/chat", BACKEND_URL: "http://localhost:8000/chat",
AUDIO_RESPONSE_URL: "http://teamtestingdocker.caprover.al-arcade.com:8000/get-audio-response" AUDIO_RESPONSE_URL: "http://localhost:8000/get-audio-response"
}; };
// Enums // Enums
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment