diff --git a/python/valis/db/models.py b/python/valis/db/models.py index edc9680..f56035f 100644 --- a/python/valis/db/models.py +++ b/python/valis/db/models.py @@ -8,6 +8,7 @@ import math from typing import Optional, Annotated, Any, TypeVar from pydantic import ConfigDict, BaseModel, Field, BeforeValidator +from enum import Enum def coerce_nan_to_none(x: Any) -> Any: @@ -228,3 +229,10 @@ class DbMetadata(PeeweeBase): description: str = Field(..., description='a description of the database column') unit: Optional[str] = Field(None, description='the unit if any for the database column') sql_type: Optional[str] = Field(None, description='the data type of the column') + + +class MapperName(str, Enum): + """Mapper names""" + MWM: str = 'MWM' + BHM: str = 'BHM' + LVM: str = 'LVM' \ No newline at end of file diff --git a/python/valis/db/queries.py b/python/valis/db/queries.py index 1274d88..c539306 100644 --- a/python/valis/db/queries.py +++ b/python/valis/db/queries.py @@ -18,6 +18,7 @@ from sdssdb.peewee.sdss5db import astradb as astra +from valis.db.models import MapperName from valis.io.spectra import extract_data, get_product_model from valis.utils.paths import build_boss_path, build_apogee_path, build_astra_path from valis.utils.versions import get_software_tag @@ -719,6 +720,44 @@ def get_db_metadata(schema: str = None) -> peewee.ModelSelect: return query +def get_paged_target_list_by_mapper(mapper: MapperName = MapperName.MWM, page_number: int = 1, items_per_page: int = 10) -> peewee.ModelSelect: + """ Return a paged list of target rows, based on the mapper. + + Return paginated and ordered target rows (of a particular mapper) + from the vizdb.SDSSidStacked table, + using the peewee ORM. We return the peewee ModelSelect + directly here so it can be easily combined with other queries, + if needed. + + Parameters + ---------- + mapper : MapperName + Enum denoting the mapper name. + page_number : int + Page number of the returned target rows. + items_per_page : int + Number of target rows displayed in the page. + + Returns + ------- + peewee.ModelSelect + the ORM query + """ + + if mapper is MapperName.MWM: + where_condition = vizdb.SDSSidToPipes.in_apogee == True + elif mapper is MapperName.BHM: + where_condition = vizdb.SDSSidToPipes.in_boss == True + else: + where_condition = False + + return vizdb.SDSSidStacked.select()\ + .join(vizdb.SDSSidToPipes, on = (vizdb.SDSSidStacked.sdss_id == vizdb.SDSSidToPipes.sdss_id))\ + .where(where_condition)\ + .order_by(vizdb.SDSSidStacked.sdss_id)\ + .paginate(page_number, items_per_page) + + def starfields(model: peewee.ModelSelect) -> peewee.NodeList: """ Return the peewee star fields diff --git a/python/valis/routes/query.py b/python/valis/routes/query.py index 8d53a5b..13675b4 100644 --- a/python/valis/routes/query.py +++ b/python/valis/routes/query.py @@ -10,11 +10,11 @@ from valis.routes.base import Base from valis.db.db import get_pw_db -from valis.db.models import SDSSidStackedBase, SDSSidPipesBase +from valis.db.models import SDSSidStackedBase, SDSSidPipesBase, MapperName from valis.db.queries import (cone_search, append_pipes, carton_program_search, carton_program_list, carton_program_map, get_targets_by_sdss_id, get_targets_by_catalog_id, - get_targets_obs) + get_targets_obs, get_paged_target_list_by_mapper) from sdssdb.peewee.sdss5db import database # convert string floats to proper floats @@ -191,3 +191,13 @@ async def obs(self, """ Perform a search on carton or program """ return list(get_targets_obs(release, obs, spectrograph)) + + @router.get('/mapper', summary='Perform a search for SDSS targets based on the mapper', + response_model=List[SDSSidStackedBase], dependencies=[Depends(get_pw_db)]) + async def get_target_list_by_mapper(self, + mapper: Annotated[MapperName, Query(description='Mapper name', example=MapperName.MWM)] = MapperName.MWM, + page_number: Annotated[int, Query(description='Page number of the returned items', gt=0, example=1)] = 1, + items_per_page: Annotated[int, Query(description='Number of items displayed in a page', gt=0, example=10)] = 10): + """ Return an ordered and paged list of targets based on the mapper.""" + targets = get_paged_target_list_by_mapper(mapper, page_number, items_per_page) + return list(targets)