codebookly / src /app /services /chapter_lookup.py
aymie-oh's picture
initial commit
55d0d9e
"""Shared SQL conditions for resolving a CodesTable row to a Chapters row."""
from typing import Any
from sqlalchemy import cast, Float, or_, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.models import Chapters, CodesTable
def build_chapter_lookup_parts(code_row: CodesTable) -> list[Any]:
parts: list[Any] = []
def add_appendix_match(value: object) -> None:
if value is None:
return
s = str(value).strip()
if not s:
return
parts.append(Chapters.appendix == s)
if s != s.upper():
parts.append(Chapters.appendix == s.upper())
raw_chapter_val = code_row.chapter
if raw_chapter_val is not None and str(raw_chapter_val).strip() != "":
rc = str(raw_chapter_val).strip()
parts.append(Chapters.chapter == rc)
add_appendix_match(rc)
else:
for key in (
code_row.section_code,
code_row.parent_code,
code_row.root_code,
):
add_appendix_match(key)
return parts
async def resolve_chapter_row(
session: AsyncSession, code_row: CodesTable
):
parts = build_chapter_lookup_parts(code_row)
if not parts:
return None
chap_query = select(Chapters).where(or_(*parts))
chap_result = await session.execute(chap_query)
return chap_result.scalar_one_or_none()