Skip to content
Snippets Groups Projects
Commit b959923c authored by Mattia Mancini's avatar Mattia Mancini
Browse files

Merge branch 'sorting' into 'master'

add sort to query

See merge request !1
parents 1c38b077 615046d4
Branches
No related tags found
1 merge request!1add sort to query
...@@ -5,6 +5,7 @@ from datetime import datetime ...@@ -5,6 +5,7 @@ from datetime import datetime
from typing import Union from typing import Union
from fastapi import FastAPI, exceptions, Request from fastapi import FastAPI, exceptions, Request
from pymongo import MongoClient, DESCENDING from pymongo import MongoClient, DESCENDING
from pymongo.collection import Collection from pymongo.collection import Collection
from bson.objectid import ObjectId from bson.objectid import ObjectId
...@@ -116,10 +117,14 @@ class DataProductDB: ...@@ -116,10 +117,14 @@ class DataProductDB:
item = augment_item(item) item = augment_item(item)
return 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}
n_results = self.db[collection_name].count_documents(query)
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 = {} selected_fields = {}
if "additional_files_path" in select or "additional_files_url" in select: if "additional_files_path" in select or "additional_files_url" in select:
...@@ -128,8 +133,15 @@ class DataProductDB: ...@@ -128,8 +133,15 @@ class DataProductDB:
for item in select: for item in select:
selected_fields[item] = 1 selected_fields[item] = 1
# 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 results = [augment_item(item) for item in
self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)] self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)]
quoted_query = urlparse.quote(json.dumps(query)) quoted_query = urlparse.quote(json.dumps(query))
quoted_select = urlparse.quote(json.dumps(select)) quoted_select = urlparse.quote(json.dumps(select))
if url: if url:
...@@ -142,7 +154,6 @@ class DataProductDB: ...@@ -142,7 +154,6 @@ class DataProductDB:
DB = DataProductDB() DB = DataProductDB()
app = FastAPI(default_response_class=ORJSONResponse) app = FastAPI(default_response_class=ORJSONResponse)
def validate_date(date_str): def validate_date(date_str):
date_items = date_str.split('-') date_items = date_str.split('-')
if len(date_items) != 3: if len(date_items) != 3:
...@@ -193,8 +204,25 @@ def get_tasks(collection_name: str, task_id: str, request: Request): ...@@ -193,8 +204,25 @@ def get_tasks(collection_name: str, task_id: str, request: Request):
else: else:
raise exceptions.HTTPException(status_code=404, detail=f'Collection {collection_name} does not exist') raise exceptions.HTTPException(status_code=404, detail=f'Collection {collection_name} does not exist')
@app.get('/{collection_name}/distinct/')
def get_tasks_distinct_field(collection_name: str, request: Request, filter: Union[str, None] = None, distinct: str = None):
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/') @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) DB.base_url = from_urlobj_to_url(request.url)
try: try:
if filter: if filter:
...@@ -208,7 +236,7 @@ def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int ...@@ -208,7 +236,7 @@ def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int
except: except:
raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid') raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid')
if DB.does_collection_exist(collection_name): 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: else:
raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist') raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment