From ab2d9426c508f400e3d57051babbee2b0d2d8c4e Mon Sep 17 00:00:00 2001 From: mtaghiza Date: Wed, 13 Mar 2024 06:53:09 -0400 Subject: [PATCH] Clean up and use enum mapper names. --- python/valis/db/models.py | 9 ++++++- python/valis/db/queries.py | 50 +++++++++++------------------------- python/valis/routes/query.py | 18 ++++--------- 3 files changed, 28 insertions(+), 49 deletions(-) diff --git a/python/valis/db/models.py b/python/valis/db/models.py index 28de540..94e52db 100644 --- a/python/valis/db/models.py +++ b/python/valis/db/models.py @@ -7,7 +7,7 @@ import datetime from typing import Optional from pydantic import ConfigDict, BaseModel, Field - +from enum import Enum # for how to specify required, optional, default, etc, see # https://docs.pydantic.dev/latest/migration/#required-optional-and-nullable-fields @@ -143,3 +143,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 f862f6e..4df2b41 100644 --- a/python/valis/db/queries.py +++ b/python/valis/db/queries.py @@ -16,6 +16,7 @@ from sdssdb.peewee.sdss5db import catalogdb as cat +from valis.db.models import MapperName from valis.io.spectra import extract_data from valis.utils.paths import build_boss_path from valis.utils.versions import get_software_tag @@ -499,7 +500,7 @@ def get_db_metadata(schema: str = None) -> peewee.ModelSelect: query = query.where(vizdb.DbMetadata.schema == schema) return query -def get_paged_target_list_by_mapper(mapper: Union[str, int] = "MWM", page_number: int = 1, items_per_page: int = 10) -> peewee.ModelSelect: +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) @@ -510,8 +511,8 @@ def get_paged_target_list_by_mapper(mapper: Union[str, int] = "MWM", page_number Parameters ---------- - mapper : Union[str, int] - label or integer id (pk) of the mapper from targetdb.Mapper table. + mapper : MapperName + Enum denoting the mapper name. page_number : int Page number of the returned target rows. items_per_page : int @@ -522,37 +523,16 @@ def get_paged_target_list_by_mapper(mapper: Union[str, int] = "MWM", page_number peewee.ModelSelect the ORM query """ - - where_condition = targetdb.Mapper.pk == mapper if type(mapper) == int else targetdb.Mapper.label == mapper + + 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()\ - .where(\ - vizdb.SDSSidStacked.sdss_id.in_(\ - vizdb.SDSSidFlat.select(vizdb.SDSSidFlat.sdss_id)\ - .join(targetdb.Target, \ - on=(vizdb.SDSSidFlat.catalogid == targetdb.Target.catalogid))\ - .join(targetdb.CartonToTarget, \ - on=(targetdb.Target.pk == targetdb.CartonToTarget.target))\ - .join(targetdb.Carton, \ - on=(targetdb.Carton.pk == targetdb.CartonToTarget.carton))\ - .join(targetdb.Mapper, - on=(targetdb.Mapper.pk == targetdb.Carton.mapper))\ - .where(where_condition)\ - .order_by(vizdb.SDSSidFlat.sdss_id)\ - .paginate(page_number, items_per_page)\ - )\ - )\ - .order_by(vizdb.SDSSidStacked.sdss_id) - -def get_mappers() -> peewee.ModelSelect: - """Return the list of all mapper names. - - Return the list of all mapper name labels and their asscociated IDs, - using the peewee ORM. We return the peewee ModelSelect. - - Returns - ------- - peewee.ModelSelect - the ORM query - """ - return targetdb.Mapper.select().order_by(targetdb.Mapper.pk) \ No newline at end of file + .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) diff --git a/python/valis/routes/query.py b/python/valis/routes/query.py index 45c2b05..e64012b 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_mappers, get_paged_target_list_by_mapper) + get_paged_target_list_by_mapper) # convert string floats to proper floats Float = Annotated[Union[float, str], BeforeValidator(lambda x: float(x) if x and isinstance(x, str) else x)] @@ -156,12 +156,6 @@ async def program_map(self): return carton_program_map() - @router.get('/list/mappers', summary='Return list of all mappers', - response_model=List[Mapper], dependencies=[Depends(get_pw_db)]) - async def get_mappers_list(self): - """ Return a list of all mappers """ - return list(get_mappers()) - @router.get('/carton-program', summary='Search for all SDSS targets within a carton or program', response_model=List[SDSSidStackedBase], dependencies=[Depends(get_pw_db)]) async def carton_program(self, @@ -176,11 +170,9 @@ async def carton_program(self, @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: str = Query(default="MWM", description='String (integer) that identifies the name label (id/primary key) of the mapper', example="MWM"), - page_number: int = Query(..., description='Page number of the returned items', gt=0, example=1), - items_per_page: int = Query(..., description='Number of items displayed in a page', gt=0, example=10)): + async def get_target_list_by_mapper(self, mapper: MapperName = Query(default=MapperName.MWM, description='Mapper name', example=MapperName.MWM), + page_number: int = Query(description='Page number of the returned items', gt=0, example=1), + items_per_page: int = Query(description='Number of items displayed in a page', gt=0, example=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) - -