Skip to content
Snippets Groups Projects

add sort to query

Merged
Nico Vermaasrequested to merge
sorting into master
1 open thread
+ 48
6
@@ -5,6 +5,8 @@ from datetime import datetime
from typing import Union
from fastapi import FastAPI, exceptions, Request
from fastapi.middleware.cors import CORSMiddleware
from pymongo import MongoClient, DESCENDING
from pymongo.collection import Collection
from bson.objectid import ObjectId
@@ -116,10 +118,14 @@ class DataProductDB:
item = augment_item(item)
return item
def get_items(self, collection_name, query, skip=0, limit=100, url=None, select=None):
def get_distinct_field(self, collection_name, query, distinct=None):
results = self.db[collection_name].find(query,distinct).distinct(distinct)
return {'results': results}
def get_items(self, collection_name, query, skip=0, limit=100, url=None, select=None, sort=None):
n_results = self.db[collection_name].count_documents(query)
selected_fields = {}
if "additional_files_path" in select or "additional_files_url" in select:
@@ -128,8 +134,15 @@ class DataProductDB:
for item in select:
selected_fields[item] = 1
results = [augment_item(item) for item in
self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)]
# if a &sort=<field> url parameter is given then use sort, otherwise omit it (backward compatibility)
if sort:
results = [augment_item(item) for item in
self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit).sort(sort)]
else:
results = [augment_item(item) for item in
self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)]
quoted_query = urlparse.quote(json.dumps(query))
quoted_select = urlparse.quote(json.dumps(select))
if url:
@@ -142,6 +155,18 @@ class DataProductDB:
DB = DataProductDB()
app = FastAPI(default_response_class=ORJSONResponse)
origins = [
"http://localhost:5173",
"http://localhost:8001",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def validate_date(date_str):
date_items = date_str.split('-')
@@ -193,8 +218,25 @@ def get_tasks(collection_name: str, task_id: str, request: Request):
else:
raise exceptions.HTTPException(status_code=404, detail=f'Collection {collection_name} does not exist')
@app.get('/{collection_name}/distinct_field/')
def get_tasks_distinct_field(collection_name: str, request: Request, filter: Union[str, None] = None, distinct: str = None):
print(filter)
DB.base_url = from_urlobj_to_url(request.url)
try:
if filter:
query = json.loads(filter)
else:
query = {}
except:
raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid')
if DB.does_collection_exist(collection_name):
return DB.get_distinct_field(collection_name, query=query, distinct=distinct)
else:
raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist')
@app.get('/{collection_name}/tasks/')
def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int = 100, filter: Union[str, None] = None, select: Union[str, None] = None):
def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int = 100, filter: Union[str, None] = None, select: Union[str, None] = None, sort: str = None):
DB.base_url = from_urlobj_to_url(request.url)
try:
if filter:
@@ -208,7 +250,7 @@ def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int
except:
raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid')
if DB.does_collection_exist(collection_name):
return DB.get_items(collection_name, query=query, limit=limit, skip=skip, url=from_urlobj_to_url(request.url), select=select)
return DB.get_items(collection_name, query=query, limit=limit, skip=skip, url=from_urlobj_to_url(request.url), select=select, sort=sort)
else:
raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist')
Loading