Skip to content
Snippets Groups Projects

add sort to query

Merged
Nico Vermaasrequested to merge
sorting into master
1 open thread
1 file
+ 35
7
Compare changes
  • Side-by-side
  • Inline
+ 35
7
@@ -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}
 
 
 
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)
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
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_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)
Please register or sign in to reply
 
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')
Loading