Files
BoostAI/Backend/internal/sqlc/student_answers.sql.go
2026-05-25 17:05:06 +01:00

650 lines
21 KiB
Go

// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
// source: student_answers.sql
package sqlc
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const listAnswersForAssignment = `-- name: ListAnswersForAssignment :many
SELECT id, assignment_id, question_id, student_id, answer_text, ai_feedback, teacher_feedback, status, submitted_at, reviewed_at, created_at, updated_at, solve_mode, working_steps, is_correct, review_needs_attention, review_issue_reason, review_correctness_score, review_understanding_score, review_question_score, review_confidence, review_tags
FROM student_answers
WHERE assignment_id = $1
ORDER BY created_at ASC
`
func (q *Queries) ListAnswersForAssignment(ctx context.Context, assignmentID int64) ([]StudentAnswer, error) {
rows, err := q.db.Query(ctx, listAnswersForAssignment, assignmentID)
if err != nil {
return nil, err
}
defer rows.Close()
items := []StudentAnswer{}
for rows.Next() {
var i StudentAnswer
if err := rows.Scan(
&i.ID,
&i.AssignmentID,
&i.QuestionID,
&i.StudentID,
&i.AnswerText,
&i.AiFeedback,
&i.TeacherFeedback,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.CreatedAt,
&i.UpdatedAt,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listAnswersForStudent = `-- name: ListAnswersForStudent :many
SELECT id, assignment_id, question_id, student_id, answer_text, ai_feedback, teacher_feedback, status, submitted_at, reviewed_at, created_at, updated_at, solve_mode, working_steps, is_correct, review_needs_attention, review_issue_reason, review_correctness_score, review_understanding_score, review_question_score, review_confidence, review_tags
FROM student_answers
WHERE student_id = $1
ORDER BY created_at DESC
`
func (q *Queries) ListAnswersForStudent(ctx context.Context, studentID int64) ([]StudentAnswer, error) {
rows, err := q.db.Query(ctx, listAnswersForStudent, studentID)
if err != nil {
return nil, err
}
defer rows.Close()
items := []StudentAnswer{}
for rows.Next() {
var i StudentAnswer
if err := rows.Scan(
&i.ID,
&i.AssignmentID,
&i.QuestionID,
&i.StudentID,
&i.AnswerText,
&i.AiFeedback,
&i.TeacherFeedback,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.CreatedAt,
&i.UpdatedAt,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listQuestionDetailsForAssignmentStudent = `-- name: ListQuestionDetailsForAssignmentStudent :many
WITH student_question_set AS (
SELECT
asq.assignment_id,
asq.question_id,
asq.position
FROM assignment_student_questions asq
WHERE asq.assignment_id = $1
AND asq.student_id = $2
),
selected_questions AS (
SELECT
sq.assignment_id,
sq.question_id,
sq.position
FROM student_question_set sq
UNION ALL
SELECT
aq.assignment_id,
aq.question_id,
aq.position
FROM assignment_questions aq
WHERE aq.assignment_id = $1
AND NOT EXISTS (SELECT 1 FROM student_question_set)
)
SELECT
aq.assignment_id,
aq.question_id,
aq.position,
q.title,
q.prompt,
q.subject,
q.source,
COALESCE(
ARRAY(
SELECT t.name
FROM question_tags qt
JOIN tags t ON t.id = qt.tag_id
WHERE qt.question_id = aq.question_id
ORDER BY t.name ASC
),
ARRAY[]::TEXT[]
)::TEXT[] AS question_tags,
q.status AS question_status,
q.correct_answer,
aa.ai_feedback AS assignment_ai_feedback,
aa.teacher_feedback AS assignment_teacher_feedback,
review_summary.overall_score,
a.pass_threshold,
aa.next_step_outcome,
aa.pass_status_override,
COALESCE(
aa.pass_status_override,
CASE
WHEN review_summary.overall_score IS NULL THEN 'pending'::assignment_pass_status
WHEN review_summary.overall_score >= a.pass_threshold THEN 'pass'::assignment_pass_status
ELSE 'no_pass'::assignment_pass_status
END
) AS pass_status,
sa.id AS answer_id,
sa.student_id,
sa.answer_text,
sa.solve_mode,
sa.working_steps,
sa.is_correct,
sa.ai_feedback,
sa.teacher_feedback,
sa.status AS answer_status,
sa.review_needs_attention,
sa.review_issue_reason,
sa.review_correctness_score,
sa.review_understanding_score,
sa.review_question_score,
sa.review_confidence,
sa.review_tags,
sa.submitted_at,
sa.reviewed_at,
sa.created_at AS answer_created_at,
sa.updated_at AS answer_updated_at
FROM selected_questions aq
JOIN assignments a ON a.id = aq.assignment_id
JOIN questions q ON q.id = aq.question_id
LEFT JOIN assignment_assignees aa
ON aa.assignment_id = aq.assignment_id
AND aa.student_id = $2
LEFT JOIN LATERAL (
SELECT CASE
WHEN COUNT(sa2.id) = 0 THEN NULL::NUMERIC(5,2)
ELSE ROUND((AVG(
CASE
WHEN sa2.is_correct IS NULL THEN COALESCE(sa2.review_understanding_score, 0)::NUMERIC
ELSE (
((CASE WHEN sa2.is_correct THEN 1 ELSE 0 END)::NUMERIC) + COALESCE(sa2.review_understanding_score, 0)::NUMERIC
) / 2
END
) * 10)::NUMERIC, 2)::NUMERIC(5,2)
END AS overall_score
FROM selected_questions aq2
LEFT JOIN student_answers sa2
ON sa2.assignment_id = aq2.assignment_id
AND sa2.question_id = aq2.question_id
AND sa2.student_id = $2
WHERE aq2.assignment_id = aq.assignment_id
) review_summary ON TRUE
LEFT JOIN student_answers sa
ON sa.assignment_id = aq.assignment_id
AND sa.question_id = aq.question_id
AND sa.student_id = $2
WHERE aq.assignment_id = $1
ORDER BY aq.position ASC, aq.question_id ASC
`
type ListQuestionDetailsForAssignmentStudentParams struct {
AssignmentID int64 `json:"assignment_id"`
StudentID int64 `json:"student_id"`
}
type ListQuestionDetailsForAssignmentStudentRow struct {
AssignmentID int64 `json:"assignment_id"`
QuestionID int64 `json:"question_id"`
Position int32 `json:"position"`
Title string `json:"title"`
Prompt string `json:"prompt"`
Subject pgtype.Text `json:"subject"`
Source pgtype.Text `json:"source"`
QuestionTags []string `json:"question_tags"`
QuestionStatus QuestionStatus `json:"question_status"`
CorrectAnswer pgtype.Text `json:"correct_answer"`
AssignmentAiFeedback pgtype.Text `json:"assignment_ai_feedback"`
AssignmentTeacherFeedback pgtype.Text `json:"assignment_teacher_feedback"`
OverallScore pgtype.Numeric `json:"overall_score"`
PassThreshold pgtype.Numeric `json:"pass_threshold"`
NextStepOutcome NullAssignmentNextStepOutcome `json:"next_step_outcome"`
PassStatusOverride NullAssignmentPassStatus `json:"pass_status_override"`
PassStatus NullAssignmentPassStatus `json:"pass_status"`
AnswerID pgtype.Int8 `json:"answer_id"`
StudentID pgtype.Int8 `json:"student_id"`
AnswerText pgtype.Text `json:"answer_text"`
SolveMode pgtype.Text `json:"solve_mode"`
WorkingSteps pgtype.Text `json:"working_steps"`
IsCorrect pgtype.Bool `json:"is_correct"`
AiFeedback pgtype.Text `json:"ai_feedback"`
TeacherFeedback pgtype.Text `json:"teacher_feedback"`
AnswerStatus NullAnswerStatus `json:"answer_status"`
ReviewNeedsAttention pgtype.Bool `json:"review_needs_attention"`
ReviewIssueReason pgtype.Text `json:"review_issue_reason"`
ReviewCorrectnessScore pgtype.Numeric `json:"review_correctness_score"`
ReviewUnderstandingScore pgtype.Numeric `json:"review_understanding_score"`
ReviewQuestionScore pgtype.Numeric `json:"review_question_score"`
ReviewConfidence pgtype.Numeric `json:"review_confidence"`
ReviewTags []string `json:"review_tags"`
SubmittedAt pgtype.Timestamptz `json:"submitted_at"`
ReviewedAt pgtype.Timestamptz `json:"reviewed_at"`
AnswerCreatedAt pgtype.Timestamptz `json:"answer_created_at"`
AnswerUpdatedAt pgtype.Timestamptz `json:"answer_updated_at"`
}
func (q *Queries) ListQuestionDetailsForAssignmentStudent(ctx context.Context, arg ListQuestionDetailsForAssignmentStudentParams) ([]ListQuestionDetailsForAssignmentStudentRow, error) {
rows, err := q.db.Query(ctx, listQuestionDetailsForAssignmentStudent, arg.AssignmentID, arg.StudentID)
if err != nil {
return nil, err
}
defer rows.Close()
items := []ListQuestionDetailsForAssignmentStudentRow{}
for rows.Next() {
var i ListQuestionDetailsForAssignmentStudentRow
if err := rows.Scan(
&i.AssignmentID,
&i.QuestionID,
&i.Position,
&i.Title,
&i.Prompt,
&i.Subject,
&i.Source,
&i.QuestionTags,
&i.QuestionStatus,
&i.CorrectAnswer,
&i.AssignmentAiFeedback,
&i.AssignmentTeacherFeedback,
&i.OverallScore,
&i.PassThreshold,
&i.NextStepOutcome,
&i.PassStatusOverride,
&i.PassStatus,
&i.AnswerID,
&i.StudentID,
&i.AnswerText,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.AiFeedback,
&i.TeacherFeedback,
&i.AnswerStatus,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
&i.SubmittedAt,
&i.ReviewedAt,
&i.AnswerCreatedAt,
&i.AnswerUpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const listStudentPlanningPerformance = `-- name: ListStudentPlanningPerformance :many
SELECT
sa.assignment_id,
sa.question_id,
q.topic,
q.subject,
q.difficulty,
COALESCE(
ARRAY(
SELECT t.name
FROM question_tags qt
JOIN tags t ON t.id = qt.tag_id
WHERE qt.question_id = sa.question_id
ORDER BY t.name ASC
),
ARRAY[]::TEXT[]
)::TEXT[] AS question_tags,
sa.is_correct,
sa.review_understanding_score,
sa.review_needs_attention,
sa.review_issue_reason,
sa.status,
sa.submitted_at,
sa.reviewed_at,
sa.updated_at
FROM student_answers sa
JOIN questions q ON q.id = sa.question_id
WHERE sa.student_id = $1
AND sa.status IN ('submitted'::answer_status, 'reviewed'::answer_status)
ORDER BY COALESCE(sa.reviewed_at, sa.submitted_at, sa.updated_at) DESC, sa.id DESC
`
type ListStudentPlanningPerformanceRow struct {
AssignmentID int64 `json:"assignment_id"`
QuestionID int64 `json:"question_id"`
Topic NullQuestionTopic `json:"topic"`
Subject pgtype.Text `json:"subject"`
Difficulty NullQuestionDifficulty `json:"difficulty"`
QuestionTags []string `json:"question_tags"`
IsCorrect pgtype.Bool `json:"is_correct"`
ReviewUnderstandingScore pgtype.Numeric `json:"review_understanding_score"`
ReviewNeedsAttention bool `json:"review_needs_attention"`
ReviewIssueReason pgtype.Text `json:"review_issue_reason"`
Status AnswerStatus `json:"status"`
SubmittedAt pgtype.Timestamptz `json:"submitted_at"`
ReviewedAt pgtype.Timestamptz `json:"reviewed_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
func (q *Queries) ListStudentPlanningPerformance(ctx context.Context, studentID int64) ([]ListStudentPlanningPerformanceRow, error) {
rows, err := q.db.Query(ctx, listStudentPlanningPerformance, studentID)
if err != nil {
return nil, err
}
defer rows.Close()
items := []ListStudentPlanningPerformanceRow{}
for rows.Next() {
var i ListStudentPlanningPerformanceRow
if err := rows.Scan(
&i.AssignmentID,
&i.QuestionID,
&i.Topic,
&i.Subject,
&i.Difficulty,
&i.QuestionTags,
&i.IsCorrect,
&i.ReviewUnderstandingScore,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.UpdatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const updateAnswerAIReview = `-- name: UpdateAnswerAIReview :one
UPDATE student_answers
SET
ai_feedback = $2,
review_needs_attention = $3,
review_issue_reason = $4,
review_correctness_score = $5,
review_understanding_score = $6,
review_question_score = $7,
review_confidence = $8,
updated_at = NOW()
WHERE id = $1
RETURNING id, assignment_id, question_id, student_id, answer_text, ai_feedback, teacher_feedback, status, submitted_at, reviewed_at, created_at, updated_at, solve_mode, working_steps, is_correct, review_needs_attention, review_issue_reason, review_correctness_score, review_understanding_score, review_question_score, review_confidence, review_tags
`
type UpdateAnswerAIReviewParams struct {
ID int64 `json:"id"`
AiFeedback pgtype.Text `json:"ai_feedback"`
ReviewNeedsAttention bool `json:"review_needs_attention"`
ReviewIssueReason pgtype.Text `json:"review_issue_reason"`
ReviewCorrectnessScore pgtype.Numeric `json:"review_correctness_score"`
ReviewUnderstandingScore pgtype.Numeric `json:"review_understanding_score"`
ReviewQuestionScore pgtype.Numeric `json:"review_question_score"`
ReviewConfidence pgtype.Numeric `json:"review_confidence"`
}
func (q *Queries) UpdateAnswerAIReview(ctx context.Context, arg UpdateAnswerAIReviewParams) (StudentAnswer, error) {
row := q.db.QueryRow(ctx, updateAnswerAIReview,
arg.ID,
arg.AiFeedback,
arg.ReviewNeedsAttention,
arg.ReviewIssueReason,
arg.ReviewCorrectnessScore,
arg.ReviewUnderstandingScore,
arg.ReviewQuestionScore,
arg.ReviewConfidence,
)
var i StudentAnswer
err := row.Scan(
&i.ID,
&i.AssignmentID,
&i.QuestionID,
&i.StudentID,
&i.AnswerText,
&i.AiFeedback,
&i.TeacherFeedback,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.CreatedAt,
&i.UpdatedAt,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
)
return i, err
}
const updateAnswerReview = `-- name: UpdateAnswerReview :one
UPDATE student_answers
SET
status = $2,
review_needs_attention = $3,
review_issue_reason = $4,
review_correctness_score = $5,
review_understanding_score = $6,
review_question_score = $7,
review_confidence = $8,
review_tags = $9,
reviewed_at = CASE
WHEN $2::answer_status = 'reviewed' THEN NOW()
ELSE NULL
END,
updated_at = NOW()
WHERE id = $1
RETURNING id, assignment_id, question_id, student_id, answer_text, ai_feedback, teacher_feedback, status, submitted_at, reviewed_at, created_at, updated_at, solve_mode, working_steps, is_correct, review_needs_attention, review_issue_reason, review_correctness_score, review_understanding_score, review_question_score, review_confidence, review_tags
`
type UpdateAnswerReviewParams struct {
ID int64 `json:"id"`
Status AnswerStatus `json:"status"`
ReviewNeedsAttention bool `json:"review_needs_attention"`
ReviewIssueReason pgtype.Text `json:"review_issue_reason"`
ReviewCorrectnessScore pgtype.Numeric `json:"review_correctness_score"`
ReviewUnderstandingScore pgtype.Numeric `json:"review_understanding_score"`
ReviewQuestionScore pgtype.Numeric `json:"review_question_score"`
ReviewConfidence pgtype.Numeric `json:"review_confidence"`
ReviewTags []string `json:"review_tags"`
}
func (q *Queries) UpdateAnswerReview(ctx context.Context, arg UpdateAnswerReviewParams) (StudentAnswer, error) {
row := q.db.QueryRow(ctx, updateAnswerReview,
arg.ID,
arg.Status,
arg.ReviewNeedsAttention,
arg.ReviewIssueReason,
arg.ReviewCorrectnessScore,
arg.ReviewUnderstandingScore,
arg.ReviewQuestionScore,
arg.ReviewConfidence,
arg.ReviewTags,
)
var i StudentAnswer
err := row.Scan(
&i.ID,
&i.AssignmentID,
&i.QuestionID,
&i.StudentID,
&i.AnswerText,
&i.AiFeedback,
&i.TeacherFeedback,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.CreatedAt,
&i.UpdatedAt,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
)
return i, err
}
const upsertStudentAnswer = `-- name: UpsertStudentAnswer :one
INSERT INTO student_answers (
assignment_id,
question_id,
student_id,
answer_text,
solve_mode,
working_steps,
ai_feedback,
teacher_feedback,
status,
submitted_at,
reviewed_at,
is_correct
) VALUES (
$1,
$2,
$3,
$4,
$5,
$6,
$7,
$8,
$9,
$10,
$11,
$12
)
ON CONFLICT (assignment_id, question_id, student_id) DO UPDATE
SET
answer_text = EXCLUDED.answer_text,
solve_mode = EXCLUDED.solve_mode,
working_steps = EXCLUDED.working_steps,
ai_feedback = EXCLUDED.ai_feedback,
teacher_feedback = EXCLUDED.teacher_feedback,
status = EXCLUDED.status,
submitted_at = EXCLUDED.submitted_at,
reviewed_at = EXCLUDED.reviewed_at,
is_correct = EXCLUDED.is_correct,
updated_at = NOW()
RETURNING id, assignment_id, question_id, student_id, answer_text, ai_feedback, teacher_feedback, status, submitted_at, reviewed_at, created_at, updated_at, solve_mode, working_steps, is_correct, review_needs_attention, review_issue_reason, review_correctness_score, review_understanding_score, review_question_score, review_confidence, review_tags
`
type UpsertStudentAnswerParams struct {
AssignmentID int64 `json:"assignment_id"`
QuestionID int64 `json:"question_id"`
StudentID int64 `json:"student_id"`
AnswerText pgtype.Text `json:"answer_text"`
SolveMode string `json:"solve_mode"`
WorkingSteps pgtype.Text `json:"working_steps"`
AiFeedback pgtype.Text `json:"ai_feedback"`
TeacherFeedback pgtype.Text `json:"teacher_feedback"`
Status AnswerStatus `json:"status"`
SubmittedAt pgtype.Timestamptz `json:"submitted_at"`
ReviewedAt pgtype.Timestamptz `json:"reviewed_at"`
IsCorrect pgtype.Bool `json:"is_correct"`
}
func (q *Queries) UpsertStudentAnswer(ctx context.Context, arg UpsertStudentAnswerParams) (StudentAnswer, error) {
row := q.db.QueryRow(ctx, upsertStudentAnswer,
arg.AssignmentID,
arg.QuestionID,
arg.StudentID,
arg.AnswerText,
arg.SolveMode,
arg.WorkingSteps,
arg.AiFeedback,
arg.TeacherFeedback,
arg.Status,
arg.SubmittedAt,
arg.ReviewedAt,
arg.IsCorrect,
)
var i StudentAnswer
err := row.Scan(
&i.ID,
&i.AssignmentID,
&i.QuestionID,
&i.StudentID,
&i.AnswerText,
&i.AiFeedback,
&i.TeacherFeedback,
&i.Status,
&i.SubmittedAt,
&i.ReviewedAt,
&i.CreatedAt,
&i.UpdatedAt,
&i.SolveMode,
&i.WorkingSteps,
&i.IsCorrect,
&i.ReviewNeedsAttention,
&i.ReviewIssueReason,
&i.ReviewCorrectnessScore,
&i.ReviewUnderstandingScore,
&i.ReviewQuestionScore,
&i.ReviewConfidence,
&i.ReviewTags,
)
return i, err
}