diff --git a/src/resources.py b/src/resources.py index 8f7a9ae..f77ce4d 100644 --- a/src/resources.py +++ b/src/resources.py @@ -151,10 +151,64 @@ class SampleResource(Resource): Get all stored items :return: """ - with opentracing.tracer.start_active_span('sqlalchemy.select'): - samples = SampleMetadata.query.all() + with opentracing.tracer.start_active_span('compileQuery'): + query = SampleMetadata.query - return self.samplemetadataschema.dump(list(samples)), 200 + ## Compile filters ## + + filters = [] + try: + first = int(request.args.get('first')) + filters.append( + SampleMetadata.id >= first + ) + except ValueError: + first = None + + try: + after = datetime.fromisoformat(request.args.get('after')) + filters.append( + SampleMetadata.timestamp > after + ) + except ValueError: + after = None + + try: + before = datetime.fromisoformat(request.args.get('after')) + filters.append( + SampleMetadata.timestamp < before + ) + except ValueError: + before = None + + if filters: + query = query.filter(db.and_(*filters)) + + try: + limit = int(request.args.get('limit')) + query = query.limit(limit) + except ValueError: + limit = None + + ## Run query ## + count = "count" in request.args.get + tags = { + "first": first, + "limit": limit, + "after": after, + "before": before + } + + if count: + with opentracing.tracer.start_active_span('sqlalchemy.count', tags=tags): + rows = query.count() + + return {"count": rows}, 200 + else: + with opentracing.tracer.start_active_span('sqlalchemy.select', tags=tags): + samples = query.all() + + return self.samplemetadataschema.dump(list(samples)), 200 class SampleParameterResource(Resource):