From 6705d78551bfd7a9b402b6f537365bd6d5adf84a Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Wed, 5 Aug 2020 12:17:01 -0500 Subject: [PATCH 1/5] optimize row count --- stac_api/clients/collection_crud.py | 8 +++++--- stac_api/clients/item_crud.py | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/stac_api/clients/collection_crud.py b/stac_api/clients/collection_crud.py index fa1456083..addd09e38 100644 --- a/stac_api/clients/collection_crud.py +++ b/stac_api/clients/collection_crud.py @@ -4,6 +4,7 @@ from fastapi import Depends from sqlalchemy.orm import Session +from sqlalchemy.sql import func from sqlakeyset import get_page, Page from .base_crud import BaseCrudClient @@ -34,14 +35,15 @@ def get_item_collection( ) -> Tuple[Page, int]: """Read an item collection from the database""" try: - collection_children = ( + query = ( self.lookup_id(collection_id) .first() .children.order_by(database.Item.datetime.desc(), database.Item.id) ) - count = collection_children.count() + count_query = query.statement.with_only_columns([func.count()]).order_by(None) + count = query.session.execute(count_query).scalar() token = self.pagination_client.get(token) if token else token - page = get_page(collection_children, per_page=limit, page=(token or False)) + page = get_page(query, per_page=limit, page=(token or False)) # Create dynamic attributes for each page page.next = ( self.pagination_client.insert(keyset=page.paging.bookmark_next) diff --git a/stac_api/clients/item_crud.py b/stac_api/clients/item_crud.py index 385d8dac4..0fffb1d94 100644 --- a/stac_api/clients/item_crud.py +++ b/stac_api/clients/item_crud.py @@ -6,6 +6,7 @@ import geoalchemy2 as ga import sqlalchemy as sa from sqlalchemy.orm import Session +from sqlalchemy.sql import func from sqlakeyset import get_page, Page from .base_crud import BaseCrudClient @@ -110,7 +111,8 @@ def stac_search(self, search_request: schemas.STACSearch) -> Tuple[Page, int]: query = query.filter(op.operator(field, value)) try: - count = query.count() + count_query = query.statement.with_only_columns([func.count()]).order_by(None) + count = query.session.execute(count_query).scalar() page = get_page(query, per_page=search_request.limit, page=token) # Create dynamic attributes for each page page.next = ( From e9cae66960b46852b11d63a859585dd260f2cd45 Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Wed, 5 Aug 2020 12:39:37 -0500 Subject: [PATCH 2/5] update landing page --- stac_api/resources/conformance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stac_api/resources/conformance.py b/stac_api/resources/conformance.py index 7889c94b2..67d7c0511 100644 --- a/stac_api/resources/conformance.py +++ b/stac_api/resources/conformance.py @@ -19,7 +19,7 @@ def landing_page( ): resp = LandingPage( title="Arturo STAC API", - description="Arturo raster datastore", + description="Arturo STAC API", links=[ Link(rel=Relations.self, type=MimeTypes.json, href=base_url), Link( From a9cf179299377bc4b1ffac44cb2ea90adc6a58fa Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Wed, 5 Aug 2020 12:41:06 -0500 Subject: [PATCH 3/5] remove cloudfront_ttl and token params --- stac_api/resources/item.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/stac_api/resources/item.py b/stac_api/resources/item.py index 46e3c912f..cc826c074 100644 --- a/stac_api/resources/item.py +++ b/stac_api/resources/item.py @@ -296,9 +296,7 @@ def search_items_get( datetime: Optional[Union[str, datetime]] = Query(None), limit: Optional[int] = Query(10), query: Optional[str] = Query(None), - token: Optional[str] = None, fields: Optional[List[str]] = Depends(parse_list_factory("fields")), - cloudfront_ttl: Optional[int] = 2628000, sortby: Optional[str] = Depends(parse_list_factory("sortby")), crud_client: ItemCrudClient = Depends(item_crud_client_factory), base_url: str = Depends(discover_base_url), @@ -309,8 +307,6 @@ def search_items_get( "ids": ids, "bbox": bbox, "limit": limit, - "token": token, - "cloudfront_ttl": cloudfront_ttl, "query": json.loads(query) if query else query, } if datetime: From 6d391d26ed2c89168bdce48207c2f7face57d1fd Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Wed, 5 Aug 2020 12:42:29 -0500 Subject: [PATCH 4/5] oops --- stac_api/resources/item.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stac_api/resources/item.py b/stac_api/resources/item.py index cc826c074..67bcaa640 100644 --- a/stac_api/resources/item.py +++ b/stac_api/resources/item.py @@ -296,6 +296,7 @@ def search_items_get( datetime: Optional[Union[str, datetime]] = Query(None), limit: Optional[int] = Query(10), query: Optional[str] = Query(None), + token: Optional[str] = None, fields: Optional[List[str]] = Depends(parse_list_factory("fields")), sortby: Optional[str] = Depends(parse_list_factory("sortby")), crud_client: ItemCrudClient = Depends(item_crud_client_factory), @@ -307,6 +308,7 @@ def search_items_get( "ids": ids, "bbox": bbox, "limit": limit, + "token": token, "query": json.loads(query) if query else query, } if datetime: From cc34e25527e8d506416b6ad351a3f65c0242a521 Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Wed, 5 Aug 2020 15:33:23 -0500 Subject: [PATCH 5/5] add intermediary stac router --- stac_api/app.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/stac_api/app.py b/stac_api/app.py index ebd940a5f..7354726c9 100644 --- a/stac_api/app.py +++ b/stac_api/app.py @@ -1,4 +1,4 @@ -from fastapi import FastAPI +from fastapi import FastAPI, APIRouter from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker @@ -9,11 +9,14 @@ app = FastAPI() app.debug = settings.DEBUG -app.include_router(mgmt.router) -app.include_router(conformance.router) -app.include_router(collection.router) -app.include_router(item.router) +stac_router = APIRouter() +stac_router.include_router(conformance.router) +stac_router.include_router(collection.router) +stac_router.include_router(item.router) + +app.include_router(mgmt.router) +app.include_router(stac_router) @app.on_event("startup") async def on_startup():