feat(patterns): pattern taxonomy + is_optimal
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user