diff --git a/server/api/routes/search.py b/server/api/routes/search.py index 8fed1dc2284d17d2983ec322ef3767e231ce64f8..087108cf509514a4abaed5bc8d4c17c0c533dc66 100644 --- a/server/api/routes/search.py +++ b/server/api/routes/search.py @@ -1,6 +1,8 @@ from typing import TYPE_CHECKING import httpx +from nacsos_data.db.crud.items.lexis_nexis import lexis_orm_to_model +from nacsos_data.db.schemas import Project, ItemType from pydantic import BaseModel from fastapi import APIRouter, Depends import sqlalchemy.sql.functions as func @@ -8,8 +10,9 @@ import sqlalchemy.sql.functions as func from nacsos_data.util.academic.openalex import query_async, SearchResult from nacsos_data.db.crud.items import Query from nacsos_data.db.crud.items.query.parse import GRAMMAR -from nacsos_data.models.items import AcademicItemModel +from nacsos_data.models.items import AcademicItemModel, FullLexisNexisItemModel from nacsos_data.models.openalex.solr import SearchField, DefType, OpType +from sqlalchemy import select from server.util.security import UserPermissionChecker, UserPermissions from server.util.logging import get_logger @@ -89,20 +92,34 @@ async def nql_grammar() -> str: class QueryResult(BaseModel): n_docs: int - docs: list[AcademicItemModel] + docs: list[AcademicItemModel] | list[FullLexisNexisItemModel] @router.get('/nql/query', response_model=QueryResult) async def nql_query(query: str, + page: int = 1, limit: int = 20, permissions: UserPermissions = Depends(UserPermissionChecker('dataset_read'))) -> QueryResult: - q = Query(query, project_id=permissions.permissions.project_id) - async with db_engine.session() as session: # type: AsyncSession + project_id = permissions.permissions.project_id + project_type = (await session.scalar(select(Project.type).where(Project.project_id == project_id))) + q = Query(query, project_id=project_id, project_type=project_type) + stmt = q.stmt.subquery() cnt_stmt = func.count(stmt.c.item_id) + + if project_type == ItemType.academic: + docs = [AcademicItemModel.model_validate(item.__dict__) + for item in (await session.execute(q.stmt + .offset((page - 1) * limit) + .limit(limit))).scalars().all()] + elif project_type == ItemType.lexis: + docs = lexis_orm_to_model((await session.execute(q.stmt + .offset((page - 1) * limit) + .limit(limit))).mappings().all()) + else: + raise NotImplementedError() return QueryResult( n_docs=(await session.execute(cnt_stmt)).scalar(), # type: ignore[arg-type] - docs=[AcademicItemModel.model_validate(item.__dict__) - for item in (await session.execute(q.stmt.limit(limit))).scalars().all()] + docs=docs )