-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
When passing parameters to a route, you have to specify what fields that they should map to within your model. These are then joined by an OR statement for each parameter. I was unsuccessful getting this to work and it may be worthwhile visiting in the future. Alternatively, we can add a step that maps parameter values based on aliases.
The in progress code was this, under app/blueprints/main/handlers.py within the BaseHandler class.
@classmethod
def apply_filters(cls, query: Query, parameters: ImmutableMultiDict) -> Query:
filter_map = {
'biomarker_type': [models.Biomarkers.biomarker_type],
'biomarker': [models.Biomarkers.name],
'gene': [models.Genes.name, models.Codings.id],
'disease': [models.Diseases.name, models.Codings.id],
'therapy': [models.Therapies.name, models.Codings.id]
}
parameter_filters = []
filter_criteria = parameters.to_dict(flat=False)
for filter_name, filter_values in filter_criteria.items():
filter_name = filter_name.lower()
if filter_name in filter_map:
fields = filter_map[filter_name]
# Create conditions for each value
value_conditions = []
for value in filter_values:
# OR across fields for each value
field_conditions = [field == value for field in fields]
value_conditions.append(sqlalchemy.or_(*field_conditions))
# Combine all value conditions with OR
parameter_filters.append(sqlalchemy.or_(*value_conditions))
if parameter_filters:
# Combine all parameter filters with AND
query = query.filter(sqlalchemy.and_(*parameter_filters))
return query
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels