diff --git a/src/database/sparql_implementation.py b/src/database/sparql_implementation.py index 85f0d70..9cece32 100644 --- a/src/database/sparql_implementation.py +++ b/src/database/sparql_implementation.py @@ -191,19 +191,43 @@ def get_ui_mappings_by_curie(self, search_filter: SearchEntity) -> Iterable[dict row["object_id_curie"] = OBO_CURIE_CONVERTER.compress(row["object_id"]) yield row - def get_sssom_mappings_query(self, filter: Union[List[dict], None]) -> Iterable[Mapping]: + def get_mappings_by_filter(self, filter: Union[List[dict], None]) -> Iterable[dict]: + fields_list, fields_single = self._get_fields( + slots_type=self.schema_view.mapping_slots.copy() + ) + # Search for single value attributes default_query = self.add_filters( self.default_query( type=Mapping.class_class_uri, - slots=self.schema_view.mapping_slots.copy(), + slots=fields_single, ), filter, ) bindings = self._query(default_query) for row in bindings: r = self.transform_result(row) + # Search for multiple value attributes + for field in fields_list: + default_query_list = self.add_filters( + self.default_query( + type=Mapping.class_class_uri, + slots={field}, + subject=r["_x"], + ), + filter, + ) + results = self._query(default_query_list) + bindings_list = self.transform_result_list(results) + if len(bindings_list): + r[f"{field}"] = bindings_list r.pop("_x") - m = create_sssom_mapping(**r) + yield r + + def get_sssom_mappings_by_filter(self, filter: Union[List[dict], None]) -> Iterable[Mapping]: + bindings = self.get_mappings_by_filter(filter) + for row in bindings: + row.pop("uuid") + m = create_sssom_mapping(**row) if m is not None: yield m @@ -338,10 +362,18 @@ def get_mappings_field(imp: SparqlImpl, field: str, value: str) -> Iterable[Mapp def get_mappings_query(imp: SparqlImpl, filter: Union[List[dict], None]) -> Iterable[Mapping]: - mappings = imp.get_sssom_mappings_query(filter) + mappings = imp.get_sssom_mappings_by_filter(filter) return mappings +def get_mappings_by_filter_ui(imp: SparqlImpl, filter: Union[List[dict], None]) -> Iterable[dict]: + mappings = imp.get_mappings_by_filter(filter) + for m in mappings: + m["subject_id_curie"] = OBO_CURIE_CONVERTER.compress(m["subject_id"]) + m["object_id_curie"] = OBO_CURIE_CONVERTER.compress(m["object_id"]) + yield m + + def get_mapping_sets( request: Request, imp: SparqlImpl, filter: Union[List[dict], None] ) -> Iterable[dict]: diff --git a/src/routers/mappings.py b/src/routers/mappings.py index e03ac76..322dee0 100644 --- a/src/routers/mappings.py +++ b/src/routers/mappings.py @@ -6,6 +6,7 @@ from ..database.sparql_implementation import ( SparqlImpl, get_mapping_by_id, + get_mappings_by_filter_ui, get_mappings_field, get_mappings_query, get_ui_mapping_by_id, @@ -58,3 +59,17 @@ def mappings_by_field( @router_ui.get("/{id}", summary="Get mapping by id") def mapping_by_id_ui(id: str, sparqlImpl: SparqlImpl = Depends(get_sparql_implementation)): return get_ui_mapping_by_id(sparqlImpl, id) + + +@router_ui.get("/", summary="Get mappings with optional filters") +def mappings_ui( + sparqlImpl: SparqlImpl = Depends(get_sparql_implementation), + pagination: PaginationParams = Depends(), + filter: Union[List[str], None] = Query(default=None), +): + filter_parsed = parser_filter(Mapping, filter) + if filter_parsed is None: + raise HTTPException(status_code=302, detail="Not valid filter") + else: + results = get_mappings_by_filter_ui(sparqlImpl, filter_parsed) + return paginate(results, **pagination.dict())