feat(patterns): pattern taxonomy + is_optimal

This commit is contained in:
2025-09-08 16:03:14 +01:00
parent 5b768f6a21
commit 13bab63618
28 changed files with 1434 additions and 26 deletions

View File

@@ -7,6 +7,7 @@ from pathlib import Path
from typing import Any
import yaml
import sqlalchemy as sa
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
@@ -16,6 +17,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent))
from src.db.database import async_session_factory
from src.models import Category, Difficulty, Explanation, Pattern, Question, Solution
from src.models.question import QuestionPattern
async def load_categories(session: AsyncSession, data_dir: Path) -> dict[str, Category]:
@@ -133,6 +135,10 @@ async def _upsert_pattern(session: AsyncSession, item: dict[str, Any]) -> Patter
# Interactive visualization examples
pattern.visualization_examples = item.get("visualization_examples")
# Pattern classification
pattern.pattern_type = item.get("pattern_type")
pattern.display_order = item.get("display_order")
return pattern
@@ -190,10 +196,31 @@ async def load_question(
categories[cat_slug] for cat_slug in data.get("categories", []) if cat_slug in categories
]
# Link patterns
question.patterns = [
patterns[pat_slug] for pat_slug in data.get("patterns", []) if pat_slug in patterns
]
# Clear existing pattern links to handle is_optimal changes
await session.execute(
sa.delete(QuestionPattern).where(QuestionPattern.question_id == question.id)
)
await session.flush()
# Link patterns with is_optimal support
for pat_entry in data.get("patterns", []):
# Support both formats:
# Old: "heap" (string)
# New: {slug: "heap", is_optimal: true} (dict)
if isinstance(pat_entry, str):
pat_slug = pat_entry
is_optimal = False
else:
pat_slug = pat_entry["slug"]
is_optimal = pat_entry.get("is_optimal", False)
if pat_slug in patterns:
link = QuestionPattern(
question_id=question.id,
pattern_id=patterns[pat_slug].id,
is_optimal=is_optimal,
)
session.add(link)
await session.flush()